From 6db27b035754e87bc2ad18a729ec312c8518c077 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 26 Mar 2016 21:55:08 -0300 Subject: [PATCH] test --- iguana/iguana777.h | 1 + iguana/iguana_bundles.c | 10 +++++-- iguana/iguana_ramchain.c | 44 ------------------------------ iguana/iguana_unspents.c | 59 ++++++++++++++++++++++++++++++++++++---- iguana/main.c | 5 ++-- 5 files changed, 64 insertions(+), 55 deletions(-) diff --git a/iguana/iguana777.h b/iguana/iguana777.h index 5a9462311..5f6ae1f52 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -825,6 +825,7 @@ void iguana_RTramchainfree(struct iguana_info *coin); void iguana_coinpurge(struct iguana_info *coin); int32_t iguana_setmaxbundles(struct iguana_info *coin); void iguana_bundlepurgefiles(struct iguana_info *coin,struct iguana_bundle *bp); +uint32_t iguana_sparseaddtx(uint8_t *bits,int32_t width,uint32_t tablesize,bits256 txid,struct iguana_txid *T,uint32_t txidind); extern int32_t HDRnet,netBLOCKS; diff --git a/iguana/iguana_bundles.c b/iguana/iguana_bundles.c index f148b31c7..cfca282c3 100755 --- a/iguana/iguana_bundles.c +++ b/iguana/iguana_bundles.c @@ -808,7 +808,11 @@ int32_t iguana_bundlefinish(struct iguana_info *coin,struct iguana_bundle *bp) } #endif for (i=0; ihdrsi; i++) - if ( (prevbp= coin->bundles[i]) == 0 || prevbp->emitfinish < coin->startutc ) + if ( (prevbp= coin->bundles[i]) == 0 || prevbp->emitfinish < coin->startutc +#ifdef IGUANA_SERIALIZE_SPENDVECTORGEN + || prevbp->utxofinish <= 1 +#endif + ) break; if ( i == bp->hdrsi ) { @@ -1141,7 +1145,7 @@ void iguana_bundlestats(struct iguana_info *coin,char *str) coin->spaceused = spaceused; coin->numverified = numv; char str4[65],str5[65]; - if ( firstgap != 0 && firstgap->hdrsi < coin->bundlescount-1 ) + if ( coin->isRT == 0 && firstgap != 0 && firstgap->hdrsi < coin->bundlescount-1 ) { if ( coin->stuckmonitor != (firstgap->hdrsi * coin->chain->bundlesize) + firstgap->numsaved ) { @@ -1149,6 +1153,8 @@ void iguana_bundlestats(struct iguana_info *coin,char *str) coin->stucktime = (uint32_t)time(NULL); } } + if ( coin->isRT != 0 || (firstgap != 0 && firstgap->hdrsi == coin->bundlescount-1) ) + coin->stucktime = 0; if ( coin->stucktime != 0 && time(NULL)-coin->stucktime > coin->maxstuck ) coin->maxstuck = (uint32_t)time(NULL) - coin->stucktime; sprintf(str,"%s.RT%d u.%d b.%d v.%d/%d (%d/%d 1st.%d) to %d N[%d] h.%d r.%d c.%s s.%d d.%d E.%d maxB.%d peers.%d/%d Q.(%d %d) L.%d [%d:%d] M.%d %s",coin->symbol,coin->RTheight,numutxo,numbalances,numv,coin->pendbalances,firstgap!=0?firstgap->numsaved:-1,firstgap!=0?firstgap->numhashes:-1,firstgap!=0?firstgap->hdrsi:-1,coin->lastpending!=0?coin->lastpending->hdrsi:0,count,numhashes,coin->blocksrecv,mbstr(str4,spaceused),numsaved,done,numemit,coin->MAXBUNDLES,p,coin->MAXPEERS,queue_size(&coin->priorityQ),queue_size(&coin->blocksQ),coin->longestchain,coin->blocks.hwmchain.height/coin->chain->bundlesize,coin->blocks.hwmchain.height%coin->chain->bundlesize,coin->blocks.hwmchain.height,bits256_str(str5,coin->blocks.hwmchain.RO.hash2)); diff --git a/iguana/iguana_ramchain.c b/iguana/iguana_ramchain.c index 3bd1dacb4..6426a87e7 100755 --- a/iguana/iguana_ramchain.c +++ b/iguana/iguana_ramchain.c @@ -212,50 +212,6 @@ void iguana_blocksetcounters(struct iguana_info *coin,struct iguana_block *block block->RO.firstexternalind = ramchain->externalind; } -struct iguana_txid *iguana_txidfind(struct iguana_info *coin,int32_t *heightp,struct iguana_txid *tx,bits256 txid,int32_t lasthdrsi) -{ - uint8_t *TXbits; struct iguana_txid *T; uint32_t txidind; int32_t i,j; - struct iguana_bundle *bp; struct iguana_ramchain *ramchain; struct iguana_block *block; - *heightp = -1; - if ( lasthdrsi < 0 ) - return(0); - for (i=lasthdrsi; i>=0; i--) - { - if ( (bp= coin->bundles[i]) != 0 && bp->emitfinish > coin->startutc ) - { - ramchain = &bp->ramchain; - if ( ramchain->H.data != 0 ) - { - TXbits = (void *)(long)((long)ramchain->H.data + ramchain->H.data->TXoffset); - T = (void *)(long)((long)ramchain->H.data + ramchain->H.data->Toffset); - //printf("search bp.%p TXbits.%p T.%p %d %d\n",bp,TXbits,T,(int32_t)ramchain->H.data->TXoffset,(int32_t)ramchain->H.data->Toffset); - if ( (txidind= iguana_sparseaddtx(TXbits,ramchain->H.data->txsparsebits,ramchain->H.data->numtxsparse,txid,T,0)) > 0 ) - { - //printf("found txidind.%d\n",txidind); - if ( bits256_cmp(txid,T[txidind].txid) == 0 ) - { - for (j=0; jn; j++) - if ( (block= bp->blocks[j]) != 0 && txidind >= block->RO.firsttxidind && txidind < block->RO.firsttxidind+block->RO.txn_count ) - break; - if ( j < bp->n ) - { - *heightp = bp->bundleheight + j; - //printf("found height.%d\n",*heightp); - *tx = T[txidind]; - return(tx); - } - for (j=0; jn; j++) - if ( (block= bp->blocks[j]) != 0 ) - printf("(%d %d).%d ",block->RO.firsttxidind,block->RO.txn_count,txidind >= block->RO.firsttxidind && txidind < block->RO.firsttxidind+block->RO.txn_count); - printf(" <- firsttxidind txidind.%d not in block range\n",txidind); - } else printf("mismatched sparse entry\n"); - } - } - } - } - return(0); -} - int32_t iguana_peerfname(struct iguana_info *coin,int32_t *hdrsip,char *dirname,char *fname,uint32_t ipbits,bits256 hash2,bits256 prevhash2,int32_t numblocks) { struct iguana_bundle *bp = 0; int32_t bundlei = -2; char str[65]; diff --git a/iguana/iguana_unspents.c b/iguana/iguana_unspents.c index aef497027..edd02ed77 100755 --- a/iguana/iguana_unspents.c +++ b/iguana/iguana_unspents.c @@ -121,6 +121,50 @@ int32_t iguana_volatileupdate(struct iguana_info *coin,int32_t incremental,struc return(-1); } +struct iguana_txid *iguana_txidfind(struct iguana_info *coin,int32_t *heightp,struct iguana_txid *tx,bits256 txid,int32_t lasthdrsi) +{ + uint8_t *TXbits; struct iguana_txid *T; uint32_t txidind; int32_t i,j; + struct iguana_bundle *bp; struct iguana_ramchain *ramchain; struct iguana_block *block; + *heightp = -1; + if ( lasthdrsi < 0 ) + return(0); + for (i=lasthdrsi; i>=0; i--) + { + if ( (bp= coin->bundles[i]) != 0 && bp->emitfinish > coin->startutc ) + { + ramchain = (bp->isRT != 0) ? &coin->RTramchain : &bp->ramchain; + if ( ramchain->H.data != 0 ) + { + TXbits = (void *)(long)((long)ramchain->H.data + ramchain->H.data->TXoffset); + T = (void *)(long)((long)ramchain->H.data + ramchain->H.data->Toffset); + //printf("search bp.%p TXbits.%p T.%p %d %d\n",bp,TXbits,T,(int32_t)ramchain->H.data->TXoffset,(int32_t)ramchain->H.data->Toffset); + if ( (txidind= iguana_sparseaddtx(TXbits,ramchain->H.data->txsparsebits,ramchain->H.data->numtxsparse,txid,T,0)) > 0 ) + { + //printf("found txidind.%d\n",txidind); + if ( bits256_cmp(txid,T[txidind].txid) == 0 ) + { + for (j=0; jn; j++) + if ( (block= bp->blocks[j]) != 0 && txidind >= block->RO.firsttxidind && txidind < block->RO.firsttxidind+block->RO.txn_count ) + break; + if ( j < bp->n ) + { + *heightp = bp->bundleheight + j; + //printf("found height.%d\n",*heightp); + *tx = T[txidind]; + return(tx); + } + for (j=0; jn; j++) + if ( (block= bp->blocks[j]) != 0 ) + printf("(%d %d).%d ",block->RO.firsttxidind,block->RO.txn_count,txidind >= block->RO.firsttxidind && txidind < block->RO.firsttxidind+block->RO.txn_count); + printf(" <- firsttxidind txidind.%d not in block range\n",txidind); + } else printf("mismatched sparse entry\n"); + } + } + } + } + return(0); +} + struct iguana_bundle *iguana_externalspent(struct iguana_info *coin,bits256 *prevhashp,uint32_t *unspentindp,struct iguana_ramchain *ramchain,int32_t spend_hdrsi,struct iguana_spend *s) { int32_t prev_vout,height,hdrsi; uint32_t sequenceid,unspentind; char str[65]; @@ -198,7 +242,7 @@ cJSON *iguana_unspentjson(struct iguana_info *coin,int32_t hdrsi,uint32_t unspen struct iguana_pkhash *iguana_pkhashfind(struct iguana_info *coin,struct iguana_ramchain **ramchainp,int64_t *balancep,uint32_t *lastunspentindp,struct iguana_pkhash *p,uint8_t rmd160[20],int32_t firsti,int32_t endi) { - uint8_t *PKbits; struct iguana_pkhash *P; uint32_t pkind,i; struct iguana_bundle *bp; struct iguana_ramchain *ramchain; struct iguana_account *ACCTS; + uint8_t *PKbits; struct iguana_pkhash *P; uint32_t pkind,numpkinds,i; struct iguana_bundle *bp; struct iguana_ramchain *ramchain; struct iguana_account *ACCTS; *balancep = 0; *ramchainp = 0; *lastunspentindp = 0; @@ -214,10 +258,11 @@ struct iguana_pkhash *iguana_pkhashfind(struct iguana_info *coin,struct iguana_r ramchain = (bp->isRT != 0) ? &bp->ramchain : &coin->RTramchain; if ( ramchain->H.data != 0 ) { + numpkinds = (bp->isRT != 0) ? ramchain->H.data->numpkinds : ramchain->pkind; PKbits = (void *)(long)((long)ramchain->H.data + ramchain->H.data->PKoffset); P = (void *)(long)((long)ramchain->H.data + ramchain->H.data->Poffset); ACCTS = (void *)(long)((long)ramchain->H.data + ramchain->H.data->Aoffset); - if ( (pkind= iguana_sparseaddpk(PKbits,ramchain->H.data->pksparsebits,ramchain->H.data->numpksparse,rmd160,P,0)) > 0 && pkind < ramchain->H.data->numpkinds ) + if ( (pkind= iguana_sparseaddpk(PKbits,ramchain->H.data->pksparsebits,ramchain->H.data->numpksparse,rmd160,P,0)) > 0 && pkind < numpkinds ) { *ramchainp = ramchain; *balancep = ACCTS[pkind].total; @@ -233,7 +278,7 @@ struct iguana_pkhash *iguana_pkhashfind(struct iguana_info *coin,struct iguana_r char *iguana_bundleaddrs(struct iguana_info *coin,int32_t hdrsi) { - uint8_t *PKbits; struct iguana_pkhash *P; uint32_t pkind; struct iguana_bundle *bp; struct iguana_ramchain *ramchain; cJSON *retjson; char rmdstr[41]; + uint8_t *PKbits; struct iguana_pkhash *P; uint32_t pkind,numpkinds; struct iguana_bundle *bp; struct iguana_ramchain *ramchain; cJSON *retjson; char rmdstr[41]; if ( (bp= coin->bundles[hdrsi]) != 0 ) { if ( bp->isRT != 0 && coin->RTramchain_busy != 0 ) @@ -244,10 +289,11 @@ char *iguana_bundleaddrs(struct iguana_info *coin,int32_t hdrsi) ramchain = (bp->isRT != 0) ? &bp->ramchain : &coin->RTramchain; if ( ramchain->H.data != 0 ) { + numpkinds = (bp->isRT != 0) ? ramchain->H.data->numpkinds : ramchain->pkind; retjson = cJSON_CreateArray(); PKbits = (void *)(long)((long)ramchain->H.data + ramchain->H.data->PKoffset); P = (void *)(long)((long)ramchain->H.data + ramchain->H.data->Poffset); - for (pkind=0; pkindH.data->numpkinds; pkind++,P++) + for (pkind=0; pkindrmd160,20); jaddistr(retjson,rmdstr); @@ -259,7 +305,7 @@ char *iguana_bundleaddrs(struct iguana_info *coin,int32_t hdrsi) } return(clonestr("{\"error\":\"no bundle\"}")); } -int64_t iguana_pkhashbalance(struct iguana_info *coin,cJSON *array,int64_t *spentp,int32_t *nump,struct iguana_ramchain *ramchain,struct iguana_pkhash *p,uint32_t lastunspentind,uint8_t rmd160[20],char *coinaddr,uint8_t *pubkey33,int32_t hdrsi) +int64_t iguana_pkhashbalance(struct iguana_info *coin,cJSON *array,int64_t *spentp,int32_t *nump,struct iguana_ramchain *ramchain,struct iguana_pkhash *p,uint32_t lastunspentind,uint8_t rmd160[20],char *coinaddr,uint8_t *pubkey33,int32_t hdrsi,int32_t height) { struct iguana_unspent *U; uint32_t unspentind; int64_t balance = 0; struct iguana_txid *T; *spentp = *nump = 0; @@ -280,6 +326,7 @@ int64_t iguana_pkhashbalance(struct iguana_info *coin,cJSON *array,int64_t *spen { (*nump)++; printf("%s u.%d %.8f\n",jprint(iguana_unspentjson(coin,hdrsi,unspentind,T,&U[unspentind],rmd160,coinaddr,pubkey33),1),unspentind,dstr(U[unspentind].value)); + //if ( iguana_spentflag(coin,ramchain,unspentind,height) == 0 ) if ( ramchain->Uextras[unspentind].spentflag == 0 ) { balance += U[unspentind].value; @@ -303,7 +350,7 @@ int32_t iguana_pkhasharray(struct iguana_info *coin,cJSON *array,int32_t minconf { if ( iguana_pkhashfind(coin,&ramchain,&balance,&lastunspentind,&P[n],rmd160,i,i) != 0 ) { - if ( (netbalance= iguana_pkhashbalance(coin,array,&spent,&m,ramchain,&P[n],lastunspentind,rmd160,coinaddr,pubkey33,i)) != balance-spent ) + if ( (netbalance= iguana_pkhashbalance(coin,array,&spent,&m,ramchain,&P[n],lastunspentind,rmd160,coinaddr,pubkey33,i,0)) != balance-spent ) { printf("pkhash balance mismatch from m.%d check %.8f vs %.8f spent %.8f [%.8f]\n",m,dstr(netbalance),dstr(balance),dstr(spent),dstr(balance)-dstr(spent)); } diff --git a/iguana/main.c b/iguana/main.c index 43684362a..d536b4442 100755 --- a/iguana/main.c +++ b/iguana/main.c @@ -375,9 +375,9 @@ void mainloop(struct supernet_info *myinfo) } if ( (bp= coin->current) != 0 && coin->stucktime != 0 && coin->isRT == 0 && coin->RTheight == 0 && (time(NULL) - coin->stucktime) > coin->MAXSTUCKTIME ) { - printf("%s is stuck too long, restarting\n",coin->symbol); if ( bp->emitfinish == 0 ) { + printf("%s is stuck too long, purging files for %d\n",coin->symbol,bp->hdrsi); iguana_bundlepurgefiles(coin,bp); for (j=0; jn; j++) if ( (block= bp->blocks[j]) != 0 ) @@ -386,9 +386,8 @@ void mainloop(struct supernet_info *myinfo) block->RO.recvlen = 0; block->fpos = -1; } + sleep(5); } - //iguana_coinpurge(coin); - sleep(5); } coin->RTramchain_busy = (coin->RTgenesis == 0 || queue_size(&balancesQ) != 0); }