Browse Source

test

release/v0.1
jl777 9 years ago
parent
commit
5f35304cb1
  1. 25
      iguana/iguana777.c
  2. 8
      iguana/iguana777.h
  3. 2
      iguana/iguana_bundles.c
  4. 307
      iguana/iguana_recv.c
  5. 2
      iguana/main.c

25
iguana/iguana777.c

@ -296,6 +296,7 @@ void iguana_balancesQ(struct iguana_info *coin,struct iguana_bundle *bp)
ptr->type = 'B'; ptr->type = 'B';
ptr->starttime = (uint32_t)time(NULL); ptr->starttime = (uint32_t)time(NULL);
ptr->timelimit = 0; ptr->timelimit = 0;
coin->pendbalances++;
printf("BALANCES Q %s bundle.%d[%d] balances.%u balancefinish.%u\n",coin->symbol,ptr->hdrsi,bp->n,bp->utxofinish,bp->balancefinish); printf("BALANCES Q %s bundle.%d[%d] balances.%u balancefinish.%u\n",coin->symbol,ptr->hdrsi,bp->n,bp->utxofinish,bp->balancefinish);
queue_enqueue("balancesQ",&balancesQ,&ptr->DL,0); queue_enqueue("balancesQ",&balancesQ,&ptr->DL,0);
} }
@ -409,7 +410,7 @@ void iguana_helper(void *arg)
} }
} }
void iguana_coinflush(struct iguana_info *coin) void iguana_coinflush(struct iguana_info *coin,int32_t forceflag)
{ {
int32_t hdrsi,blen; struct iguana_bundle *bp; char fname[1024],fname2[1024]; FILE *fp,*fp2=0; int32_t hdrsi,blen; struct iguana_bundle *bp; char fname[1024],fname2[1024]; FILE *fp,*fp2=0;
memset(coin->bundlebits,0,sizeof(coin->bundlebits)); memset(coin->bundlebits,0,sizeof(coin->bundlebits));
@ -419,14 +420,22 @@ void iguana_coinflush(struct iguana_info *coin)
blen = (int32_t)hconv_bitlen(coin->bundlescount); blen = (int32_t)hconv_bitlen(coin->bundlescount);
for (hdrsi=0; hdrsi<coin->bundlescount; hdrsi++) for (hdrsi=0; hdrsi<coin->bundlescount; hdrsi++)
{ {
if ( (bp= coin->bundles[hdrsi]) != 0 && bp->dirty != 0 && time(NULL) > bp->dirty+60 && bp->ramchain.H.data != 0 && bp->ramchain.A != 0 && bp->ramchain.Uextras != 0 ) if ( (bp= coin->bundles[hdrsi]) != 0 && (forceflag != 0 || (bp->dirty != 0 && time(NULL) > bp->dirty+60)) && bp->ramchain.H.data != 0 && bp->ramchain.A != 0 && bp->ramchain.Uextras != 0 )
{ {
sprintf(fname,"accounts/%s/debits.%d",coin->symbol,bp->bundleheight); if ( forceflag == 0 )
sprintf(fname2,"accounts/%s/lastspends.%d",coin->symbol,bp->bundleheight); {
printf("save (%s) and (%s) %p %p\n",fname,fname2,bp,bp->ramchain.H.data);//,bp->ramchain.H.data->numpkinds,bp->ramchain.H.data->numunspents); sprintf(fname,"accounts/%s/debits.%d",coin->symbol,bp->bundleheight);
sprintf(fname2,"accounts/%s/lastspends.%d",coin->symbol,bp->bundleheight);
}
else
{
sprintf(fname,"DB/%s/accounts/debits_%d.%d",coin->symbol,coin->bundlescount,bp->bundleheight);
sprintf(fname2,"DB/%s/accounts/lastspends_%d.%d",coin->symbol,coin->bundlescount,bp->bundleheight);
}
//printf("save (%s) and (%s) %p %p\n",fname,fname2,bp,bp->ramchain.H.data);//,bp->ramchain.H.data->numpkinds,bp->ramchain.H.data->numunspents);
if ( (fp= fopen(fname,"wb")) != 0 && (fp2= fopen(fname2,"wb")) != 0 ) if ( (fp= fopen(fname,"wb")) != 0 && (fp2= fopen(fname2,"wb")) != 0 )
{ {
if ( fwrite(coin->bundlebits,1,blen,fp) == blen && fwrite(coin->bundlebits,1,blen,fp2) == blen ) if ( fwrite(&coin->bundlescount,1,sizeof(coin->bundlescount),fp) == sizeof(coin->bundlescount) && fwrite(&coin->bundlescount,1,sizeof(coin->bundlescount),fp2) == sizeof(coin->bundlescount) && fwrite(coin->bundlebits,1,blen,fp) == blen && fwrite(coin->bundlebits,1,blen,fp2) == blen )
{ {
if ( fwrite(bp->ramchain.A,sizeof(*bp->ramchain.A),bp->ramchain.H.data->numpkinds,fp) == bp->ramchain.H.data->numpkinds ) if ( fwrite(bp->ramchain.A,sizeof(*bp->ramchain.A),bp->ramchain.H.data->numpkinds,fp) == bp->ramchain.H.data->numpkinds )
{ {
@ -486,12 +495,11 @@ void iguana_coinloop(void *arg)
{ {
fprintf(stderr,">>>>>>> %s isRT blockrecv.%d vs longest.%d\n",coin->symbol,coin->blocksrecv,coin->longestchain); fprintf(stderr,">>>>>>> %s isRT blockrecv.%d vs longest.%d\n",coin->symbol,coin->blocksrecv,coin->longestchain);
coin->isRT = 1; coin->isRT = 1;
iguana_coinflush(coin,1);
if ( coin->polltimeout > 100 ) if ( coin->polltimeout > 100 )
coin->polltimeout = 100; coin->polltimeout = 100;
coin->MAXPEERS = 8; coin->MAXPEERS = 8;
} }
//if ( coin->isRT != 0 )
// iguana_coinflush(coin);
if ( coin->bindsock >= 0 ) if ( coin->bindsock >= 0 )
{ {
if ( coin->peers.numranked < 8 && now > coin->lastpossible+60 ) if ( coin->peers.numranked < 8 && now > coin->lastpossible+60 )
@ -558,6 +566,7 @@ struct iguana_info *iguana_setcoin(char *symbol,void *launched,int32_t maxpeers,
coin->myservices = services; coin->myservices = services;
sprintf(dirname,"accounts/%s",symbol), OS_ensure_directory(dirname); sprintf(dirname,"accounts/%s",symbol), OS_ensure_directory(dirname);
sprintf(dirname,"DB/%s",symbol), OS_ensure_directory(dirname); sprintf(dirname,"DB/%s",symbol), OS_ensure_directory(dirname);
sprintf(dirname,"DB/%s/accounts",symbol), OS_ensure_directory(dirname);
sprintf(dirname,"DB/%s/spends",symbol), OS_ensure_directory(dirname); sprintf(dirname,"DB/%s/spends",symbol), OS_ensure_directory(dirname);
sprintf(dirname,"DB/%s/vouts",symbol), OS_ensure_directory(dirname); sprintf(dirname,"DB/%s/vouts",symbol), OS_ensure_directory(dirname);
sprintf(dirname,"purgeable/%s",symbol), OS_ensure_directory(dirname); sprintf(dirname,"purgeable/%s",symbol), OS_ensure_directory(dirname);

8
iguana/iguana777.h

@ -38,8 +38,8 @@ typedef int32_t (*blockhashfunc)(uint8_t *blockhashp,uint8_t *serialized,int32_t
#define IGUANA_TAILPERCENTAGE 1.0 #define IGUANA_TAILPERCENTAGE 1.0
#define IGUANA_MAXPENDHDRS 1 #define IGUANA_MAXPENDHDRS 1
#define _IGUANA_MAXPENDING 7 #define _IGUANA_MAXPENDING 7
#define IGUANA_MINPENDBUNDLES 64 #define IGUANA_MINPENDBUNDLES 32
#define IGUANA_MAXPENDBUNDLES 64 #define IGUANA_MAXPENDBUNDLES 32
#define IGUANA_BUNDLELOOP 10000 #define IGUANA_BUNDLELOOP 10000
#define IGUANA_RPCPORT 7778 #define IGUANA_RPCPORT 7778
#define IGUANA_MAXRAMCHAINSIZE ((uint64_t)1024L * 1024L * 1024L * 16) #define IGUANA_MAXRAMCHAINSIZE ((uint64_t)1024L * 1024L * 1024L * 16)
@ -473,7 +473,7 @@ struct iguana_info
portable_mutex_t scripts_mutex[2]; FILE *scriptsfp[2]; void *scriptsptr[2]; long scriptsfilesize[2]; portable_mutex_t scripts_mutex[2]; FILE *scriptsfp[2]; void *scriptsptr[2]; long scriptsfilesize[2];
//struct scriptinfo *scriptstable[2]; //struct scriptinfo *scriptstable[2];
struct iguana_bundle *bundles[IGUANA_MAXBUNDLES],*current,*lastpending; struct iguana_bundle *bundles[IGUANA_MAXBUNDLES],*current,*lastpending;
int32_t numremain,numpendings,zcount,recvcount,bcount,pcount,lastbundle,numsaved; int32_t numremain,numpendings,zcount,recvcount,bcount,pcount,lastbundle,numsaved,pendbalances;
uint32_t recvtime,hdrstime,backstoptime,lastbundletime,numreqsent,numbundlesQ,lastbundleitime; uint32_t recvtime,hdrstime,backstoptime,lastbundletime,numreqsent,numbundlesQ,lastbundleitime;
double backstopmillis; bits256 backstophash2; int64_t spaceused; double backstopmillis; bits256 backstophash2; int64_t spaceused;
int32_t initialheight,mapflags,minconfirms,numrecv,bindsock,isRT,backstop,blocksrecv,merging,polltimeout,numreqtxids,allhashes; bits256 reqtxids[64]; int32_t initialheight,mapflags,minconfirms,numrecv,bindsock,isRT,backstop,blocksrecv,merging,polltimeout,numreqtxids,allhashes; bits256 reqtxids[64];
@ -794,7 +794,7 @@ int32_t iguana_bloomfind(struct iguana_info *coin,struct iguana_bloom16 *bloom,i
struct iguana_bloominds iguana_bloomset(struct iguana_info *coin,struct iguana_bloom16 *bloom,int32_t incr,struct iguana_bloominds bit); struct iguana_bloominds iguana_bloomset(struct iguana_info *coin,struct iguana_bloom16 *bloom,int32_t incr,struct iguana_bloominds bit);
int32_t iguana_Xspendmap(struct iguana_info *coin,struct iguana_ramchain *ramchain,struct iguana_bundle *bp); int32_t iguana_Xspendmap(struct iguana_info *coin,struct iguana_ramchain *ramchain,struct iguana_bundle *bp);
void iguana_balancesQ(struct iguana_info *coin,struct iguana_bundle *bp); void iguana_balancesQ(struct iguana_info *coin,struct iguana_bundle *bp);
void iguana_coinflush(struct iguana_info *coin); void iguana_coinflush(struct iguana_info *coin,int32_t forceflag);
int32_t iguana_bundlekick(struct iguana_info *coin,struct iguana_bundle *bp,int32_t starti,int32_t max); int32_t iguana_bundlekick(struct iguana_info *coin,struct iguana_bundle *bp,int32_t starti,int32_t max);
void iguana_balancecalc(struct iguana_info *coin,struct iguana_bundle *bp); void iguana_balancecalc(struct iguana_info *coin,struct iguana_bundle *bp);

2
iguana/iguana_bundles.c

@ -525,7 +525,7 @@ void iguana_bundlestats(struct iguana_info *coin,char *str)
coin->numsaved = numsaved; coin->numsaved = numsaved;
coin->spaceused = spaceused; coin->spaceused = spaceused;
char str4[65]; char str4[65];
sprintf(str,"v.%d (%d 1st.%d) to %d N[%d] Q.%d h.%d r.%d c.%s s.%d d.%d E.%d:%d M.%d L.%d est.%d %s %d:%02d:%02d %03.3f peers.%d/%d Q.(%d %d)",numv,firstgap!=0?firstgap->numsaved:0,firstgap!=0?firstgap->hdrsi:0,coin->lastpending!=0?coin->lastpending->hdrsi:0,count,coin->numbundlesQ,numhashes,coin->blocksrecv,mbstr(str4,spaceused),numsaved,done,numemit,coin->numreqsent,coin->blocks.hwmchain.height,coin->longestchain,coin->MAXBUNDLES,mbstr(str2,estsize),(int32_t)difft.x/3600,(int32_t)(difft.x/60)%60,(int32_t)difft.x%60,difft.millis,p,coin->MAXPEERS,queue_size(&coin->priorityQ),queue_size(&coin->blocksQ)); sprintf(str,"v.%d/%d (%d 1st.%d) to %d N[%d] Q.%d h.%d r.%d c.%s s.%d d.%d E.%d:%d M.%d L.%d est.%d %s %d:%02d:%02d %03.3f peers.%d/%d Q.(%d %d)",numv,firstgap!=0?firstgap->numsaved:0,coin->pendbalances,firstgap!=0?firstgap->hdrsi:0,coin->lastpending!=0?coin->lastpending->hdrsi:0,count,coin->numbundlesQ,numhashes,coin->blocksrecv,mbstr(str4,spaceused),numsaved,done,numemit,coin->numreqsent,coin->blocks.hwmchain.height,coin->longestchain,coin->MAXBUNDLES,mbstr(str2,estsize),(int32_t)difft.x/3600,(int32_t)(difft.x/60)%60,(int32_t)difft.x%60,difft.millis,p,coin->MAXPEERS,queue_size(&coin->priorityQ),queue_size(&coin->blocksQ));
//sprintf(str+strlen(str),"%s.%-2d %s time %.2f files.%d Q.%d %d\n",coin->symbol,flag,str,(double)(time(NULL)-coin->starttime)/60.,coin->peers.numfiles,queue_size(&coin->priorityQ),queue_size(&coin->blocksQ)); //sprintf(str+strlen(str),"%s.%-2d %s time %.2f files.%d Q.%d %d\n",coin->symbol,flag,str,(double)(time(NULL)-coin->starttime)/60.,coin->peers.numfiles,queue_size(&coin->priorityQ),queue_size(&coin->blocksQ));
if ( time(NULL) > lastdisp+10 ) if ( time(NULL) > lastdisp+10 )
{ {

307
iguana/iguana_recv.c

@ -929,6 +929,157 @@ struct iguana_bundlereq *iguana_recvunconfirmed(struct iguana_info *coin,struct
return(req); return(req);
} }
int32_t iguana_reqblocks(struct iguana_info *coin)
{
int32_t hdrsi,lflag,n,numissued,bundlei,flag = 0; bits256 hash2; struct iguana_block *next,*block; struct iguana_bundle *bp; struct iguana_peer *addr;
if ( 0 && (bp= coin->current) != 0 && bp->numsaved < bp->n ) // queue_size(&coin->priorityQ) == 0 &&
{
for (hdrsi=numissued=0; hdrsi<coin->MAXBUNDLES && coin->current->hdrsi+hdrsi<coin->bundlescount && numissued<100; hdrsi++)
{
if ( (bp= coin->bundles[hdrsi + coin->current->hdrsi]) == 0 )
continue;
if ( (addr= coin->peers.ranked[hdrsi]) == 0 || addr->msgcounts.verack == 0 )
continue;
for (bundlei=n=flag=0; bundlei<bp->n; bundlei++)
if ( (block= bp->blocks[bundlei]) != 0 )
{
if ( bits256_nonz(block->RO.hash2) > 0 && block->fpipbits != 0 )
n++;
else if ( time(NULL) > block->issued+60 ) //bp->numsaved > bp->n*.9 &&
{
//char str[65];
//printf("%d ",bundlei);
/*block->fpipbits = 0;
block->queued = 0;
block->issued = 0;
bp->issued[bundlei] = 0;*/
block->issued = (uint32_t)time(NULL);
iguana_sendblockreqPT(coin,addr,bp,bundlei,block->RO.hash2,0);
//iguana_blockQ(coin,bp,bundlei,block->RO.hash2,1);
flag++;
if ( ++numissued > 100 )
break;
}
}
if ( 0 && flag != 0 )
printf("issued %d priority blocks for %d current.[%d] have %d blocks emit.%u\n",flag,hdrsi,bp->hdrsi,n,bp->emitfinish);
}
}
hdrsi = (coin->blocks.hwmchain.height+1) / coin->chain->bundlesize;
if ( (bp= coin->bundles[hdrsi]) != 0 )
{
bundlei = (coin->blocks.hwmchain.height+1) % coin->chain->bundlesize;
if ( (next= bp->blocks[bundlei]) != 0 || (next= iguana_blockfind(coin,bp->hashes[bundlei])) != 0 )
{
if ( bits256_nonz(next->RO.prev_block) > 0 )
_iguana_chainlink(coin,next);
else if ( next->queued == 0 && next->fpipbits == 0 && (rand() % 100) == 0 )
{
printf("HWM next %d\n",coin->blocks.hwmchain.height+1);
iguana_blockQ(coin,bp,bundlei,next->RO.hash2,0);
}
}
else if ( iguana_blockfind(coin,bp->hashes[bundlei]) == 0 )
{
/*if ( bits256_nonz(bp->hashes[bundlei]) > 0 )
{
printf("next %d\n",coin->blocks.hwmchain.height+1);
iguana_blockQ(coin,bp,bundlei,bp->hashes[bundlei],0);
}
else*/ if ( bp->speculative != 0 && (bits256_cmp(bp->hashes[bundlei],bp->speculative[bundlei]) != 0 || (rand() % 100) == 0) )
{
if ( time(NULL) > bp->issued[bundlei]+30 && iguana_blockfind(coin,bp->speculative[bundlei]) == 0 )
{
bp->hashes[bundlei] = bp->speculative[bundlei];
struct iguana_bloominds bit = iguana_calcbloom(bp->speculative[bundlei]);
if ( iguana_bloomfind(coin,&bp->bloom,0,bit) < 0 )
iguana_bloomset(coin,&bp->bloom,0,bit);
printf("speculative next %d\n",coin->blocks.hwmchain.height+1);
iguana_blockQ(coin,0,-1,bp->speculative[bundlei],0);
bp->issued[bundlei] = (uint32_t)time(NULL);
}
}
}
}
else if ( 0 && (bp= coin->bundles[--hdrsi]) != 0 )
{
char str[65];
queue_enqueue("hdrsQ",&coin->hdrsQ,queueitem(bits256_str(str,bp->hashes[0])),1);
}
lflag = 1;
while ( lflag != 0 )
{
lflag = 0;
hdrsi = (coin->blocks.hwmchain.height+1) / coin->chain->bundlesize;
bundlei = (coin->blocks.hwmchain.height+1) % coin->chain->bundlesize;
if ( (next= iguana_blockfind(coin,iguana_blockhash(coin,coin->blocks.hwmchain.height+1))) == 0 )
{
if ( (block= iguana_blockfind(coin,coin->blocks.hwmchain.RO.hash2)) != 0 )
next = block->hh.next, block->mainchain = 1;
}
if ( next == 0 && hdrsi < coin->bundlescount && (bp= coin->bundles[hdrsi]) != 0 && (next= bp->blocks[bundlei]) != 0 )
{
if ( bits256_nonz(next->RO.prev_block) == 0 )
{
printf(" next has null prev [%d:%d]\n",bp->hdrsi,bundlei);
iguana_blockQ(coin,bp,bundlei,next->RO.hash2,0);
next = 0;
}
}
else if ( bp != 0 && bits256_nonz(bp->hashes[bundlei]) != 0 )
iguana_blockQ(coin,bp,bundlei,bp->hashes[bundlei],0);
if ( next != 0 )
{
//printf("have next %d\n",coin->blocks.hwmchain.height);
if ( memcmp(next->RO.prev_block.bytes,coin->blocks.hwmchain.RO.hash2.bytes,sizeof(bits256)) == 0 )
{
if ( _iguana_chainlink(coin,next) != 0 )
lflag++, flag++;
//else printf("chainlink error for %d\n",coin->blocks.hwmchain.height+1);
}
if ( queue_size(&coin->blocksQ) < _IGUANA_MAXPENDING )
{
double threshold,lag = OS_milliseconds() - coin->backstopmillis;
threshold = (10 + coin->longestchain - coin->blocksrecv);
if ( threshold < 1 )
threshold = 1.;
if ( (bp= coin->bundles[(coin->blocks.hwmchain.height+1)/coin->chain->bundlesize]) != 0 )
threshold = (bp->avetime + coin->avetime) * .5;
else threshold = coin->avetime;
threshold *= 100. * sqrt(threshold) * .000777;
if ( strcmp(coin->symbol,"BTC") != 0 )
threshold = 1000;
else threshold = 10000;
if ( coin->blocks.hwmchain.height < coin->longestchain && (coin->backstop != coin->blocks.hwmchain.height+1 || lag > threshold) )
{
coin->backstop = coin->blocks.hwmchain.height+1;
hash2 = iguana_blockhash(coin,coin->backstop);
if ( bits256_nonz(hash2) > 0 )
{
bp = coin->bundles[(coin->blocks.hwmchain.height+1)/coin->chain->bundlesize];
bundlei = (coin->blocks.hwmchain.height+1) % coin->chain->bundlesize;
if ( bp != 0 && bits256_nonz(bp->hashes[bundlei]) > 0 )
{
coin->backstopmillis = OS_milliseconds();
iguana_blockQ(coin,bp,bundlei,bp->hashes[bundlei],0);
flag++;
char str[65];
if ( 1 && (rand() % 1000) == 0 || bp->bundleheight > coin->longestchain-coin->chain->bundlesize )
printf("%s MAINCHAIN.%d threshold %.3f %.3f lag %.3f\n",bits256_str(str,hash2),coin->blocks.hwmchain.height+1,threshold,coin->backstopmillis,lag);
}
else if ( bp != 0 && bundlei < bp->n-1 && bits256_nonz(bp->hashes[bundlei+1]) > 0 )
{
printf("MAINCHAIN skip issue %d\n",bundlei+1);
iguana_blockQ(coin,bp,bundlei,bp->hashes[bundlei+1],0);
}
}
}
}
}
}
return(flag);
}
int32_t iguana_processrecvQ(struct iguana_info *coin,int32_t *newhwmp) // single threaded int32_t iguana_processrecvQ(struct iguana_info *coin,int32_t *newhwmp) // single threaded
{ {
int32_t flag = 0; struct iguana_bundlereq *req; int32_t flag = 0; struct iguana_bundlereq *req;
@ -969,7 +1120,10 @@ int32_t iguana_processrecvQ(struct iguana_info *coin,int32_t *newhwmp) // single
myfree(req,req->allocsize), req = 0; myfree(req,req->allocsize), req = 0;
if ( flag >= IGUANA_BUNDLELOOP ) if ( flag >= IGUANA_BUNDLELOOP )
break; break;
if ( (flag % 100) == 0 )
iguana_reqblocks(coin);
} }
iguana_reqblocks(coin);
return(flag); return(flag);
} }
@ -1241,157 +1395,6 @@ int32_t iguana_pollQsPT(struct iguana_info *coin,struct iguana_peer *addr)
return(flag); return(flag);
} }
int32_t iguana_reqblocks(struct iguana_info *coin)
{
int32_t hdrsi,lflag,n,numissued,bundlei,flag = 0; bits256 hash2; struct iguana_block *next,*block; struct iguana_bundle *bp; struct iguana_peer *addr;
if ( 0 && (bp= coin->current) != 0 && bp->numsaved < bp->n ) // queue_size(&coin->priorityQ) == 0 &&
{
for (hdrsi=numissued=0; hdrsi<coin->MAXBUNDLES && coin->current->hdrsi+hdrsi<coin->bundlescount && numissued<100; hdrsi++)
{
if ( (bp= coin->bundles[hdrsi + coin->current->hdrsi]) == 0 )
continue;
if ( (addr= coin->peers.ranked[hdrsi]) == 0 || addr->msgcounts.verack == 0 )
continue;
for (bundlei=n=flag=0; bundlei<bp->n; bundlei++)
if ( (block= bp->blocks[bundlei]) != 0 )
{
if ( bits256_nonz(block->RO.hash2) > 0 && block->fpipbits != 0 )
n++;
else if ( time(NULL) > block->issued+60 ) //bp->numsaved > bp->n*.9 &&
{
//char str[65];
//printf("%d ",bundlei);
/*block->fpipbits = 0;
block->queued = 0;
block->issued = 0;
bp->issued[bundlei] = 0;*/
block->issued = (uint32_t)time(NULL);
iguana_sendblockreqPT(coin,addr,bp,bundlei,block->RO.hash2,0);
//iguana_blockQ(coin,bp,bundlei,block->RO.hash2,1);
flag++;
if ( ++numissued > 100 )
break;
}
}
if ( 0 && flag != 0 )
printf("issued %d priority blocks for %d current.[%d] have %d blocks emit.%u\n",flag,hdrsi,bp->hdrsi,n,bp->emitfinish);
}
}
hdrsi = (coin->blocks.hwmchain.height+1) / coin->chain->bundlesize;
if ( (bp= coin->bundles[hdrsi]) != 0 )
{
bundlei = (coin->blocks.hwmchain.height+1) % coin->chain->bundlesize;
if ( (next= bp->blocks[bundlei]) != 0 || (next= iguana_blockfind(coin,bp->hashes[bundlei])) != 0 )
{
if ( bits256_nonz(next->RO.prev_block) > 0 )
_iguana_chainlink(coin,next);
else if ( next->queued == 0 && next->fpipbits == 0 && (rand() % 100) == 0 )
{
printf("HWM next %d\n",coin->blocks.hwmchain.height+1);
iguana_blockQ(coin,bp,bundlei,next->RO.hash2,0);
}
}
else if ( iguana_blockfind(coin,bp->hashes[bundlei]) == 0 )
{
/*if ( bits256_nonz(bp->hashes[bundlei]) > 0 )
{
printf("next %d\n",coin->blocks.hwmchain.height+1);
iguana_blockQ(coin,bp,bundlei,bp->hashes[bundlei],0);
}
else*/ if ( bp->speculative != 0 && (bits256_cmp(bp->hashes[bundlei],bp->speculative[bundlei]) != 0 || (rand() % 100) == 0) )
{
if ( time(NULL) > bp->issued[bundlei]+30 && iguana_blockfind(coin,bp->speculative[bundlei]) == 0 )
{
bp->hashes[bundlei] = bp->speculative[bundlei];
struct iguana_bloominds bit = iguana_calcbloom(bp->speculative[bundlei]);
if ( iguana_bloomfind(coin,&bp->bloom,0,bit) < 0 )
iguana_bloomset(coin,&bp->bloom,0,bit);
printf("speculative next %d\n",coin->blocks.hwmchain.height+1);
iguana_blockQ(coin,0,-1,bp->speculative[bundlei],0);
bp->issued[bundlei] = (uint32_t)time(NULL);
}
}
}
}
else if ( 0 && (bp= coin->bundles[--hdrsi]) != 0 )
{
char str[65];
queue_enqueue("hdrsQ",&coin->hdrsQ,queueitem(bits256_str(str,bp->hashes[0])),1);
}
lflag = 1;
while ( lflag != 0 )
{
lflag = 0;
hdrsi = (coin->blocks.hwmchain.height+1) / coin->chain->bundlesize;
bundlei = (coin->blocks.hwmchain.height+1) % coin->chain->bundlesize;
if ( (next= iguana_blockfind(coin,iguana_blockhash(coin,coin->blocks.hwmchain.height+1))) == 0 )
{
if ( (block= iguana_blockfind(coin,coin->blocks.hwmchain.RO.hash2)) != 0 )
next = block->hh.next, block->mainchain = 1;
}
if ( next == 0 && hdrsi < coin->bundlescount && (bp= coin->bundles[hdrsi]) != 0 && (next= bp->blocks[bundlei]) != 0 )
{
if ( bits256_nonz(next->RO.prev_block) == 0 )
{
printf(" next has null prev [%d:%d]\n",bp->hdrsi,bundlei);
iguana_blockQ(coin,bp,bundlei,next->RO.hash2,0);
next = 0;
}
}
else if ( bp != 0 && bits256_nonz(bp->hashes[bundlei]) != 0 )
iguana_blockQ(coin,bp,bundlei,bp->hashes[bundlei],0);
if ( next != 0 )
{
//printf("have next %d\n",coin->blocks.hwmchain.height);
if ( memcmp(next->RO.prev_block.bytes,coin->blocks.hwmchain.RO.hash2.bytes,sizeof(bits256)) == 0 )
{
if ( _iguana_chainlink(coin,next) != 0 )
lflag++, flag++;
//else printf("chainlink error for %d\n",coin->blocks.hwmchain.height+1);
}
if ( queue_size(&coin->blocksQ) < _IGUANA_MAXPENDING )
{
double threshold,lag = OS_milliseconds() - coin->backstopmillis;
threshold = (10 + coin->longestchain - coin->blocksrecv);
if ( threshold < 1 )
threshold = 1.;
if ( (bp= coin->bundles[(coin->blocks.hwmchain.height+1)/coin->chain->bundlesize]) != 0 )
threshold = (bp->avetime + coin->avetime) * .5;
else threshold = coin->avetime;
threshold *= 100. * sqrt(threshold) * .000777;
if ( strcmp(coin->symbol,"BTC") != 0 )
threshold = 1000;
else threshold = 10000;
if ( coin->blocks.hwmchain.height < coin->longestchain && (coin->backstop != coin->blocks.hwmchain.height+1 || lag > threshold) )
{
coin->backstop = coin->blocks.hwmchain.height+1;
hash2 = iguana_blockhash(coin,coin->backstop);
if ( bits256_nonz(hash2) > 0 )
{
bp = coin->bundles[(coin->blocks.hwmchain.height+1)/coin->chain->bundlesize];
bundlei = (coin->blocks.hwmchain.height+1) % coin->chain->bundlesize;
if ( bp != 0 && bits256_nonz(bp->hashes[bundlei]) > 0 )
{
coin->backstopmillis = OS_milliseconds();
iguana_blockQ(coin,bp,bundlei,bp->hashes[bundlei],0);
flag++;
char str[65];
if ( 1 && (rand() % 1000) == 0 || bp->bundleheight > coin->longestchain-coin->chain->bundlesize )
printf("%s MAINCHAIN.%d threshold %.3f %.3f lag %.3f\n",bits256_str(str,hash2),coin->blocks.hwmchain.height+1,threshold,coin->backstopmillis,lag);
}
else if ( bp != 0 && bundlei < bp->n-1 && bits256_nonz(bp->hashes[bundlei+1]) > 0 )
{
printf("MAINCHAIN skip issue %d\n",bundlei+1);
iguana_blockQ(coin,bp,bundlei,bp->hashes[bundlei+1],0);
}
}
}
}
}
}
return(flag);
}
int32_t iguana_processrecv(struct iguana_info *coin) // single threaded int32_t iguana_processrecv(struct iguana_info *coin) // single threaded
{ {
int32_t newhwm = 0,flag = 0; int32_t newhwm = 0,flag = 0;
@ -1400,6 +1403,6 @@ int32_t iguana_processrecv(struct iguana_info *coin) // single threaded
//fprintf(stderr,"iguana_reqhdrs\n"); //fprintf(stderr,"iguana_reqhdrs\n");
flag += iguana_reqhdrs(coin); flag += iguana_reqhdrs(coin);
//fprintf(stderr,"iguana_reqblocks\n"); //fprintf(stderr,"iguana_reqblocks\n");
flag += iguana_reqblocks(coin); //flag += iguana_reqblocks(coin);
return(flag); return(flag);
} }

2
iguana/main.c

@ -337,7 +337,7 @@ void mainloop(struct supernet_info *myinfo)
if ( ptr->bp != 0 && ptr->coin != 0 ) if ( ptr->bp != 0 && ptr->coin != 0 )
{ {
iguana_balancecalc(ptr->coin,ptr->bp); iguana_balancecalc(ptr->coin,ptr->bp);
iguana_coinflush(ptr->coin); iguana_coinflush(ptr->coin,0);
} }
myfree(ptr,ptr->allocsize); myfree(ptr,ptr->allocsize);
} }

Loading…
Cancel
Save