Browse Source

test

release/v0.1
jl777 9 years ago
parent
commit
2d4bdac755
  1. 4
      iguana/iguana_bundles.c
  2. 38
      iguana/iguana_realtime.c
  3. 5
      iguana/iguana_recv.c
  4. 70
      iguana/iguana_unspents.c
  5. 2
      includes/iguana_funcs.h
  6. 2
      includes/iguana_structs.h

4
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);
}
}

38
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; i<checklen; i++)
if ( ptr[sizeof(checklen) + i] != 0 )
if ( ptr[2*sizeof(checklen) + i] != 0 )
nonz++;
*recvlenp = (int32_t)(filesize - sizeof(checklen));
return(&ptr[sizeof(*recvlenp)]);
*recvlenp = (int32_t)(filesize - sizeof(checklen) - sizeof(checknumtx));
return(&ptr[sizeof(*recvlenp) + sizeof(checknumtx)]);
} else printf("checklen.%d vs %d\n",checklen,(int32_t)(filesize - sizeof(checklen)));
*numtxp = checknumtx;
}
}
else if ( *recvlenp == -1 )
@ -541,7 +545,7 @@ void *iguana_RTrawdata(struct iguana_info *coin,bits256 hash2,uint8_t *data,int3
void iguana_RTpurge(struct iguana_info *coin,int32_t lastheight)
{
int32_t hdrsi,bundlei,height,recvlen=-1; struct iguana_bundle *bp;
int32_t hdrsi,bundlei,height,numtx=0,recvlen=-1; struct iguana_bundle *bp;
printf("start RTpurge from %d\n",lastheight - coin->chain->bundlesize*10);
for (height=lastheight-coin->chain->bundlesize*10; height<lastheight; height++)
{
@ -550,17 +554,17 @@ 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);
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);
}

5
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));

70
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;
}

2
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);

2
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]; };

Loading…
Cancel
Save