Browse Source

test

release/v0.1
jl777 9 years ago
parent
commit
6b32273717
  1. 4
      iguana/iguana777.h
  2. 8
      iguana/iguana_bundles.c
  3. 6
      iguana/iguana_init.c
  4. 36
      iguana/iguana_ramchain.c
  5. 81
      iguana/iguana_recv.c

4
iguana/iguana777.h

@ -35,9 +35,9 @@ typedef int32_t (*blockhashfunc)(uint8_t *blockhashp,uint8_t *serialized,int32_t
#define IGUANA_HEADPERCENTAGE .00777
#define IGUANA_TAILPERCENTAGE .777
#define IGUANA_MAXPENDHDRS 1
#define _IGUANA_MAXPENDING 8 //64
#define _IGUANA_MAXPENDING 64
#define _IGUANA_MAXBUNDLES 8
#define IGUANA_BUNDLELOOP 64
#define IGUANA_BUNDLELOOP 7
#define IGUANA_RPCPORT 7778
#define IGUANA_MAXRAMCHAINSIZE ((uint64_t)1024L * 1024L * 1024L * 16)

8
iguana/iguana_bundles.c

@ -220,6 +220,7 @@ int32_t iguana_bundlehash2add(struct iguana_info *coin,struct iguana_block **blo
//char str[65]; printf(">>>>>>>>>>>>>> bundlehash2.(%s) ht.(%d %d)\n",bits256_str(str,hash2),bp->bundleheight,bundlei);
block->hdrsi = bp->hdrsi;
block->bundlei = bundlei;
bp->hashes[bundlei] = block->RO.hash2;
bp->blocks[bundlei] = block;
otherbp = 0;
if ( (otherbp= iguana_bundlefind(coin,&otherbp,&otherbundlei,hash2)) != 0 || (bundlei % (bundlesize-1)) == 0)
@ -392,9 +393,10 @@ int64_t iguana_bundlecalcs(struct iguana_info *coin,struct iguana_bundle *bp,int
bp->numcached++;
}
}
else
else if ( 1 )
{
bp->blocks[bundlei] = iguana_blockfind(coin,bp->hashes[bundlei]);
bp->hashes[bundlei] = bp->blocks[bundlei]->RO.hash2;
if ( (block= bp->blocks[bundlei]) != 0 )
block->fpipbits = block->queued = 0;
}
@ -448,8 +450,6 @@ void iguana_bundlestats(struct iguana_info *coin,char *str)
numsaved += bp->numsaved;
if ( bp->emitfinish != 0 )
{
if ( firstgap == 0 )
bp->startutxo = (uint32_t)time(NULL);
done++;
if ( bp->emitfinish > 1 )
numemit++;
@ -501,7 +501,5 @@ void iguana_bundlestats(struct iguana_info *coin,char *str)
}
strcpy(coin->statusstr,str);
coin->estsize = estsize;
if ( firstgap != 0 && firstgap->queued == 0 )
iguana_bundleQ(coin,firstgap,1000);
}

6
iguana/iguana_init.c

