From 1233a5b5c56e0ab092a31b1e7dc1820b9e48e732 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 18 Aug 2016 04:01:11 -0300 Subject: [PATCH] test --- basilisk/basilisk_bitcoin.c | 2 +- iguana/iguana_bundles.c | 2 +- iguana/iguana_msg.c | 4 ++-- iguana/iguana_peers.c | 8 ++++---- iguana/iguana_realtime.c | 40 +++++++++++++++++++++++++++---------- iguana/iguana_recv.c | 38 ++++++++++++++++++++--------------- includes/iguana_funcs.h | 8 ++++---- 7 files changed, 64 insertions(+), 38 deletions(-) diff --git a/basilisk/basilisk_bitcoin.c b/basilisk/basilisk_bitcoin.c index ee8670a30..d52ce2f31 100755 --- a/basilisk/basilisk_bitcoin.c +++ b/basilisk/basilisk_bitcoin.c @@ -266,7 +266,7 @@ int32_t basilisk_bitcoinscan(struct iguana_info *coin,uint8_t origblockspace[IGU if ( (n= iguana_gentxarray(coin,rawmem,&txdata,&len,blockspace,datalen)) == datalen ) { len = n; - iguana_gotblockM(coin,0,&txdata,rawmem->ptr,&H,blockspace,datalen); + iguana_gotblockM(coin,0,&txdata,rawmem->ptr,&H,blockspace,datalen,0); flag = 1; //if ( (rand() % 1000) == 0 ) printf("%s h.%-7d len.%-6d | HWM.%d\n",coin->symbol,h,datalen,coin->blocks.hwmchain.height); diff --git a/iguana/iguana_bundles.c b/iguana/iguana_bundles.c index 483608128..c5a91f379 100755 --- a/iguana/iguana_bundles.c +++ b/iguana/iguana_bundles.c @@ -1167,7 +1167,7 @@ int32_t iguana_cacheprocess(struct iguana_info *coin,struct iguana_bundle *bp,in iguana_meminit(&coin->internaladdr.TXDATA,"txdata",0,IGUANA_MAXPACKETSIZE*1.5,0); if ( coin->internaladdr.HASHMEM.ptr == 0 ) iguana_meminit(&coin->internaladdr.HASHMEM,"HASHPTRS",0,256,0); - if ( iguana_msgparser(coin,&coin->internaladdr,&coin->internaladdr.RAWMEM,&coin->internaladdr.TXDATA,&coin->internaladdr.HASHMEM,&H,&data[sizeof(recvlen)],recvlen) < 0 ) + if ( iguana_msgparser(coin,&coin->internaladdr,&coin->internaladdr.RAWMEM,&coin->internaladdr.TXDATA,&coin->internaladdr.HASHMEM,&H,&data[sizeof(recvlen)],recvlen,1) < 0 ) printf("error parsing speculativecache.[%d:%d]\n",bp->hdrsi,bundlei); } free(data); diff --git a/iguana/iguana_msg.c b/iguana/iguana_msg.c index 5582cf13f..9e4e486e3 100755 --- a/iguana/iguana_msg.c +++ b/iguana/iguana_msg.c @@ -827,7 +827,7 @@ int32_t iguana_intvectors(struct iguana_info *coin,struct iguana_peer *addr,int3 //printf("intvectors.%c recvlen.%d\n",intvectors,recvlen); } -int32_t iguana_msgparser(struct iguana_info *coin,struct iguana_peer *addr,struct OS_memspace *rawmem,struct OS_memspace *txmem,struct OS_memspace *hashmem,struct iguana_msghdr *H,uint8_t *data,int32_t recvlen) +int32_t iguana_msgparser(struct iguana_info *coin,struct iguana_peer *addr,struct OS_memspace *rawmem,struct OS_memspace *txmem,struct OS_memspace *hashmem,struct iguana_msghdr *H,uint8_t *data,int32_t recvlen,int32_t fromcache) { uint8_t serialized[16384]; char *ipaddr; struct supernet_info *myinfo = SuperNET_MYINFO(0); int32_t i,n=0,retval=-1,ishost,srvmsg,bloom,sendlen=0,intvectors,len= -100; uint64_t nonce,x; bits256 hash2; @@ -873,7 +873,7 @@ int32_t iguana_msgparser(struct iguana_info *coin,struct iguana_peer *addr,struc if ( (n= iguana_gentxarray(coin,rawmem,&txdata,&len,data,recvlen)) == recvlen ) { len = n; - iguana_gotblockM(coin,addr,&txdata,rawmem->ptr,H,data,recvlen); + iguana_gotblockM(coin,addr,&txdata,rawmem->ptr,H,data,recvlen,fromcache); } else { diff --git a/iguana/iguana_peers.c b/iguana/iguana_peers.c index 127b86def..f64d91bb0 100755 --- a/iguana/iguana_peers.c +++ b/iguana/iguana_peers.c @@ -566,7 +566,7 @@ int32_t iguana_recv(char *ipaddr,int32_t usock,uint8_t *recvbuf,int32_t len) return(len); } -void iguana_parsebuf(struct iguana_info *coin,struct iguana_peer *addr,struct iguana_msghdr *H,uint8_t *buf,int32_t len) +void iguana_parsebuf(struct iguana_info *coin,struct iguana_peer *addr,struct iguana_msghdr *H,uint8_t *buf,int32_t len,int32_t fromcache) { struct iguana_msghdr checkH; memset(&checkH,0,sizeof(checkH)); @@ -582,7 +582,7 @@ void iguana_parsebuf(struct iguana_info *coin,struct iguana_peer *addr,struct ig iguana_meminit(&addr->HASHMEM,"HASHPTRS",0,256,0);//IGUANA_MAXPACKETSIZE*16,0); //printf("Init %s memory %p %p %p\n",addr->ipaddr,addr->RAWMEM.ptr,addr->TXDATA.ptr,addr->HASHMEM.ptr); } - if ( iguana_msgparser(coin,addr,&addr->RAWMEM,&addr->TXDATA,&addr->HASHMEM,H,buf,len) < 0 || addr->dead != 0 ) + if ( iguana_msgparser(coin,addr,&addr->RAWMEM,&addr->TXDATA,&addr->HASHMEM,H,buf,len,fromcache) < 0 || addr->dead != 0 ) { printf("%p addr->dead.%d or parser break at %u\n",&addr->dead,addr->dead,(uint32_t)time(NULL)); addr->dead = (uint32_t)time(NULL); @@ -638,7 +638,7 @@ void _iguana_processmsg(struct iguana_info *coin,int32_t usock,struct iguana_pee return; } } - iguana_parsebuf(coin,addr,&H,buf,len); + iguana_parsebuf(coin,addr,&H,buf,len,0); if ( buf != _buf ) myfree(buf,len); return; @@ -1200,7 +1200,7 @@ void iguana_dedicatedloop(struct supernet_info *myinfo,struct iguana_info *coin, if ( req->datalen != 0 ) { //char str[65]; printf("CACHE.%p parse[%d] %s %s\n",req,req->recvlen,req->H.command,bits256_str(str,req->zblock.RO.hash2)); - iguana_parsebuf(coin,addr,&req->H,req->serializeddata,req->recvlen); + iguana_parsebuf(coin,addr,&req->H,req->serializeddata,req->recvlen,1); } else printf("CACHE error no datalen\n"); coin->cachefreed++; myfree(req,req->allocsize); diff --git a/iguana/iguana_realtime.c b/iguana/iguana_realtime.c index 7bb47ccf5..49da9afa7 100755 --- a/iguana/iguana_realtime.c +++ b/iguana/iguana_realtime.c @@ -498,7 +498,7 @@ void iguana_RTreset(struct iguana_info *coin) iguana_utxoupdate(coin,-1,0,0,0,0,-1,0); // free hashtables coin->lastRTheight = 0; coin->RTheight = coin->firstRTheight; - printf("%s RTreset\n",coin->symbol); + printf("%s RTreset %d\n",coin->symbol,coin->RTheight); } void iguana_RTunmap(uint8_t *ptr,uint32_t len) @@ -506,21 +506,37 @@ void iguana_RTunmap(uint8_t *ptr,uint32_t len) OS_releasemap(&ptr[-2*sizeof(len)],len+2*sizeof(len)); } -void *iguana_RTrawdata(struct iguana_info *coin,bits256 hash2,uint8_t *data,int32_t *recvlenp,int32_t *numtxp) +void *iguana_RTrawdata(struct iguana_info *coin,bits256 hash2,uint8_t *data,int32_t *recvlenp,int32_t *numtxp,int32_t fromcache) { - FILE *fp; char fname[1024],str[65]; long filesize; uint8_t *ptr; uint32_t i,nonz,checknumtx,checklen; + FILE *fp; char fname[1024],str[65]; long filesize; int32_t len; 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 ( coin->RTheight == 0 ) + { + printf("skip %s\n",bits256_str(str,hash2)); return(0); + } + if ( (fp= fopen(fname,"rb")) != 0 ) + { + fseek(fp,0,SEEK_END); + filesize = ftell(fp); + rewind(fp); + if ( fread(&len,1,sizeof(len),fp) == sizeof(len) && len == filesize+sizeof(int32_t)*2 ) + { + fclose(fp); + printf("already have %s\n",bits256_str(str,hash2)); + return(0); + } + fclose(fp); + } if ( (fp= fopen(fname,"wb")) != 0 ) { 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("numtx.%d len.%d %s\n",*numtxp,*recvlenp,fname); + printf("numtx.%d len.%d %s\n",*numtxp,*recvlenp,fname); } else printf("couldnt create %s\n",fname); } else if ( *recvlenp == 0 ) @@ -556,22 +572,26 @@ void iguana_RTpurge(struct iguana_info *coin,int32_t lastheight) hdrsi = (height / coin->chain->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,&numtx); // delete file + iguana_RTrawdata(coin,bp->hashes[bundlei],0,&recvlen,&numtx,0); // delete file } printf("end RTpurge.%d\n",lastheight); } int32_t iguana_RTiterate(struct iguana_info *coin,int32_t offset,struct iguana_block *block,int64_t polarity) { - struct iguana_txblock txdata; struct iguana_peer *addr; uint8_t *serialized; int32_t n,errs=0,numtx,len; uint32_t recvlen = 0; + struct iguana_txblock txdata; struct iguana_peer *addr; uint8_t *serialized; int32_t i,n,errs=0,numtx,len; uint32_t recvlen = 0; while ( (numtx= coin->RTnumtx[offset]) == 0 || (serialized= coin->RTrawdata[offset]) == 0 || (recvlen= coin->RTrecvlens[offset]) == 0 ) { char str[65]; printf("errs.%d cant load %s ht.%d polarity.%lld numtx.%d %p recvlen.%d\n",errs,bits256_str(str,block->RO.hash2),block->height,(long long)polarity,coin->RTnumtx[offset],coin->RTrawdata[offset],coin->RTrecvlens[offset]); iguana_blockQ("RTiterate",coin,0,-1,block->RO.hash2,1); - if ( coin->peers != 0 && coin->peers->numranked > 0 && (addr= coin->peers->ranked[rand() % coin->peers->numranked]) != 0 ) - iguana_sendblockreqPT(coin,addr,0,-1,block->RO.hash2,1); - sleep(3); + if ( coin->peers != 0 && coin->peers->numranked > 0 ) + { + for (i=0; ipeers->numranked&&i<8; i++) + if ( (addr= coin->peers->ranked[i]) != 0 ) + iguana_sendblockreqPT(coin,addr,0,-1,block->RO.hash2,1); + } + return(-1); if ( errs++ > 10 ) { iguana_RTreset(coin); @@ -614,7 +634,7 @@ int32_t iguana_RTblockadd(struct iguana_info *coin,struct iguana_block *block) { offset = block->height - coin->firstRTheight; if ( coin->RTrawdata[offset] == 0 ) - coin->RTrawdata[offset] = iguana_RTrawdata(coin,block->RO.hash2,0,&coin->RTrecvlens[offset],&coin->RTnumtx[offset]); + coin->RTrawdata[offset] = iguana_RTrawdata(coin,block->RO.hash2,0,&coin->RTrecvlens[offset],&coin->RTnumtx[offset],0); //printf("%s RTblockadd.%d offset.%d numtx.%d len.%d\n",coin->symbol,block->height,offset,coin->RTnumtx[offset],coin->RTrecvlens[offset]); block->RO.txn_count = coin->RTnumtx[offset]; coin->RTblocks[offset] = block; diff --git a/iguana/iguana_recv.c b/iguana/iguana_recv.c index 920648fb7..4bff2e617 100755 --- a/iguana/iguana_recv.c +++ b/iguana/iguana_recv.c @@ -78,13 +78,13 @@ int32_t iguana_sendblockreqPT(struct iguana_info *coin,struct iguana_peer *addr, { if ( checkbp->emitfinish != 0 || ((block= checkbp->blocks[j]) != 0 && block->txvalid != 0 && block->mainchain != 0 && block->valid != 0) ) { - char str[65]; + //char str[65]; recvlen = numtx = 0; - if ( iguana_RTrawdata(coin,hash2,0,&recvlen,&numtx) != 0 ) + if ( iguana_RTrawdata(coin,hash2,0,&recvlen,&numtx,0) != 0 ) { printf("found valid [%d:%d] in blockreqPT\n",checkbp->hdrsi,j); return(0); - } else printf("no RTrawdata for %s\n",bits256_str(str,hash2)); + } //else printf("no RTrawdata for %s\n",bits256_str(str,hash2)); } } if ( 0 && coin->enableCACHE != 0 && iguana_speculativesearch(coin,&block,hash2) != 0 ) @@ -121,8 +121,8 @@ int32_t iguana_sendblockreqPT(struct iguana_info *coin,struct iguana_peer *addr, bp->issued[bundlei] = addr->pendtime; if ( block != 0 ) block->issued = addr->pendtime; - if ( 0 && coin->current == bp ) - printf("REQ.(%s) bundlei.%d hdrsi.%d\n",bits256_str(hexstr,hash2),bundlei,bp!=0?bp->hdrsi:-1); + //if ( 0 && coin->current == bp ) + printf("REQ.(%s) [%d:%d] %s\n",bits256_str(hexstr,hash2),bundlei,bp!=0?bp->hdrsi:-1,addr->ipaddr); } else printf("MSG_BLOCK null datalen.%d\n",len); return(len); } @@ -313,7 +313,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) +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,int32_t fromcache) { 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 ) @@ -355,7 +355,7 @@ void iguana_gotblockM(struct iguana_info *coin,struct iguana_peer *addr,struct i else if ( 0 && coin->enableCACHE != 0 ) printf("cache.%d validated.(%s)\n",coin->enableCACHE,bits256_str(str,origtxdata->zblock.RO.hash2)); origtxdata->zblock.txvalid = 1; - if ( coin->virtualchain == 0 && addr != 0 && addr != &coin->internaladdr ) + if ( fromcache == 0 && coin->virtualchain == 0 && addr != 0 && addr != &coin->internaladdr ) { static uint64_t received[IGUANA_MAXPEERS],count[IGUANA_MAXPEERS],lastcount,lastreceived,last; received[addr->addrind] += recvlen; @@ -475,11 +475,14 @@ void iguana_gotblockM(struct iguana_info *coin,struct iguana_peer *addr,struct i txdata = origtxdata; if ( addr != 0 ) { - if ( addr->pendblocks > 0 ) - addr->pendblocks--; - addr->lastblockrecv = (uint32_t)time(NULL); - addr->recvblocks += 1.; - addr->recvtotal += recvlen; + if ( fromcache == 0 ) + { + if ( addr->pendblocks > 0 ) + addr->pendblocks--; + addr->lastblockrecv = (uint32_t)time(NULL); + addr->recvblocks += 1.; + addr->recvtotal += recvlen; + } if ( speculative == 0 && iguana_ramchain_data(coin,addr,origtxdata,txarray,origtxdata->zblock.RO.txn_count,data,recvlen) >= 0 ) { txdata->zblock.fpipbits = (uint32_t)addr->ipbits; @@ -501,15 +504,18 @@ void iguana_gotblockM(struct iguana_info *coin,struct iguana_peer *addr,struct i } //else printf("cant save block\n"); } numtx = origtxdata->zblock.RO.txn_count; - iguana_RTrawdata(coin,txdata->zblock.RO.hash2,data,&recvlen,&numtx); + iguana_RTrawdata(coin,txdata->zblock.RO.hash2,data,&recvlen,&numtx,fromcache); 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)); req->zblock.RO.txn_count = req->numtx = txdata->zblock.RO.txn_count; - coin->recvcount++; - coin->recvtime = (uint32_t)time(NULL); + if ( fromcache == 0 ) + { + coin->recvcount++; + coin->recvtime = (uint32_t)time(NULL); + netBLOCKS++; + } req->addr = addr; - netBLOCKS++; queue_enqueue("recvQ",&coin->recvQ,&req->DL,0); } diff --git a/includes/iguana_funcs.h b/includes/iguana_funcs.h index ab395e200..71d097abc 100755 --- a/includes/iguana_funcs.h +++ b/includes/iguana_funcs.h @@ -45,7 +45,7 @@ int32_t iguana_rwblock(char *symbol,uint8_t zcash,uint8_t auxpow,int32_t (*hasha int32_t iguana_serialize_block(struct iguana_chain *chain,bits256 *hash2p,uint8_t serialized[sizeof(struct iguana_msgblock)],struct iguana_block *block); void iguana_blockconv(uint8_t zcash,uint8_t auxpow,struct iguana_block *dest,struct iguana_msgblock *msg,bits256 hash2,int32_t height); //void iguana_freetx(struct iguana_msgtx *tx,int32_t n); -int32_t iguana_msgparser(struct iguana_info *coin,struct iguana_peer *addr,struct OS_memspace *rawmem,struct OS_memspace *txmem,struct OS_memspace *hashmem,struct iguana_msghdr *H,uint8_t *data,int32_t datalen); +int32_t iguana_msgparser(struct iguana_info *coin,struct iguana_peer *addr,struct OS_memspace *rawmem,struct OS_memspace *txmem,struct OS_memspace *hashmem,struct iguana_msghdr *H,uint8_t *data,int32_t datalen,int32_t fromcache); // send message int32_t iguana_validatehdr(char *symbol,struct iguana_msghdr *H); @@ -65,7 +65,7 @@ void iguana_syncramchain(struct iguana_info *coin); //int32_t iguana_validateramchain(struct iguana_info *coin,int64_t *netp,uint64_t *creditsp,uint64_t *debitsp,int32_t height,struct iguana_block *block,int32_t hwmheight,struct iguana_prevdep *lp); int32_t iguana_calcrmd160(struct iguana_info *coin,char *asmstr,struct vin_info *vp,uint8_t *pk_script,int32_t pk_scriptlen,bits256 debugtxid,int32_t vout,uint32_t sequence); uint32_t iguana_updatescript(struct iguana_info *coin,uint32_t blocknum,uint32_t txidind,uint32_t spendind,uint32_t unspentind,uint64_t value,uint8_t *script,int32_t scriptlen,uint32_t sequence); -void iguana_gotblockM(struct iguana_info *coin,struct iguana_peer *addr,struct iguana_txblock *txdata,struct iguana_msgtx *txarray,struct iguana_msghdr *H,uint8_t *data,int32_t datalen); +void iguana_gotblockM(struct iguana_info *coin,struct iguana_peer *addr,struct iguana_txblock *txdata,struct iguana_msgtx *txarray,struct iguana_msghdr *H,uint8_t *data,int32_t datalen,int32_t fromcache); int32_t iguana_parseblock(struct iguana_info *coin,struct iguana_block *block,struct iguana_msgtx *tx,int32_t numtx); uint32_t iguana_txidind(struct iguana_info *coin,uint32_t *firstvoutp,uint32_t *firstvinp,bits256 txid); bits256 iguana_txidstr(struct iguana_info *coin,uint32_t *firstvoutp,uint32_t *firstvinp,char *txidstr,uint32_t txidind); @@ -323,7 +323,7 @@ uint8_t *iguana_walletrmds(struct supernet_info *myinfo,struct iguana_info *coin char *iguana_bundleaddrs(struct iguana_info *coin,int32_t hdrsi); uint32_t iguana_sparseaddpk(uint8_t *bits,int32_t width,uint32_t tablesize,uint8_t rmd160[20],struct iguana_pkhash *P,uint32_t pkind,struct iguana_ramchain *ramchain); int32_t iguana_vinscriptparse(struct iguana_info *coin,struct vin_info *vp,uint32_t *sigsizep,uint32_t *pubkeysizep,uint32_t *p2shsizep,uint32_t *suffixp,uint8_t *vinscript,int32_t scriptlen); -void iguana_parsebuf(struct iguana_info *coin,struct iguana_peer *addr,struct iguana_msghdr *H,uint8_t *buf,int32_t len); +void iguana_parsebuf(struct iguana_info *coin,struct iguana_peer *addr,struct iguana_msghdr *H,uint8_t *buf,int32_t len,int32_t fromcache); int32_t _iguana_calcrmd160(struct iguana_info *coin,struct vin_info *vp); int32_t iguana_spendvectors(struct supernet_info *myinfo,struct iguana_info *coin,struct iguana_bundle *bp,struct iguana_ramchain *ramchain,int32_t starti,int32_t numblocks,int32_t convertflag,int32_t iterate); int32_t iguana_balancegen(struct iguana_info *coin,int32_t incremental,struct iguana_bundle *bp,int32_t startheight,int32_t endheight,int32_t startemit); @@ -546,7 +546,7 @@ void iguana_RTunspent(struct iguana_info *coin,struct iguana_block *block,int64_ void iguana_RTreset(struct iguana_info *coin); void iguana_RTpurge(struct iguana_info *coin,int32_t lastheight); 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,int32_t *numtxp); +void *iguana_RTrawdata(struct iguana_info *coin,bits256 hash2,uint8_t *data,int32_t *recvlenp,int32_t *numtxp,int32_t fromcache); 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);