From 2d4bdac755588d8878c540432d4935245a9d5554 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 17 Aug 2016 10:17:11 -0300 Subject: [PATCH] test --- iguana/iguana_bundles.c | 4 ++- iguana/iguana_realtime.c | 38 +++++++++++---------- iguana/iguana_recv.c | 5 +-- iguana/iguana_unspents.c | 70 ++++++++++++++++++++++----------------- includes/iguana_funcs.h | 2 +- includes/iguana_structs.h | 2 +- 6 files changed, 68 insertions(+), 53 deletions(-) diff --git a/iguana/iguana_bundles.c b/iguana/iguana_bundles.c index e45e9eefa..7da6a2191 100755 --- a/iguana/iguana_bundles.c +++ b/iguana/iguana_bundles.c @@ -221,10 +221,12 @@ int32_t iguana_bundlehash2add(struct iguana_info *coin,struct iguana_block **blo printf("bp.[%d]->blocks[%d] mismatch %p != %p\n",bp->hdrsi,bundlei,bp->blocks[bundlei],block); if ( coin->RTheight > 0 && bp->bundleheight+bundlei > coin->firstRTheight ) { + if ( bundlei > 0 ) + bundlei--; if ( (block= iguana_blockfind("reset",coin,bp->hashes[0])) != 0 ) { - printf("RESET HWM to %d\n",coin->firstRTheight); iguana_blockzcopy(coin->chain->zcash,(void *)&coin->blocks.hwmchain,block); + printf("RESET HWM to %d ht.%d\n",bp->bundleheight+bundlei,block->height); return(-1); } } diff --git a/iguana/iguana_realtime.c b/iguana/iguana_realtime.c index af6ce89d5..06e9f016c 100755 --- a/iguana/iguana_realtime.c +++ b/iguana/iguana_realtime.c @@ -501,37 +501,41 @@ void iguana_RTreset(struct iguana_info *coin) void iguana_RTunmap(uint8_t *ptr,uint32_t len) { - munmap(&ptr[-sizeof(len)],len+sizeof(len)); + OS_releasemap(&ptr[-sizeof(len)],len+sizeof(len)); } -void *iguana_RTrawdata(struct iguana_info *coin,bits256 hash2,uint8_t *data,int32_t *recvlenp) +void *iguana_RTrawdata(struct iguana_info *coin,bits256 hash2,uint8_t *data,int32_t *recvlenp,int32_t *numtxp) { - FILE *fp; char fname[1024],str[65]; long filesize; uint8_t *ptr; uint32_t i,nonz,checklen; + FILE *fp; char fname[1024],str[65]; long filesize; uint8_t *ptr; uint32_t i,nonz,checknumtx,checklen; sprintf(fname,"%s/%s/RT/%s.raw",GLOBAL_TMPDIR,coin->symbol,bits256_str(str,hash2)); OS_compatible_path(fname); if ( *recvlenp > 0 ) { if ( (fp= fopen(fname,"wb")) != 0 ) { - if ( fwrite(recvlenp,1,sizeof(*recvlenp),fp) != sizeof(*recvlenp) || fwrite(data,1,*recvlenp,fp) != *recvlenp ) - printf("error writing %s len.%d\n",bits256_str(str,hash2),*recvlenp); + if ( fwrite(recvlenp,1,sizeof(*recvlenp),fp) != sizeof(*recvlenp) || fwrite(numtxp,1,sizeof(*numtxp),fp) != sizeof(*numtxp) || fwrite(data,1,*recvlenp,fp) != *recvlenp ) + printf("error writing %s len.%d numtx.%d\n",bits256_str(str,hash2),*recvlenp,*numtxp); fclose(fp); //printf("created %s\n",fname); } else printf("couldnt create %s\n",fname); } else if ( *recvlenp == 0 ) { + if ( numtxp != 0 ) + *numtxp = 0; if ( (ptr= OS_mapfile(fname,&filesize,0)) != 0 ) { memcpy(&checklen,ptr,sizeof(checklen)); - if ( checklen == (int32_t)(filesize - sizeof(checklen)) ) + memcpy(&checknumtx,&ptr[sizeof(checklen)],sizeof(checknumtx)); + if ( checklen == (int32_t)(filesize - sizeof(checklen)) && checknumtx == *numtxp ) { for (i=nonz=0; ichain->bundlesize*10); for (height=lastheight-coin->chain->bundlesize*10; heightchain->bundlesize); bundlei = (height % coin->chain->bundlesize); if ( (bp= coin->bundles[hdrsi]) != 0 && bits256_nonz(bp->hashes[bundlei]) != 0 ) - iguana_RTrawdata(coin,bp->hashes[bundlei],0,&recvlen); + iguana_RTrawdata(coin,bp->hashes[bundlei],0,&recvlen,&numtx); // delete file } printf("end RTpurge.%d\n",lastheight); } void iguana_RTiterate(struct iguana_info *coin,int32_t offset,struct iguana_block *block,int64_t polarity) { - struct iguana_txblock txdata; uint8_t *serialized; int32_t n,len; uint32_t recvlen = 0; - if ( (serialized= coin->RTrawdata[offset]) == 0 || (recvlen= coin->RTrecvlens[offset]) == 0 ) + struct iguana_txblock txdata; uint8_t *serialized; int32_t n,numtx,len; uint32_t recvlen = 0; + if ( (numtx= coin->RTnumtx[offset]) == 0 || (serialized= coin->RTrawdata[offset]) == 0 || (recvlen= coin->RTrecvlens[offset]) == 0 ) { - printf("cant load from tmpdir ht.%d polarity.%lld\n",block->height,(long long)polarity); + printf("cant load from tmpdir ht.%d polarity.%lld numtx.%d\n",block->height,(long long)polarity,coin->RTnumtx[offset]); return; } memset(&txdata,0,sizeof(txdata)); @@ -573,8 +577,8 @@ void iguana_RTiterate(struct iguana_info *coin,int32_t offset,struct iguana_bloc iguana_memreset(&coin->RTrawmem), iguana_memreset(&coin->RTmem), iguana_memreset(&coin->RThashmem); if ( (n= iguana_gentxarray(coin,&coin->RTrawmem,&txdata,&len,serialized,recvlen)) > 0 ) { - iguana_RTramchaindata(coin,&coin->RTmem,&coin->RThashmem,polarity,block,coin->RTrawmem.ptr,block->RO.txn_count); - } else printf("gentxarray n.%d RO.txn_count.%d recvlen.%d\n",n,block->RO.txn_count,recvlen); + iguana_RTramchaindata(coin,&coin->RTmem,&coin->RThashmem,polarity,block,coin->RTrawmem.ptr,numtx); + } else printf("gentxarray n.%d RO.txn_count.%d recvlen.%d\n",n,numtx,recvlen); } struct iguana_block *iguana_RTblock(struct iguana_info *coin,int32_t height) @@ -596,7 +600,7 @@ void iguana_RTblockadd(struct iguana_info *coin,struct iguana_block *block) offset = block->height - coin->firstRTheight; printf("%s RTblockadd.%d offset.%d\n",coin->symbol,block->height,offset); if ( coin->RTrawdata[offset] == 0 ) - coin->RTrawdata[offset] = iguana_RTrawdata(coin,block->RO.hash2,0,&coin->RTrecvlens[offset]); + coin->RTrawdata[offset] = iguana_RTrawdata(coin,block->RO.hash2,0,&coin->RTrecvlens[offset],&coin->RTnumtx[offset]); coin->RTblocks[offset] = block; iguana_RTiterate(coin,offset,block,1); } diff --git a/iguana/iguana_recv.c b/iguana/iguana_recv.c index 0fea12557..de059258c 100755 --- a/iguana/iguana_recv.c +++ b/iguana/iguana_recv.c @@ -310,7 +310,7 @@ void iguana_bundletime(struct iguana_info *coin,struct iguana_bundle *bp,int32_t void iguana_gotblockM(struct iguana_info *coin,struct iguana_peer *addr,struct iguana_txblock *origtxdata,struct iguana_msgtx *txarray,struct iguana_msghdr *H,uint8_t *data,int32_t recvlen) { - struct iguana_bundlereq *req; struct iguana_txblock *txdata = 0; int32_t valid,speculative=0,i,j,bundlei,copyflag; struct iguana_block *block; struct iguana_bundle *bp; uint32_t now; char str[65]; + struct iguana_bundlereq *req; struct iguana_txblock *txdata = 0; int32_t valid,speculative=0,i,j,bundlei,copyflag,numtx; struct iguana_block *block; struct iguana_bundle *bp; uint32_t now; char str[65]; if ( recvlen < 0 || recvlen > IGUANA_MAXPACKETSIZE ) { printf("iguana_getblockM: illegal recvlen.%d\n",recvlen); @@ -495,7 +495,8 @@ void iguana_gotblockM(struct iguana_info *coin,struct iguana_peer *addr,struct i }*/ } //else printf("cant save block\n"); } - iguana_RTrawdata(coin,txdata->zblock.RO.hash2,data,&recvlen); + numtx = origtxdata->zblock.RO.txn_count; + iguana_RTrawdata(coin,txdata->zblock.RO.hash2,data,&recvlen,&numtx); req->zblock = txdata->zblock; if ( coin->virtualchain != 0 ) printf("%s recvlen.%d ipbits.%x prev.(%s)\n",coin->symbol,req->zblock.RO.recvlen,req->zblock.fpipbits,bits256_str(str,txdata->zblock.RO.prev_block)); diff --git a/iguana/iguana_unspents.c b/iguana/iguana_unspents.c index 3c4bc5147..460a601db 100755 --- a/iguana/iguana_unspents.c +++ b/iguana/iguana_unspents.c @@ -939,7 +939,7 @@ struct iguana_utxoaddr *iguana_utxoaddrfind(int32_t createflag,struct iguana_inf return(utxoaddr); } -int64_t iguana_bundle_unspents(struct iguana_info *coin,struct iguana_bundle *bp,int32_t maketable,struct iguana_utxoaddr **prevp) +int64_t iguana_bundle_unspents(struct iguana_info *coin,struct iguana_bundle *bp,struct iguana_utxoaddr **prevp) { struct iguana_utxoaddr *utxoaddr; uint32_t unspentind,pkind; struct iguana_ramchaindata *rdata=0; struct iguana_pkhash *P; struct iguana_unspent *U; struct iguana_utxo *U2=0; int64_t value,balance = 0; if ( bp == 0 || (rdata= bp->ramchain.H.data) == 0 || (U2= bp->ramchain.Uextras) == 0 ) @@ -960,21 +960,18 @@ int64_t iguana_bundle_unspents(struct iguana_info *coin,struct iguana_bundle *bp else { balance += value; - if ( maketable != 0 ) + if ( (pkind= U[unspentind].pkind) < rdata->numpkinds && pkind > 0 ) { - if ( (pkind= U[unspentind].pkind) < rdata->numpkinds && pkind > 0 ) + if ( (utxoaddr= iguana_utxoaddrfind(1,coin,bp->hdrsi,pkind,P[pkind].rmd160,prevp)) != 0 ) { - if ( (utxoaddr= iguana_utxoaddrfind(1,coin,bp->hdrsi,pkind,P[pkind].rmd160,prevp)) != 0 ) - { - //printf("%.8f ",dstr(value)); - utxoaddr->histbalance += value; - } - else printf("cant find pkind.%u for unspentind.%u hdrsi.%d\n",pkind,unspentind,bp->hdrsi); - } else printf("illegal pkind.%u for unspentind.%u hdrsi.%d\n",pkind,unspentind,bp->hdrsi); - } + //printf("%.8f ",dstr(value)); + utxoaddr->histbalance += value; + } else printf("cant find pkind.%u for unspentind.%u hdrsi.%d\n",pkind,unspentind,bp->hdrsi); + } else printf("illegal pkind.%u for unspentind.%u hdrsi.%d\n",pkind,unspentind,bp->hdrsi); } } // else printf("[%d] u%u spent %.8f\n",bp->hdrsi,unspentind,dstr(value)); } + printf("[%d %.8f] ",bp->hdrsi,dstr(balance)); return(balance); } @@ -1003,25 +1000,6 @@ static int _utxoaddr_cmp(const void *a,const void *b) #undef item_b } -void iguana_utxoaddr_purge(struct iguana_info *coin) -{ - struct iguana_utxoaddr *utxoaddr,*tmp; - if ( coin->utxoaddrs != 0 ) - { - printf("free %s utxoaddrs\n",coin->symbol); - HASH_ITER(hh,coin->utxoaddrs,utxoaddr,tmp) - { - if ( utxoaddr != 0 ) - { - HASH_DELETE(hh,coin->utxoaddrs,utxoaddr); - free(utxoaddr); - } - } - coin->utxoaddrs = 0; - } - memset(coin->utxoaddrhash.bytes,0,sizeof(coin->utxoaddrhash)); -} - int32_t iguana_utxoaddr_save(struct iguana_info *coin,char *fname,int64_t balance,uint32_t *counts,uint32_t *offsets,uint8_t *table) { FILE *fp; bits256 hash; int32_t retval = -1; @@ -1084,6 +1062,36 @@ int32_t iguana_utxoaddr_map(struct iguana_info *coin,char *fname) return(0); } +void iguana_utxoaddr_purge(struct iguana_info *coin) +{ + struct iguana_utxoaddr *utxoaddr,*tmp; + if ( coin->utxoaddrs != 0 ) + { + printf("free %s utxoaddrs\n",coin->symbol); + HASH_ITER(hh,coin->utxoaddrs,utxoaddr,tmp) + { + if ( utxoaddr != 0 ) + { + HASH_DELETE(hh,coin->utxoaddrs,utxoaddr); + free(utxoaddr); + } + } + coin->utxoaddrs = 0; + } + if ( coin->utxoaddrfileptr != 0 ) + { + OS_releasemap(coin->utxoaddrfileptr,coin->utxoaddrfilesize); + coin->utxoaddrfileptr = 0; + coin->utxoaddrtable = 0; + coin->utxoaddroffsets = 0; + } + memset(coin->utxoaddrhash.bytes,0,sizeof(coin->utxoaddrhash)); + coin->histbalance = 0; + coin->utxoaddrlastcount = 0; + coin->utxoaddrind = 0; + coin->utxoaddrfilesize = 0; +} + int32_t iguana_utxoaddr_check(struct supernet_info *myinfo,struct iguana_info *coin,int32_t lastheight,int64_t *unspents,int32_t max,struct iguana_utxoaddr *utxoaddr) { static int32_t good,bad; @@ -1203,7 +1211,7 @@ int64_t iguana_utxoaddr_gen(struct supernet_info *myinfo,struct iguana_info *coi { if ( (bp= coin->bundles[hdrsi]) != 0 && bp->bundleheight < maxheight ) { - balance += iguana_bundle_unspents(coin,bp,1,&last); + balance += iguana_bundle_unspents(coin,bp,&last); fprintf(stderr,"(%d %.8f) ",hdrsi,dstr(balance)); height = bp->bundleheight + bp->n; } diff --git a/includes/iguana_funcs.h b/includes/iguana_funcs.h index de588505d..b2ae6ac81 100755 --- a/includes/iguana_funcs.h +++ b/includes/iguana_funcs.h @@ -544,7 +544,7 @@ void iguana_RTtxid(struct iguana_info *coin,struct iguana_block *block,int64_t p void iguana_RTspend(struct iguana_info *coin,struct iguana_block *block,int64_t polarity,bits256 txid,int32_t vini,bits256 prev_hash,int32_t prev_vout); void iguana_RTunspent(struct iguana_info *coin,struct iguana_block *block,int64_t polarity,char *coinaddr,uint8_t *rmd160,bits256 txid,int32_t vout,int64_t value); void iguana_RTnewblock(struct iguana_info *coin,struct iguana_block *block); -void *iguana_RTrawdata(struct iguana_info *coin,bits256 hash2,uint8_t *data,int32_t *recvlenp); +void *iguana_RTrawdata(struct iguana_info *coin,bits256 hash2,uint8_t *data,int32_t *recvlenp,int32_t *numtxp); void iguana_RTramchainalloc(char *fname,struct iguana_info *coin,struct iguana_bundle *bp); void iguana_update_balances(struct iguana_info *coin); void iguana_RTspendvectors(struct supernet_info *myinfo,struct iguana_info *coin,struct iguana_bundle *bp); diff --git a/includes/iguana_structs.h b/includes/iguana_structs.h index a01ce1413..d9f90988a 100755 --- a/includes/iguana_structs.h +++ b/includes/iguana_structs.h @@ -428,7 +428,7 @@ struct iguana_info int64_t histbalance,RTcredits,RTdebits; void *utxoaddrfileptr; long utxoaddrfilesize; uint32_t utxoaddrlastcount,*utxoaddroffsets; uint8_t *utxoaddrtable; bits256 utxoaddrhash; - struct iguana_block *RTblocks[65536]; uint8_t *RTrawdata[65536]; int32_t RTrecvlens[65536]; + struct iguana_block *RTblocks[65536]; uint8_t *RTrawdata[65536]; int32_t RTrecvlens[65536],RTnumtx[65536]; }; struct vin_signer { bits256 privkey; char coinaddr[64]; uint8_t siglen,sig[80],rmd160[20],pubkey[66]; };