@ -273,6 +273,12 @@ void iguana_parseline(struct iguana_info *coin,int32_t iter,FILE *fp)
{
bp->emitfinish = (uint32_t)time(NULL) + 1;
//printf("LOADED bundle.%d\n",bp->bundleheight);
if ( bp->hdrsi == 0 || coin->bundles[bp->hdrsi-1]->emitfinish != 0 )
{
bp->startutxo = (uint32_t)time(NULL);
printf("GENERATE UTXO, verify sigs, etc for ht.%d\n",bp->bundleheight);
iguana_bundleQ(coin,bp,1000);
}
}
else
{

36
iguana/iguana_ramchain.c

@ -286,7 +286,7 @@ uint32_t iguana_ramchain_addtxid(struct iguana_info *coin,RAMCHAIN_FUNC,bits256
{
if ( t->txidind != txidind || memcmp(t->txid.bytes,txid.bytes,sizeof(bits256)) != 0 || t->numvouts != numvouts || t->numvins != numvins || t->firstvout != ramchain->H.unspentind || t->firstvin != ramchain->H.spendind || t->locktime != locktime || t->version != version || t->timestamp != timestamp )
{
printf("iguana_ramchain_addtxid: addtxid mismatch (%d %d %d %d %d) vs. (%d %d %d %d %d)\n",t->txidind,t->numvouts,t->numvins,t->firstvout,t->firstvin,txidind,numvouts,numvins,ramchain->H.unspentind,ramchain->H.spendind);
printf("iguana_ramchain_addtxid.RO: addtxid mismatch (%d %d %d %d %d) vs. (%d %d %d %d %d)\n",t->txidind,t->numvouts,t->numvins,t->firstvout,t->firstvin,txidind,numvouts,numvins,ramchain->H.unspentind,ramchain->H.spendind);
//getchar();
return(0);
}
@ -2127,18 +2127,24 @@ long iguana_ramchain_data(struct iguana_info *coin,struct iguana_peer *addr,stru
if ( iguana_bundlefind(coin,&bp,&bundlei,origtxdata->block.RO.hash2) == 0 )
{
if ( iguana_bundlefind(coin,&bp,&bundlei,origtxdata->block.RO.prev_block) == 0 )
{
origtxdata->block.RO.recvlen = 0;
origtxdata->block.issued = 0;
return(-1);
}
else if ( bundlei < coin->chain->bundlesize-1 )
bundlei++;
else
{
origtxdata->block.issued = 0;
origtxdata->block.RO.recvlen = 0;
printf("ramchain data: error finding block\n");
return(-1);
}
}
//if ( bits256_nonz(bp->hashes[bundlei]) == 0 )
// bp->hashes[bundlei] = origtxdata->block.RO.hash2;
if ( (block= bp->blocks[bundlei]) == 0 )
if ( (block= bp->blocks[bundlei]) == 0 || bits256_cmp(block->RO.hash2,origtxdata->block.RO.hash2) != 0 )
{
char str[65]; printf("%d:%d has no block ptr %s\n",bp->hdrsi,bundlei,bits256_str(str,bp->hashes[bundlei]));
return(-1);
@ -2154,12 +2160,18 @@ long iguana_ramchain_data(struct iguana_info *coin,struct iguana_peer *addr,stru
fpos = -1;
scriptspace = iguana_scriptspaceraw(coin,&scriptsize,&sigsize,&pubkeysize,txarray,txn_count);
if ( iguana_ramchain_init(ramchain,&addr->TXDATA,&addr->HASHMEM,1,txn_count,origtxdata->numunspents,origtxdata->numspends,0,0,(scriptspace+sigsize+pubkeysize)*1.1,0,1) == 0 )
{
block->issued = 0;
block->RO.recvlen = 0;
return(-1);
iguana_ramchain_link(ramchain,origtxdata->block.RO.hash2,origtxdata->block.RO.hash2,bp->hdrsi,bp->bundleheight+bundlei,bundlei,1,firsti,0);
}
iguana_ramchain_link(ramchain,block->RO.hash2,block->RO.hash2,bp->hdrsi,bp->bundleheight+bundlei,bundlei,1,firsti,0);
_iguana_ramchain_setptrs(RAMCHAIN_PTRS,ramchain->H.data);
//printf("Kspace.%p bp.[%d:%d] <- scriptspace.%d expanded.%d\n",Kspace,bp->hdrsi,bundlei,scriptspace,ramchain->expanded);
if ( T == 0 || U == 0 || S == 0 || B == 0 )
{
block->issued = 0;
block->RO.recvlen = 0;
printf("fatal error getting txdataptrs %p %p %p %p\n",T,U,S,B);
return(-1);
}
@ -2198,15 +2210,17 @@ long iguana_ramchain_data(struct iguana_info *coin,struct iguana_peer *addr,stru
if ( ramchain->H.txidind != ramchain->H.data->numtxids || ramchain->H.unspentind != ramchain->H.data->numunspents || ramchain->H.spendind != ramchain->H.data->numspends )
{
printf("error creating PT ramchain.[%d:%d] ramchain->txidind %d != %d ramchain->data->numtxids || ramchain->unspentind %d != %d ramchain->data->numunspents || ramchain->spendind %d != %d ramchain->data->numspends space.(%d v %d)\n",bp->hdrsi,bp->bundleheight,ramchain->H.txidind,ramchain->H.data->numtxids,ramchain->H.unspentind,ramchain->H.data->numunspents,ramchain->H.spendind,ramchain->H.data->numspends,ramchain->H.scriptoffset,ramchain->H.data->scriptspace);
block->issued = 0;
block->RO.recvlen = 0;
}
else
{
if ( (err= iguana_ramchain_verify(coin,ramchain)) == 0 )
{
B[0] = origtxdata->block.RO;
B[0] = block->RO;
ramchain->H.data->scriptspace = ramchain->H.scriptoffset = scriptspace;
ramchain->H.data->stackspace = ramchain->H.stacksize = stackspace;
if ( (fpos= (int32_t)iguana_ramchain_save(coin,RAMCHAIN_ARG,(uint32_t)addr->ipbits,origtxdata->block.RO.hash2,origtxdata->block.RO.prev_block,bundlei,0)) >= 0 )
if ( (fpos= (int32_t)iguana_ramchain_save(coin,RAMCHAIN_ARG,(uint32_t)addr->ipbits,block->RO.hash2,block->RO.prev_block,bundlei,0)) >= 0 )
{
//printf("saved.%d:%d\n",scriptspace,stackspace);
//bp->ipbits[bundlei] = addr->ipbits;
@ -2214,10 +2228,10 @@ long iguana_ramchain_data(struct iguana_info *coin,struct iguana_peer *addr,stru
ramchain->H.ROflag = 0;
flag = 1;
memset(&R,0,sizeof(R));
if ( verifyflag != 0 && (mapchain= iguana_ramchain_map(coin,fname,0,1,&R,0,(uint32_t)addr->ipbits,origtxdata->block.RO.hash2,origtxdata->block.RO.prev_block,bundlei,fpos,1,0)) != 0 )
if ( verifyflag != 0 && (mapchain= iguana_ramchain_map(coin,fname,0,1,&R,0,(uint32_t)addr->ipbits,block->RO.hash2,block->RO.prev_block,bundlei,fpos,1,0)) != 0 )
{
//printf("mapped Soffset.%ld\n",(long)mapchain->data->Soffset);
iguana_ramchain_link(&R,origtxdata->block.RO.hash2,origtxdata->block.RO.hash2,bp->hdrsi,bp->bundleheight+bundlei,bundlei,1,firsti,1);
iguana_ramchain_link(&R,block->RO.hash2,block->RO.hash2,bp->hdrsi,bp->bundleheight+bundlei,bundlei,1,firsti,1);
if ( 1 ) // unix issues?
{
if ( (err= iguana_ramchain_cmp(ramchain,mapchain,0)) != 0 )
@ -2227,11 +2241,13 @@ long iguana_ramchain_data(struct iguana_info *coin,struct iguana_peer *addr,stru
iguana_ramchain_free(mapchain,1);
memset(&R,0,sizeof(R));
R.H.data = (void *)(long)((long)ptr + fpos), R.filesize = fsize;
iguana_ramchain_link(&R,origtxdata->block.RO.hash2,origtxdata->block.RO.hash2,bp->hdrsi,bp->bundleheight+bundlei,bundlei,1,firsti,1);
iguana_ramchain_link(&R,block->RO.hash2,block->RO.hash2,bp->hdrsi,bp->bundleheight+bundlei,bundlei,1,firsti,1);
}
if ( (err= iguana_ramchain_cmp(ramchain,&R,0)) != 0 )
{
fpos = -1;
block->issued = 0;
block->RO.recvlen = 0;
printf("error.%d comparing REMAP ramchains\n",err);
}
else
@ -2301,6 +2317,7 @@ int32_t iguana_bundlefiles(struct iguana_info *coin,uint32_t *ipbits,void **ptrs
{
block->queued = 0;
block->fpipbits = 0;
block->issued = 0;
bp->issued[bundlei] = 0;
return(0);
}
@ -2607,6 +2624,8 @@ int32_t iguana_bundlesaveHT(struct iguana_info *coin,struct OS_memspace *mem,str
{
block->fpipbits = 0;
block->queued = 0;
block->issued = 0;
block->RO.recvlen = 0;
bp->issued[bundlei] = 0;
}
iguana_bundlemapfree(0,0,ipbits,ptrs,filesizes,num,R,bp->n);
@ -2640,6 +2659,7 @@ int32_t iguana_bundlesaveHT(struct iguana_info *coin,struct OS_memspace *mem,str
block->queued = 0;
block->fpipbits = 0;
bp->issued[i] = 0;
block->issued = 0;
return(-1);
}
//destB[i] = block->RO;

81
iguana/iguana_recv.c

@ -139,7 +139,7 @@ void iguana_gotblockM(struct iguana_info *coin,struct iguana_peer *addr,struct i
}
}
}
copyflag = 1 * (strcmp(coin->symbol,"BTC") != 0);
copyflag = 0 * (strcmp(coin->symbol,"BTC") != 0);
req = iguana_bundlereq(coin,addr,'B',copyflag * recvlen);
req->recvlen = recvlen;
req->H = *H;
@ -318,7 +318,8 @@ uint32_t iguana_allhashcmp(struct iguana_info *coin,struct iguana_bundle *bp,bit
prev = block;
}
coin->allhashes++;
printf("ALLHASHES FOUND! %d allhashes.%d\n",bp->bundleheight,coin->allhashes);
if ( bp->hdrsi == 0 )
printf("ALLHASHES FOUND! %d allhashes.%d\n",bp->bundleheight,coin->allhashes);
iguana_bundleQ(coin,bp,bp->n*5 + (rand() % 500));
return(bp->queued);
}
@ -373,12 +374,7 @@ int32_t iguana_bundleiters(struct iguana_info *coin,struct iguana_bundle *bp,int
iguana_bundleQ(coin,bp,bp->n*5);
return(0);
}
if ( bp->rank == 0 || bp->rank > coin->peers.numranked )
{
iguana_bundleQ(coin,bp,((bp->rank != 0) ? bp->rank : 64) * 100);
return(0);
}
else if ( 1 )
if ( bp->rank != 0 && bp->rank <= coin->peers.numranked )
{
for (i=0; i<bp->n; i++)
{
@ -418,18 +414,19 @@ int32_t iguana_bundleiters(struct iguana_info *coin,struct iguana_bundle *bp,int
break;
if ( (block= bp->blocks[i]) != 0 )
{
if ( block->fpipbits == 0 && block->queued == 0 && (bp->issued[i] == 0 || now > bp->issued[i]+13) )
if ( block->fpipbits == 0 && (bp->issued[i] == 0 || now > bp->issued[i]+13) )
{
//if ( bp->bundleheight == 20000 )
// printf("(%d:%d) ",bp->hdrsi,i);
block->numrequests++;
block->issued = now;
iguana_blockQ(coin,bp,i,block->RO.hash2,bp->numsaved > bp->n*.99);
bp->issued[i] = now;
bp->issued[i] = block->issued = now;
counter++;
if ( --max <= 0 )
break;
}
else if ( block->fpipbits != 0 && bits256_nonz(block->RO.prev_block) != 0 )
else if ( block->fpipbits != 0 && ((bp->hdrsi == 0 && i == 0) || bits256_nonz(block->RO.prev_block) != 0) )
n++, issued++;
else if ( bp->issued[i] != 0 )
issued++;
@ -457,6 +454,7 @@ int32_t iguana_bundleiters(struct iguana_info *coin,struct iguana_bundle *bp,int
char str[65]; printf(">>>>>>> null prevblock error at ht.%d patch.(%s) and reissue\n",bp->bundleheight+i,bits256_str(str,block->RO.prev_block));
block->queued = 0;
block->fpipbits = 0;
block->issued = 0;
bp->issued[i] = 0;
iguana_blockQ(coin,bp,i,block->RO.hash2,0);
iguana_bundleQ(coin,bp,counter == 0 ? bp->n*5 : bp->n*2);
@ -475,10 +473,17 @@ int32_t iguana_bundleiters(struct iguana_info *coin,struct iguana_bundle *bp,int
iguana_bundleQ(coin,bp,width);
}
else if ( bp->startutxo == 0 )
{
if ( bp->hdrsi == 0 || coin->bundles[bp->hdrsi-1]->emitfinish != 0 )
{
bp->startutxo = (uint32_t)time(NULL);
printf("GENERATE UTXO, verify sigs, etc for ht.%d\n",bp->bundleheight);
}
iguana_bundleQ(coin,bp,width);
}
else if ( bp->utxofinish == 0 )
{
printf("GENERATE UTXO, verify sigs, etc for ht.%d\n",bp->bundleheight);
printf("UTXO FINISHED ht.%d\n",bp->bundleheight);
}
return(0);
}
@ -576,10 +581,14 @@ struct iguana_bundlereq *iguana_recvblockhdrs(struct iguana_info *coin,struct ig
struct iguana_bundlereq *iguana_recvblockhashes(struct iguana_info *coin,struct iguana_bundlereq *req,bits256 *blockhashes,int32_t num)
{
static bits256 zero;
int32_t bundlei,i; struct iguana_bundle *bp; char hashstr[65];// struct iguana_block *block;
int32_t bundlei,i; struct iguana_bundle *bp; bits256 allhash; char hashstr[65];// struct iguana_block *block;
bp = 0, bundlei = -2;
if ( num < 2 )
return(req);
iguana_bundlefind(coin,&bp,&bundlei,blockhashes[1]);
//char str[65]; printf("blockhashes[%d] %d of %d %s bp.%d[%d]\n",num,bp==0?-1:bp->hdrsi,coin->bundlescount,bits256_str(str,blockhashes[1]),bp==0?-1:bp->bundleheight,bundlei);
//char str[65];
//if ( bp != 0 && bp->hdrsi == 0 )
// printf("blockhashes[%d] %d of %d %s bp.%d[%d]\n",num,bp==0?-1:bp->hdrsi,coin->bundlescount,bits256_str(str,blockhashes[1]),bp==0?-1:bp->bundleheight,bundlei);
if ( bp != 0 )
{
bp->hdrtime = (uint32_t)time(NULL);
@ -614,21 +623,25 @@ struct iguana_bundlereq *iguana_recvblockhashes(struct iguana_info *coin,struct
{
for (i=0; i<coin->bundlescount; i++)
{
if ( (bp= coin->bundles[i]) != 0 && bp->emitfinish == 0 && bits256_nonz(bp->hashes[0]) > 0 )
if ( (bp= coin->bundles[i]) != 0 && bp->emitfinish == 0 )
{
blockhashes[0] = bp->hashes[0];
if ( iguana_allhashcmp(coin,bp,blockhashes,coin->chain->bundlesize) > 0 )
vcalc_sha256(0,allhash.bytes,blockhashes[0].bytes,coin->chain->bundlesize * sizeof(*blockhashes));
if ( bits256_cmp(allhash,bp->allhash) == 0 )
{
bp->hdrtime = (uint32_t)time(NULL);
iguana_blockQ(coin,bp,1,blockhashes[1],0);
iguana_blockQ(coin,bp,0,blockhashes[0],0);
iguana_blockQ(coin,bp,coin->chain->bundlesize-1,blockhashes[coin->chain->bundlesize-1],0);
//printf("matched bundle.%d\n",bp->bundleheight);
return(req);
if ( iguana_allhashcmp(coin,bp,blockhashes,coin->chain->bundlesize) > 0 )
{
bp->hdrtime = (uint32_t)time(NULL);
iguana_blockQ(coin,bp,1,blockhashes[1],0);
iguana_blockQ(coin,bp,0,blockhashes[0],0);
iguana_blockQ(coin,bp,coin->chain->bundlesize-1,blockhashes[coin->chain->bundlesize-1],0);
//printf("matched bundle.%d\n",bp->bundleheight);
return(req);
} else printf("unexpected mismatch??\n");
}
}
}
//printf("issue block1\n");
//printf("no match to allhashes issue block1\n");
struct iguana_block *block;
if ( num == coin->chain->bundlesize+1 && (block= iguana_blockhashset(coin,-1,blockhashes[1],1)) != 0 )
block->blockhashes = blockhashes, req->hashes = 0;
@ -642,7 +655,14 @@ struct iguana_bundlereq *iguana_recvblock(struct iguana_info *coin,struct iguana
{
struct iguana_bundle *bp=0; int32_t bundlei = -2; struct iguana_block *block;
bp = iguana_bundleset(coin,&block,&bundlei,origblock);
//static int total; char str[65]; fprintf(stderr,"RECV %s [%d:%d] block.%08x | %d\n",bits256_str(str,origblock->RO.hash2),bp!=0?bp->hdrsi:-1,bundlei,block->fpipbits,total++);
static int total; char str[65];
if ( 0 && bp != 0 && bp->hdrsi == 0 )
fprintf(stderr,"RECV %s [%d:%d] block.%08x | %d\n",bits256_str(str,origblock->RO.hash2),bp!=0?bp->hdrsi:-1,bundlei,block->fpipbits,total++);
if ( bundlei == 1 && bp != 0 && bp->numhashes < bp->n )
{
printf("reissue hdrs request for [%d]\n",bp->hdrsi);
queue_enqueue("hdrsQ",&coin->hdrsQ,queueitem(bits256_str(str,bp->hashes[0])),1);
}
if ( block != 0 )
{
if ( 0 && bits256_nonz(block->RO.prev_block) > 0 )
@ -950,7 +970,7 @@ int32_t iguana_pollQsPT(struct iguana_info *coin,struct iguana_peer *addr)
return(0);
}
priority = 1;
if ( (req= queue_dequeue(&coin->priorityQ,0)) == 0 && 0 )//(rand() % 10000) == 0 )
if ( (req= queue_dequeue(&coin->priorityQ,0)) == 0 && (rand() % 100) == 0 )
{
if ( (rand() % 1) == 0 )
flag = iguana_neargap(coin,addr);
@ -1007,12 +1027,14 @@ int32_t iguana_pollQsPT(struct iguana_info *coin,struct iguana_peer *addr)
int32_t iguana_reqblocks(struct iguana_info *coin)
{
int32_t hdrsi,lflag,n,bundlei,flag = 0; bits256 hash2; struct iguana_block *next,*block; struct iguana_bundle *bp;
if ( queue_size(&coin->priorityQ) == 0 && (bp= coin->current) != 0 )
if ( queue_size(&coin->priorityQ) == 0 && (bp= coin->current) != 0 && bp->numsaved < bp->n )
{
for (bundlei=n=0; bundlei<bp->n; bundlei++)
if ( (block= bp->blocks[bundlei]) != 0 )
{
if ( bits256_nonz(block->RO.hash2) > 0 && ((block->fpipbits == 0 && block->queued == 0) || time(NULL) > block->issued+30) )
if ( bits256_nonz(block->RO.hash2) > 0 && block->fpipbits != 0 )
n++;
else if ( bp->numsaved > bp->n*.9 && time(NULL) > block->issued+13 )
{
char str[65];
//printf("%d ",bundlei);
@ -1021,12 +1043,13 @@ int32_t iguana_reqblocks(struct iguana_info *coin)
block->queued = 0;
block->issued = 0;
bp->issued[bundlei] = 0;*/
block->issued = (uint32_t)time(NULL);
iguana_blockQ(coin,bp,bundlei,block->RO.hash2,1);
flag++;
} else n++;
}
}
if ( flag != 0 )
printf("issued %d priority blocks for current.[%d] have %d blocks\n",flag,bp->hdrsi,n);
printf("issued %d priority blocks for current.[%d] have %d blocks emit.%u\n",flag,bp->hdrsi,n,bp->emitfinish);
}
hdrsi = (coin->blocks.hwmchain.height+1) / coin->chain->bundlesize;
if ( (bp= coin->bundles[hdrsi]) != 0 )

Loading…
Cancel
Save