Browse Source

test

release/v0.1
jl777 9 years ago
parent
commit
6db27b0357
  1. 1
      iguana/iguana777.h
  2. 10
      iguana/iguana_bundles.c
  3. 44
      iguana/iguana_ramchain.c
  4. 59
      iguana/iguana_unspents.c
  5. 5
      iguana/main.c

1
iguana/iguana777.h

@ -825,6 +825,7 @@ void iguana_RTramchainfree(struct iguana_info *coin);
void iguana_coinpurge(struct iguana_info *coin); void iguana_coinpurge(struct iguana_info *coin);
int32_t iguana_setmaxbundles(struct iguana_info *coin); int32_t iguana_setmaxbundles(struct iguana_info *coin);
void iguana_bundlepurgefiles(struct iguana_info *coin,struct iguana_bundle *bp); void iguana_bundlepurgefiles(struct iguana_info *coin,struct iguana_bundle *bp);
uint32_t iguana_sparseaddtx(uint8_t *bits,int32_t width,uint32_t tablesize,bits256 txid,struct iguana_txid *T,uint32_t txidind);
extern int32_t HDRnet,netBLOCKS; extern int32_t HDRnet,netBLOCKS;

10
iguana/iguana_bundles.c

@ -808,7 +808,11 @@ int32_t iguana_bundlefinish(struct iguana_info *coin,struct iguana_bundle *bp)
} }
#endif #endif
for (i=0; i<bp->hdrsi; i++) for (i=0; i<bp->hdrsi; i++)
if ( (prevbp= coin->bundles[i]) == 0 || prevbp->emitfinish < coin->startutc ) if ( (prevbp= coin->bundles[i]) == 0 || prevbp->emitfinish < coin->startutc
#ifdef IGUANA_SERIALIZE_SPENDVECTORGEN
|| prevbp->utxofinish <= 1
#endif
)
break; break;
if ( i == bp->hdrsi ) if ( i == bp->hdrsi )
{ {
@ -1141,7 +1145,7 @@ void iguana_bundlestats(struct iguana_info *coin,char *str)
coin->spaceused = spaceused; coin->spaceused = spaceused;
coin->numverified = numv; coin->numverified = numv;
char str4[65],str5[65]; char str4[65],str5[65];
if ( firstgap != 0 && firstgap->hdrsi < coin->bundlescount-1 ) if ( coin->isRT == 0 && firstgap != 0 && firstgap->hdrsi < coin->bundlescount-1 )
{ {
if ( coin->stuckmonitor != (firstgap->hdrsi * coin->chain->bundlesize) + firstgap->numsaved ) if ( coin->stuckmonitor != (firstgap->hdrsi * coin->chain->bundlesize) + firstgap->numsaved )
{ {
@ -1149,6 +1153,8 @@ void iguana_bundlestats(struct iguana_info *coin,char *str)
coin->stucktime = (uint32_t)time(NULL); coin->stucktime = (uint32_t)time(NULL);
} }
} }
if ( coin->isRT != 0 || (firstgap != 0 && firstgap->hdrsi == coin->bundlescount-1) )
coin->stucktime = 0;
if ( coin->stucktime != 0 && time(NULL)-coin->stucktime > coin->maxstuck ) if ( coin->stucktime != 0 && time(NULL)-coin->stucktime > coin->maxstuck )
coin->maxstuck = (uint32_t)time(NULL) - coin->stucktime; coin->maxstuck = (uint32_t)time(NULL) - coin->stucktime;
sprintf(str,"%s.RT%d u.%d b.%d v.%d/%d (%d/%d 1st.%d) to %d N[%d] h.%d r.%d c.%s s.%d d.%d E.%d maxB.%d peers.%d/%d Q.(%d %d) L.%d [%d:%d] M.%d %s",coin->symbol,coin->RTheight,numutxo,numbalances,numv,coin->pendbalances,firstgap!=0?firstgap->numsaved:-1,firstgap!=0?firstgap->numhashes:-1,firstgap!=0?firstgap->hdrsi:-1,coin->lastpending!=0?coin->lastpending->hdrsi:0,count,numhashes,coin->blocksrecv,mbstr(str4,spaceused),numsaved,done,numemit,coin->MAXBUNDLES,p,coin->MAXPEERS,queue_size(&coin->priorityQ),queue_size(&coin->blocksQ),coin->longestchain,coin->blocks.hwmchain.height/coin->chain->bundlesize,coin->blocks.hwmchain.height%coin->chain->bundlesize,coin->blocks.hwmchain.height,bits256_str(str5,coin->blocks.hwmchain.RO.hash2)); sprintf(str,"%s.RT%d u.%d b.%d v.%d/%d (%d/%d 1st.%d) to %d N[%d] h.%d r.%d c.%s s.%d d.%d E.%d maxB.%d peers.%d/%d Q.(%d %d) L.%d [%d:%d] M.%d %s",coin->symbol,coin->RTheight,numutxo,numbalances,numv,coin->pendbalances,firstgap!=0?firstgap->numsaved:-1,firstgap!=0?firstgap->numhashes:-1,firstgap!=0?firstgap->hdrsi:-1,coin->lastpending!=0?coin->lastpending->hdrsi:0,count,numhashes,coin->blocksrecv,mbstr(str4,spaceused),numsaved,done,numemit,coin->MAXBUNDLES,p,coin->MAXPEERS,queue_size(&coin->priorityQ),queue_size(&coin->blocksQ),coin->longestchain,coin->blocks.hwmchain.height/coin->chain->bundlesize,coin->blocks.hwmchain.height%coin->chain->bundlesize,coin->blocks.hwmchain.height,bits256_str(str5,coin->blocks.hwmchain.RO.hash2));

44
iguana/iguana_ramchain.c

@ -212,50 +212,6 @@ void iguana_blocksetcounters(struct iguana_info *coin,struct iguana_block *block
block->RO.firstexternalind = ramchain->externalind; block->RO.firstexternalind = ramchain->externalind;
} }
struct iguana_txid *iguana_txidfind(struct iguana_info *coin,int32_t *heightp,struct iguana_txid *tx,bits256 txid,int32_t lasthdrsi)
{
uint8_t *TXbits; struct iguana_txid *T; uint32_t txidind; int32_t i,j;
struct iguana_bundle *bp; struct iguana_ramchain *ramchain; struct iguana_block *block;
*heightp = -1;
if ( lasthdrsi < 0 )
return(0);
for (i=lasthdrsi; i>=0; i--)
{
if ( (bp= coin->bundles[i]) != 0 && bp->emitfinish > coin->startutc )
{
ramchain = &bp->ramchain;
if ( ramchain->H.data != 0 )
{
TXbits = (void *)(long)((long)ramchain->H.data + ramchain->H.data->TXoffset);
T = (void *)(long)((long)ramchain->H.data + ramchain->H.data->Toffset);
//printf("search bp.%p TXbits.%p T.%p %d %d\n",bp,TXbits,T,(int32_t)ramchain->H.data->TXoffset,(int32_t)ramchain->H.data->Toffset);
if ( (txidind= iguana_sparseaddtx(TXbits,ramchain->H.data->txsparsebits,ramchain->H.data->numtxsparse,txid,T,0)) > 0 )
{
//printf("found txidind.%d\n",txidind);
if ( bits256_cmp(txid,T[txidind].txid) == 0 )
{
for (j=0; j<bp->n; j++)
if ( (block= bp->blocks[j]) != 0 && txidind >= block->RO.firsttxidind && txidind < block->RO.firsttxidind+block->RO.txn_count )
break;
if ( j < bp->n )
{
*heightp = bp->bundleheight + j;
//printf("found height.%d\n",*heightp);
*tx = T[txidind];
return(tx);
}
for (j=0; j<bp->n; j++)
if ( (block= bp->blocks[j]) != 0 )
printf("(%d %d).%d ",block->RO.firsttxidind,block->RO.txn_count,txidind >= block->RO.firsttxidind && txidind < block->RO.firsttxidind+block->RO.txn_count);
printf(" <- firsttxidind txidind.%d not in block range\n",txidind);
} else printf("mismatched sparse entry\n");
}
}
}
}
return(0);
}
int32_t iguana_peerfname(struct iguana_info *coin,int32_t *hdrsip,char *dirname,char *fname,uint32_t ipbits,bits256 hash2,bits256 prevhash2,int32_t numblocks) int32_t iguana_peerfname(struct iguana_info *coin,int32_t *hdrsip,char *dirname,char *fname,uint32_t ipbits,bits256 hash2,bits256 prevhash2,int32_t numblocks)
{ {
struct iguana_bundle *bp = 0; int32_t bundlei = -2; char str[65]; struct iguana_bundle *bp = 0; int32_t bundlei = -2; char str[65];

59
iguana/iguana_unspents.c

@ -121,6 +121,50 @@ int32_t iguana_volatileupdate(struct iguana_info *coin,int32_t incremental,struc
return(-1); return(-1);
} }
struct iguana_txid *iguana_txidfind(struct iguana_info *coin,int32_t *heightp,struct iguana_txid *tx,bits256 txid,int32_t lasthdrsi)
{
uint8_t *TXbits; struct iguana_txid *T; uint32_t txidind; int32_t i,j;
struct iguana_bundle *bp; struct iguana_ramchain *ramchain; struct iguana_block *block;
*heightp = -1;
if ( lasthdrsi < 0 )
return(0);
for (i=lasthdrsi; i>=0; i--)
{
if ( (bp= coin->bundles[i]) != 0 && bp->emitfinish > coin->startutc )
{
ramchain = (bp->isRT != 0) ? &coin->RTramchain : &bp->ramchain;
if ( ramchain->H.data != 0 )
{
TXbits = (void *)(long)((long)ramchain->H.data + ramchain->H.data->TXoffset);
T = (void *)(long)((long)ramchain->H.data + ramchain->H.data->Toffset);
//printf("search bp.%p TXbits.%p T.%p %d %d\n",bp,TXbits,T,(int32_t)ramchain->H.data->TXoffset,(int32_t)ramchain->H.data->Toffset);
if ( (txidind= iguana_sparseaddtx(TXbits,ramchain->H.data->txsparsebits,ramchain->H.data->numtxsparse,txid,T,0)) > 0 )
{
//printf("found txidind.%d\n",txidind);
if ( bits256_cmp(txid,T[txidind].txid) == 0 )
{
for (j=0; j<bp->n; j++)
if ( (block= bp->blocks[j]) != 0 && txidind >= block->RO.firsttxidind && txidind < block->RO.firsttxidind+block->RO.txn_count )
break;
if ( j < bp->n )
{
*heightp = bp->bundleheight + j;
//printf("found height.%d\n",*heightp);
*tx = T[txidind];
return(tx);
}
for (j=0; j<bp->n; j++)
if ( (block= bp->blocks[j]) != 0 )
printf("(%d %d).%d ",block->RO.firsttxidind,block->RO.txn_count,txidind >= block->RO.firsttxidind && txidind < block->RO.firsttxidind+block->RO.txn_count);
printf(" <- firsttxidind txidind.%d not in block range\n",txidind);
} else printf("mismatched sparse entry\n");
}
}
}
}
return(0);
}
struct iguana_bundle *iguana_externalspent(struct iguana_info *coin,bits256 *prevhashp,uint32_t *unspentindp,struct iguana_ramchain *ramchain,int32_t spend_hdrsi,struct iguana_spend *s) struct iguana_bundle *iguana_externalspent(struct iguana_info *coin,bits256 *prevhashp,uint32_t *unspentindp,struct iguana_ramchain *ramchain,int32_t spend_hdrsi,struct iguana_spend *s)
{ {
int32_t prev_vout,height,hdrsi; uint32_t sequenceid,unspentind; char str[65]; int32_t prev_vout,height,hdrsi; uint32_t sequenceid,unspentind; char str[65];
@ -198,7 +242,7 @@ cJSON *iguana_unspentjson(struct iguana_info *coin,int32_t hdrsi,uint32_t unspen
struct iguana_pkhash *iguana_pkhashfind(struct iguana_info *coin,struct iguana_ramchain **ramchainp,int64_t *balancep,uint32_t *lastunspentindp,struct iguana_pkhash *p,uint8_t rmd160[20],int32_t firsti,int32_t endi) struct iguana_pkhash *iguana_pkhashfind(struct iguana_info *coin,struct iguana_ramchain **ramchainp,int64_t *balancep,uint32_t *lastunspentindp,struct iguana_pkhash *p,uint8_t rmd160[20],int32_t firsti,int32_t endi)
{ {
uint8_t *PKbits; struct iguana_pkhash *P; uint32_t pkind,i; struct iguana_bundle *bp; struct iguana_ramchain *ramchain; struct iguana_account *ACCTS; uint8_t *PKbits; struct iguana_pkhash *P; uint32_t pkind,numpkinds,i; struct iguana_bundle *bp; struct iguana_ramchain *ramchain; struct iguana_account *ACCTS;
*balancep = 0; *balancep = 0;
*ramchainp = 0; *ramchainp = 0;
*lastunspentindp = 0; *lastunspentindp = 0;
@ -214,10 +258,11 @@ struct iguana_pkhash *iguana_pkhashfind(struct iguana_info *coin,struct iguana_r
ramchain = (bp->isRT != 0) ? &bp->ramchain : &coin->RTramchain; ramchain = (bp->isRT != 0) ? &bp->ramchain : &coin->RTramchain;
if ( ramchain->H.data != 0 ) if ( ramchain->H.data != 0 )
{ {
numpkinds = (bp->isRT != 0) ? ramchain->H.data->numpkinds : ramchain->pkind;
PKbits = (void *)(long)((long)ramchain->H.data + ramchain->H.data->PKoffset); PKbits = (void *)(long)((long)ramchain->H.data + ramchain->H.data->PKoffset);
P = (void *)(long)((long)ramchain->H.data + ramchain->H.data->Poffset); P = (void *)(long)((long)ramchain->H.data + ramchain->H.data->Poffset);
ACCTS = (void *)(long)((long)ramchain->H.data + ramchain->H.data->Aoffset); ACCTS = (void *)(long)((long)ramchain->H.data + ramchain->H.data->Aoffset);
if ( (pkind= iguana_sparseaddpk(PKbits,ramchain->H.data->pksparsebits,ramchain->H.data->numpksparse,rmd160,P,0)) > 0 && pkind < ramchain->H.data->numpkinds ) if ( (pkind= iguana_sparseaddpk(PKbits,ramchain->H.data->pksparsebits,ramchain->H.data->numpksparse,rmd160,P,0)) > 0 && pkind < numpkinds )
{ {
*ramchainp = ramchain; *ramchainp = ramchain;
*balancep = ACCTS[pkind].total; *balancep = ACCTS[pkind].total;
@ -233,7 +278,7 @@ struct iguana_pkhash *iguana_pkhashfind(struct iguana_info *coin,struct iguana_r
char *iguana_bundleaddrs(struct iguana_info *coin,int32_t hdrsi) char *iguana_bundleaddrs(struct iguana_info *coin,int32_t hdrsi)
{ {
uint8_t *PKbits; struct iguana_pkhash *P; uint32_t pkind; struct iguana_bundle *bp; struct iguana_ramchain *ramchain; cJSON *retjson; char rmdstr[41]; uint8_t *PKbits; struct iguana_pkhash *P; uint32_t pkind,numpkinds; struct iguana_bundle *bp; struct iguana_ramchain *ramchain; cJSON *retjson; char rmdstr[41];
if ( (bp= coin->bundles[hdrsi]) != 0 ) if ( (bp= coin->bundles[hdrsi]) != 0 )
{ {
if ( bp->isRT != 0 && coin->RTramchain_busy != 0 ) if ( bp->isRT != 0 && coin->RTramchain_busy != 0 )
@ -244,10 +289,11 @@ char *iguana_bundleaddrs(struct iguana_info *coin,int32_t hdrsi)
ramchain = (bp->isRT != 0) ? &bp->ramchain : &coin->RTramchain; ramchain = (bp->isRT != 0) ? &bp->ramchain : &coin->RTramchain;
if ( ramchain->H.data != 0 ) if ( ramchain->H.data != 0 )
{ {
numpkinds = (bp->isRT != 0) ? ramchain->H.data->numpkinds : ramchain->pkind;
retjson = cJSON_CreateArray(); retjson = cJSON_CreateArray();
PKbits = (void *)(long)((long)ramchain->H.data + ramchain->H.data->PKoffset); PKbits = (void *)(long)((long)ramchain->H.data + ramchain->H.data->PKoffset);
P = (void *)(long)((long)ramchain->H.data + ramchain->H.data->Poffset); P = (void *)(long)((long)ramchain->H.data + ramchain->H.data->Poffset);
for (pkind=0; pkind<ramchain->H.data->numpkinds; pkind++,P++) for (pkind=0; pkind<numpkinds; pkind++,P++)
{ {
init_hexbytes_noT(rmdstr,P->rmd160,20); init_hexbytes_noT(rmdstr,P->rmd160,20);
jaddistr(retjson,rmdstr); jaddistr(retjson,rmdstr);
@ -259,7 +305,7 @@ char *iguana_bundleaddrs(struct iguana_info *coin,int32_t hdrsi)
} return(clonestr("{\"error\":\"no bundle\"}")); } return(clonestr("{\"error\":\"no bundle\"}"));
} }
int64_t iguana_pkhashbalance(struct iguana_info *coin,cJSON *array,int64_t *spentp,int32_t *nump,struct iguana_ramchain *ramchain,struct iguana_pkhash *p,uint32_t lastunspentind,uint8_t rmd160[20],char *coinaddr,uint8_t *pubkey33,int32_t hdrsi) int64_t iguana_pkhashbalance(struct iguana_info *coin,cJSON *array,int64_t *spentp,int32_t *nump,struct iguana_ramchain *ramchain,struct iguana_pkhash *p,uint32_t lastunspentind,uint8_t rmd160[20],char *coinaddr,uint8_t *pubkey33,int32_t hdrsi,int32_t height)
{ {
struct iguana_unspent *U; uint32_t unspentind; int64_t balance = 0; struct iguana_txid *T; struct iguana_unspent *U; uint32_t unspentind; int64_t balance = 0; struct iguana_txid *T;
*spentp = *nump = 0; *spentp = *nump = 0;
@ -280,6 +326,7 @@ int64_t iguana_pkhashbalance(struct iguana_info *coin,cJSON *array,int64_t *spen
{ {
(*nump)++; (*nump)++;
printf("%s u.%d %.8f\n",jprint(iguana_unspentjson(coin,hdrsi,unspentind,T,&U[unspentind],rmd160,coinaddr,pubkey33),1),unspentind,dstr(U[unspentind].value)); printf("%s u.%d %.8f\n",jprint(iguana_unspentjson(coin,hdrsi,unspentind,T,&U[unspentind],rmd160,coinaddr,pubkey33),1),unspentind,dstr(U[unspentind].value));
//if ( iguana_spentflag(coin,ramchain,unspentind,height) == 0 )
if ( ramchain->Uextras[unspentind].spentflag == 0 ) if ( ramchain->Uextras[unspentind].spentflag == 0 )
{ {
balance += U[unspentind].value; balance += U[unspentind].value;
@ -303,7 +350,7 @@ int32_t iguana_pkhasharray(struct iguana_info *coin,cJSON *array,int32_t minconf
{ {
if ( iguana_pkhashfind(coin,&ramchain,&balance,&lastunspentind,&P[n],rmd160,i,i) != 0 ) if ( iguana_pkhashfind(coin,&ramchain,&balance,&lastunspentind,&P[n],rmd160,i,i) != 0 )
{ {
if ( (netbalance= iguana_pkhashbalance(coin,array,&spent,&m,ramchain,&P[n],lastunspentind,rmd160,coinaddr,pubkey33,i)) != balance-spent ) if ( (netbalance= iguana_pkhashbalance(coin,array,&spent,&m,ramchain,&P[n],lastunspentind,rmd160,coinaddr,pubkey33,i,0)) != balance-spent )
{ {
printf("pkhash balance mismatch from m.%d check %.8f vs %.8f spent %.8f [%.8f]\n",m,dstr(netbalance),dstr(balance),dstr(spent),dstr(balance)-dstr(spent)); printf("pkhash balance mismatch from m.%d check %.8f vs %.8f spent %.8f [%.8f]\n",m,dstr(netbalance),dstr(balance),dstr(spent),dstr(balance)-dstr(spent));
} }

5
iguana/main.c

@ -375,9 +375,9 @@ void mainloop(struct supernet_info *myinfo)
} }
if ( (bp= coin->current) != 0 && coin->stucktime != 0 && coin->isRT == 0 && coin->RTheight == 0 && (time(NULL) - coin->stucktime) > coin->MAXSTUCKTIME ) if ( (bp= coin->current) != 0 && coin->stucktime != 0 && coin->isRT == 0 && coin->RTheight == 0 && (time(NULL) - coin->stucktime) > coin->MAXSTUCKTIME )
{ {
printf("%s is stuck too long, restarting\n",coin->symbol);
if ( bp->emitfinish == 0 ) if ( bp->emitfinish == 0 )
{ {
printf("%s is stuck too long, purging files for %d\n",coin->symbol,bp->hdrsi);
iguana_bundlepurgefiles(coin,bp); iguana_bundlepurgefiles(coin,bp);
for (j=0; j<bp->n; j++) for (j=0; j<bp->n; j++)
if ( (block= bp->blocks[j]) != 0 ) if ( (block= bp->blocks[j]) != 0 )
@ -386,10 +386,9 @@ void mainloop(struct supernet_info *myinfo)
block->RO.recvlen = 0; block->RO.recvlen = 0;
block->fpos = -1; block->fpos = -1;
} }
}
//iguana_coinpurge(coin);
sleep(5); sleep(5);
} }
}
coin->RTramchain_busy = (coin->RTgenesis == 0 || queue_size(&balancesQ) != 0); coin->RTramchain_busy = (coin->RTgenesis == 0 || queue_size(&balancesQ) != 0);
} }
} }

Loading…
Cancel
Save