diff --git a/iguana/iguana777.h b/iguana/iguana777.h index b70161196..e9c96c6e8 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -842,7 +842,7 @@ int32_t iguana_ramchain_iterate(struct iguana_info *coin,struct iguana_ramchain void *iguana_bundlefile(struct iguana_info *coin,char *fname,long *filesizep,struct iguana_bundle *bp,int32_t bundlei); int32_t iguana_mapchaininit(char *fname,struct iguana_info *coin,struct iguana_ramchain *mapchain,struct iguana_bundle *bp,int32_t bundlei,struct iguana_block *block,void *ptr,long filesize); void iguana_autoextend(struct iguana_info *coin,struct iguana_bundle *bp); -void iguana_RTramchainfree(struct iguana_info *coin); +void iguana_RTramchainfree(struct iguana_info *coin,struct iguana_bundle *bp); 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); diff --git a/iguana/iguana_init.c b/iguana/iguana_init.c index 5ffffc3e2..ba503dd88 100755 --- a/iguana/iguana_init.c +++ b/iguana/iguana_init.c @@ -438,7 +438,7 @@ void iguana_coinpurge(struct iguana_info *coin) myfree(req,req->allocsize); } } - iguana_RTramchainfree(coin); + iguana_RTramchainfree(coin,coin->current); coin->bundlescount = 0; for (i=0; ibundlescount; i++) if ( (bp= coin->bundles[i]) != 0 ) diff --git a/iguana/iguana_ramchain.c b/iguana/iguana_ramchain.c index 8ff6e07fa..9bc67b448 100755 --- a/iguana/iguana_ramchain.c +++ b/iguana/iguana_ramchain.c @@ -1967,7 +1967,7 @@ long iguana_ramchain_data(struct iguana_info *coin,struct iguana_peer *addr,stru } else { - printf("ramchain verification error.%d hdrsi.%d bundlei.%d\n",err,bp->hdrsi,bundlei); + printf("ramchain verification error.%d hdrsi.%d bundlei.%d n.%d\n",err,bp->hdrsi,bundlei,bp->n); fpos = -1; } } diff --git a/iguana/iguana_unspents.c b/iguana/iguana_unspents.c index 57e46f319..4b87138e0 100755 --- a/iguana/iguana_unspents.c +++ b/iguana/iguana_unspents.c @@ -222,7 +222,7 @@ int32_t iguana_volatilesmap(struct iguana_info *coin,struct iguana_ramchain *ram } else { - printf("ramchain map error balanceswritten %d vs %d hashes %x %x\n",coin->balanceswritten,numhdrsi,coin->balancehash.uints[0],balancehash.uints[0]); + printf("ramchain.[%d] map error balanceswritten %d vs %d hashes %x %x\n",ramchain->H.data->height,coin->balanceswritten,numhdrsi,coin->balancehash.uints[0],balancehash.uints[0]); err++; OS_removefile(fname,0); } @@ -1254,7 +1254,6 @@ int32_t iguana_volatilesinit(struct iguana_info *coin) struct sha256_vstate vstate,bstate; int32_t i,from_ro,numpkinds,numunspents; struct iguana_bundle *bp; struct iguana_block *block; uint32_t crc,filecrc; FILE *fp; char crcfname[512],str[65],str2[65],buf[2048]; from_ro = 1; - printf("volatile init\n"); for (i=0; ibalanceswritten; i++) { if ( (bp= coin->bundles[i]) == 0 || bp->emitfinish <= 1 || (i > 0 && bp->utxofinish <= 1) ) @@ -1541,9 +1540,9 @@ int32_t iguana_balanceflush(struct iguana_info *coin,int32_t refhdrsi) } exit(-1); } - //iguana_coinpurge(coin); coin->balanceswritten = iguana_volatilesinit(coin); - iguana_RTramchainfree(coin); + printf("flush free\n"); + iguana_RTramchainfree(coin,bp); return(coin->balanceswritten); } @@ -1678,13 +1677,15 @@ int32_t iguana_convert(struct iguana_info *coin,int32_t helperid,struct iguana_b return(converted); } -void iguana_RTramchainfree(struct iguana_info *coin) +void iguana_RTramchainfree(struct iguana_info *coin,struct iguana_bundle *bp) { printf("free RTramchain\n"); iguana_utxoupdate(coin,-1,0,0,0,0,-1); // free hashtables coin->RTheight = coin->balanceswritten * coin->chain->bundlesize; coin->RTgenesis = 0; iguana_ramchain_free(coin,&coin->RTramchain,1); + //if ( bp != 0 ) + // bp->ramchain = coin->RTramchain; iguana_mempurge(&coin->RTmem); iguana_mempurge(&coin->RThashmem); coin->RTdatabad = 0; @@ -1736,13 +1737,13 @@ void iguana_RTramchainalloc(char *fname,struct iguana_info *coin,struct iguana_b { printf("RTramchain changed %d bundlei.%d | coin->RTheight %d != %d bp->bundleheight + %d coin->RTramchain.H.data->numblocks\n",coin->RTheight,i,coin->RTheight,bp->bundleheight,dest->H.data->numblocks); //coin->RTheight = coin->balanceswritten * coin->chain->bundlesize; - iguana_RTramchainfree(coin); + iguana_RTramchainfree(coin,bp); } } if ( coin->RTramchain.H.data == 0 ) { printf("ALLOC RTramchain\n"); - iguana_RTramchainfree(coin); + iguana_RTramchainfree(coin,bp); iguana_ramchainopen(fname,coin,dest,&coin->RTmem,&coin->RThashmem,bp->bundleheight,bp->hashes[0]); dest->H.txidind = dest->H.unspentind = dest->H.spendind = dest->pkind = dest->H.data->firsti; dest->externalind = dest->H.stacksize = 0; @@ -1810,7 +1811,7 @@ void iguana_RTspendvectors(struct iguana_info *coin,struct iguana_bundle *bp) if ( iguana_spendvectors(coin,bp,&coin->RTramchain,coin->RTstarti,lasti,0) < 0 ) { printf("RTutxo error -> RTramchainfree\n"); - iguana_RTramchainfree(coin); + iguana_RTramchainfree(coin,bp); return; } else @@ -1842,7 +1843,7 @@ int32_t iguana_realtime_update(struct iguana_info *coin) return(0); for (i=0; ibundlescount-1; i++) { - if ( (bp= coin->bundles[i]) != 0 && bp->utxofinish == 0 ) + if ( (bp= coin->bundles[i]) != 0 && (i > 0 && bp->utxofinish == 0) ) { if ( iguana_spendvectors(coin,bp,&bp->ramchain,0,bp->n,0) < 0 ) { @@ -1854,7 +1855,7 @@ int32_t iguana_realtime_update(struct iguana_info *coin) } if ( (bp= coin->current) != 0 && coin->RTdatabad != 0 ) { - iguana_RTramchainfree(coin); + iguana_RTramchainfree(coin,bp); iguana_RTramchainalloc("RTbundle",coin,bp); } // printf("balanceswritten.%d hdrsi.%d RTheight.%d\n",coin->balanceswritten,bp->hdrsi,coin->RTheight); @@ -1899,11 +1900,7 @@ int32_t iguana_realtime_update(struct iguana_info *coin) while ( (rdata= coin->RTramchain.H.data) != 0 && coin->RTheight <= coin->blocks.hwmchain.height ) { if ( coin->RTdatabad != 0 ) - { - iguana_RTramchainfree(coin); - iguana_RTramchainalloc("RTbundle",coin,bp); - return(-1); - } + break; dest = &coin->RTramchain; B = (void *)(long)((long)rdata + rdata->Boffset); bundlei = (coin->RTheight % coin->chain->bundlesize); @@ -1972,7 +1969,8 @@ int32_t iguana_realtime_update(struct iguana_info *coin) printf("<<<< flag.%d RT.%d:%d hwm.%d L.%d T.%d U.%d S.%d P.%d X.%d -> size.%ld\n",flag,coin->RTheight,n,coin->blocks.hwmchain.height,coin->longestchain,dest->H.txidind,dest->H.unspentind,dest->H.spendind,dest->pkind,dest->externalind,dest->H.data!=0?(long)dest->H.data->allocsize:-1); if ( coin->RTdatabad != 0 ) { - iguana_RTramchainfree(coin); + printf("databad\n"); + iguana_RTramchainfree(coin,bp); iguana_RTramchainalloc("RTbundle",coin,bp); } return(flag);