int32_t ramchain_resume(char *retbuf,int32_t maxlen,struct coin777 *coin,struct ramchain *ramchain,cJSON *argjson,uint32_t startblocknum,uint32_t endblocknum) { ramchain->RTblocknum = _get_RTheight(&ramchain->lastgetinfo,coin->name,coin->serverport,coin->userpass,ramchain->RTblocknum); if ( ramchain->DBs.ctl == 0 ) ramchain_prepare(coin,ramchain); ramchain->readyflag = 1; ramchain->paused = 0; return(0); }
int32_t ramchain_init(char *retbuf,int32_t maxlen,struct coin777 *coin,struct ramchain *ramchain,cJSON *argjson,char *coinstr,char *serverport,char *userpass,uint32_t startblocknum,uint32_t endblocknum,uint32_t minconfirms) { coin->minconfirms = minconfirms; printf("(%s %s %s) vs (%s %s %s)\n",coinstr,serverport,userpass,coin->name,coin->serverport,coin->userpass); ramchain->syncfreq = 10000; ramchain->startblocknum = startblocknum, ramchain->endblocknum = endblocknum; ramchain->RTblocknum = _get_RTheight(&ramchain->lastgetinfo,coin->name,coin->serverport,coin->userpass,ramchain->RTblocknum); if ( endblocknum == 0 ) ramchain->endblocknum = endblocknum = 1000000000; return(ramchain_resume(retbuf,maxlen,coin,ramchain,argjson,startblocknum,endblocknum)); }
uint32_t ramchain_prepare(struct coin777 *coin,struct ramchain *ramchain) { uint32_t txidind,addrind,scriptind,numrawvouts,numrawvins,timestamp,totaladdrtx; uint64_t credits,debits; ramchain->startmilli = milliseconds(); if ( ramchain->DBs.ctl == 0 ) { ramchain->paused = 1; ramchain->RTblocknum = _get_RTheight(&ramchain->lastgetinfo,coin->name,coin->serverport,coin->userpass,ramchain->RTblocknum); coin777_initDBenv(coin); ramchain->startblocknum = coin777_startblocknum(coin,-1); printf("startblocknum.%u\n",ramchain->startblocknum); if ( coin777_getinds(coin,ramchain->startblocknum,&credits,&debits,×tamp,&txidind,&numrawvouts,&numrawvins,&addrind,&scriptind,&totaladdrtx) == 0 ) { coin777_initmmap(coin,ramchain->startblocknum,txidind,addrind,scriptind,numrawvouts,numrawvins,totaladdrtx); printf("t%u u%u s%u a%u c%u x%u initialized in %.3f seconds\n",txidind,numrawvouts,numrawvins,addrind,scriptind,totaladdrtx,(milliseconds() - ramchain->startmilli)/1000.); coin777_verify(coin,numrawvouts,numrawvins,credits,debits,addrind,1,&totaladdrtx); } ramchain->paused = 0; } return(ramchain->startblocknum); }
int32_t ramchain_update(struct coin777 *coin,struct ramchain *ramchain) { uint32_t blocknum; int32_t lag,syncflag,flag = 0; //double startmilli; struct alloc_space MEM; blocknum = ramchain->blocknum; if ( (lag= (ramchain->RTblocknum - blocknum)) < 1000 ) ramchain->RTmode = 1; if ( ramchain->RTmode != 0 || (blocknum % 100) == 0 ) ramchain->RTblocknum = _get_RTheight(&ramchain->lastgetinfo,coin->name,coin->serverport,coin->userpass,ramchain->RTblocknum); if ( lag < DB777_MATRIXROW*10 && ramchain->syncfreq > DB777_MATRIXROW ) ramchain->syncfreq = DB777_MATRIXROW; else if ( lag < DB777_MATRIXROW && ramchain->syncfreq > DB777_MATRIXROW/10 ) ramchain->syncfreq = DB777_MATRIXROW/10; else if ( strcmp(ramchain->DBs.coinstr,"BTC") == 0 && lag < DB777_MATRIXROW/10 && ramchain->syncfreq > DB777_MATRIXROW/100 ) ramchain->syncfreq = DB777_MATRIXROW/100; if ( ramchain->paused < 10 ) { syncflag = (((blocknum % ramchain->syncfreq) == 0) || (ramchain->needbackup != 0) || (blocknum % DB777_MATRIXROW) == 0); if ( blocknum >= ramchain->endblocknum || ramchain->paused != 0 ) { if ( blocknum >= ramchain->endblocknum ) ramchain->paused = 3, syncflag = 2; printf("ramchain.%s blocknum.%d <<< PAUSING paused.%d | endblocknum.%u\n",ramchain->DBs.coinstr,blocknum,ramchain->paused,ramchain->endblocknum); } if ( coin->minconfirms == 0 ) coin->minconfirms = (strcmp("BTC",coin->name) == 0) ? 3 : 10; if ( blocknum <= (ramchain->RTblocknum - coin->minconfirms) ) flag = coin777_parse(coin,ramchain->RTblocknum,syncflag * (blocknum != 0),coin->minconfirms); if ( ramchain->paused == 3 ) { //ledger_free(ramchain->activeledger,1), ramchain->activeledger = 0; printf("STOPPED\n"); } if ( blocknum > ramchain->endblocknum || ramchain->paused != 0 ) ramchain->paused = 10; } return(flag); }