Browse Source

test

release/v0.1
jl777 8 years ago
parent
commit
704a7e08c2
  1. 14
      iguana/iguana_bundles.c
  2. 12
      iguana/iguana_payments.c
  3. 296
      iguana/iguana_ramchain.c
  4. 16
      iguana/iguana_scripts.c
  5. 31
      iguana/iguana_spendvectors.c
  6. 56
      iguana/iguana_txidfind.c
  7. 23
      iguana/iguana_unspents.c
  8. 19
      iguana/iguana_volatiles.c

14
iguana/iguana_bundles.c

@ -422,7 +422,7 @@ struct iguana_txid *iguana_bundletx(struct iguana_info *coin,struct iguana_bundl
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,numpkinds; 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; struct iguana_ramchaindata *rdata; cJSON *retjson; char rmdstr[41];
if ( (bp= coin->bundles[hdrsi]) != 0 ) if ( (bp= coin->bundles[hdrsi]) != 0 )
{ {
if ( 0 && coin->RTramchain_busy != 0 ) if ( 0 && coin->RTramchain_busy != 0 )
@ -431,14 +431,14 @@ char *iguana_bundleaddrs(struct iguana_info *coin,int32_t hdrsi)
return(0); return(0);
} }
ramchain = &bp->ramchain;//(bp->isRT != 0) ? &bp->ramchain : &coin->RTramchain; ramchain = &bp->ramchain;//(bp->isRT != 0) ? &bp->ramchain : &coin->RTramchain;
if ( ramchain->H.data != 0 ) if ( (rdata= ramchain->H.data) != 0 )
{ {
numpkinds = ramchain->H.data->numpkinds;//(bp->isRT != 0) ? ramchain->H.data->numpkinds : ramchain->pkind; numpkinds = rdata->numpkinds;//(bp->isRT != 0) ? rdata->numpkinds : ramchain->pkind;
retjson = cJSON_CreateArray(); retjson = cJSON_CreateArray();
PKbits = RAMCHAIN_PTR(ramchain->H.data,PKoffset); PKbits = RAMCHAIN_PTR(rdata,PKoffset);
P = RAMCHAIN_PTR(ramchain->H.data,Poffset); P = RAMCHAIN_PTR(rdata,Poffset);
//PKbits = (void *)(long)((long)ramchain->H.data + ramchain->H.data->PKoffset); //PKbits = (void *)(long)((long)rdata + rdata->PKoffset);
//P = (void *)(long)((long)ramchain->H.data + ramchain->H.data->Poffset); //P = (void *)(long)((long)rdata + rdata->Poffset);
for (pkind=0; pkind<numpkinds; pkind++,P++) for (pkind=0; pkind<numpkinds; pkind++,P++)
{ {
init_hexbytes_noT(rmdstr,P->rmd160,20); init_hexbytes_noT(rmdstr,P->rmd160,20);

12
iguana/iguana_payments.c

@ -202,7 +202,7 @@ int32_t iguana_bestunspent(struct iguana_info *coin,int32_t *aboveip,int64_t *ab
cJSON *iguana_inputsjson(struct supernet_info *myinfo,struct iguana_info *coin,int64_t *totalp,uint64_t amount,int64_t *unspents,int32_t num) cJSON *iguana_inputsjson(struct supernet_info *myinfo,struct iguana_info *coin,int64_t *totalp,uint64_t amount,int64_t *unspents,int32_t num)
{ {
cJSON *item,*vins,*sobj; uint8_t spendscript[IGUANA_MAXSCRIPTSIZE]; struct iguana_txid *T; struct iguana_unspent *U,*u; struct iguana_bundle *bp; struct iguana_ramchain *ramchain; char coinaddr[64],hexstr[IGUANA_MAXSCRIPTSIZE*2+1]; int32_t height,abovei,belowi,i,spendlen,ind,hdrsi; uint32_t txidind,unspentind; int64_t value,above,below,total = 0; int64_t remains = amount; cJSON *item,*vins,*sobj; uint8_t spendscript[IGUANA_MAXSCRIPTSIZE]; struct iguana_txid *T; struct iguana_unspent *U,*u; struct iguana_bundle *bp; struct iguana_ramchain *ramchain; char coinaddr[64],hexstr[IGUANA_MAXSCRIPTSIZE*2+1]; int32_t height,abovei,belowi,i,spendlen,ind,hdrsi; uint32_t txidind,unspentind; struct iguana_ramchaindata *rdata; int64_t value,above,below,total = 0; int64_t remains = amount;
*totalp = 0; *totalp = 0;
vins = cJSON_CreateArray(); vins = cJSON_CreateArray();
for (i=0; i<num; i++) for (i=0; i<num; i++)
@ -228,12 +228,14 @@ cJSON *iguana_inputsjson(struct supernet_info *myinfo,struct iguana_info *coin,i
return(0); return(0);
} }
ramchain = &bp->ramchain; ramchain = &bp->ramchain;
U = RAMCHAIN_PTR(ramchain->H.data,Uoffset); if ( (rdata= ramchain->H.data) == 0 )
T = RAMCHAIN_PTR(ramchain->H.data,Toffset); continue;
if ( unspentind > 0 && unspentind < ramchain->H.data->numunspents ) U = RAMCHAIN_PTR(rdata,Uoffset);
T = RAMCHAIN_PTR(rdata,Toffset);
if ( unspentind > 0 && unspentind < rdata->numunspents )
{ {
u = &U[unspentind]; u = &U[unspentind];
if ( (txidind= u->txidind) > 0 && txidind < ramchain->H.data->numtxids ) if ( (txidind= u->txidind) > 0 && txidind < rdata->numtxids )
{ {
if ( iguana_unspentindfind(coin,coinaddr,spendscript,&spendlen,&amount,&height,T[txidind].txid,u->vout,coin->bundlescount-1) == unspentind && spendlen > 0 ) if ( iguana_unspentindfind(coin,coinaddr,spendscript,&spendlen,&amount,&height,T[txidind].txid,u->vout,coin->bundlescount-1) == unspentind && spendlen > 0 )
{ {

296
iguana/iguana_ramchain.c

@ -164,7 +164,7 @@ int32_t iguana_peerfile_exists(struct iguana_info *coin,struct iguana_peer *addr
uint32_t iguana_ramchain_addtxid(struct iguana_info *coin,RAMCHAIN_FUNC,bits256 txid,int32_t numvouts,int32_t numvins,uint32_t locktime,uint32_t version,uint32_t timestamp,int16_t bundlei) uint32_t iguana_ramchain_addtxid(struct iguana_info *coin,RAMCHAIN_FUNC,bits256 txid,int32_t numvouts,int32_t numvins,uint32_t locktime,uint32_t version,uint32_t timestamp,int16_t bundlei)
{ {
uint32_t txidind; struct iguana_txid *t; struct iguana_kvitem *ptr; uint32_t txidind; struct iguana_txid *t; struct iguana_kvitem *ptr; struct iguana_ramchaindata *rdata;
if ( sizeof(*t) != 64 ) if ( sizeof(*t) != 64 )
printf("sizeof iguana_txid.%d != 64?\n",(int32_t)sizeof(*t)); printf("sizeof iguana_txid.%d != 64?\n",(int32_t)sizeof(*t));
txidind = ramchain->H.txidind; txidind = ramchain->H.txidind;
@ -191,8 +191,8 @@ uint32_t iguana_ramchain_addtxid(struct iguana_info *coin,RAMCHAIN_FUNC,bits256
printf("addtxid error: t->txidind %u != %u txidind || t->firstvout %u != %u ramchain->H.unspentind || t->firstvin %u != %u ramchain->H.spendind || t->bundlei %u != %u bundlei\n",t->txidind,txidind,t->firstvout,ramchain->H.unspentind,t->firstvin,ramchain->H.spendind,t->bundlei,bundlei); printf("addtxid error: t->txidind %u != %u txidind || t->firstvout %u != %u ramchain->H.unspentind || t->firstvin %u != %u ramchain->H.spendind || t->bundlei %u != %u bundlei\n",t->txidind,txidind,t->firstvout,ramchain->H.unspentind,t->firstvin,ramchain->H.spendind,t->bundlei,bundlei);
return(0); return(0);
} }
if ( ramchain->expanded != 0 ) if ( ramchain->expanded != 0 && (rdata= ramchain->H.data) != 0 )
iguana_sparseaddtx(TXbits,ramchain->H.data->txsparsebits,ramchain->H.data->numtxsparse,txid,T,txidind,ramchain); iguana_sparseaddtx(TXbits,rdata->txsparsebits,rdata->numtxsparse,txid,T,txidind,ramchain);
//if ( txidind <= 2 ) //if ( txidind <= 2 )
// printf("%p TXID.[%d] firstvout.%d/%d firstvin.%d/%d\n",t,txidind,ramchain->unspentind,numvouts,ramchain->spendind,numvins); // printf("%p TXID.[%d] firstvout.%d/%d firstvin.%d/%d\n",t,txidind,ramchain->unspentind,numvouts,ramchain->spendind,numvins);
} }
@ -213,8 +213,8 @@ uint32_t iguana_ramchain_addtxid(struct iguana_info *coin,RAMCHAIN_FUNC,bits256
uint32_t iguana_ramchain_addpkhash(struct iguana_info *coin,RAMCHAIN_FUNC,uint8_t *rmd160,int32_t pubkeyind,uint32_t unspentind,uint32_t pkind) uint32_t iguana_ramchain_addpkhash(struct iguana_info *coin,RAMCHAIN_FUNC,uint8_t *rmd160,int32_t pubkeyind,uint32_t unspentind,uint32_t pkind)
{ {
struct iguana_kvitem *ptr; uint32_t i; struct iguana_kvitem *ptr; uint32_t i; struct iguana_ramchaindata *rdata;
if ( ramchain->expanded != 0 && (ptr= iguana_hashfind(ramchain,'P',rmd160)) == 0 ) if ( ramchain->expanded != 0 && (ptr= iguana_hashfind(ramchain,'P',rmd160)) == 0 && (rdata= ramchain->H.data) != 0 )
{ {
if ( ramchain->H.ROflag != 0 ) if ( ramchain->H.ROflag != 0 )
{ {
@ -252,7 +252,7 @@ uint32_t iguana_ramchain_addpkhash(struct iguana_info *coin,RAMCHAIN_FUNC,uint8_
// printf("%02x",rmd160[i]); // printf("%02x",rmd160[i]);
//printf(" -> rmd160 pkind.%d \n",pkind); //printf(" -> rmd160 pkind.%d \n",pkind);
if ( ramchain->expanded != 0 ) if ( ramchain->expanded != 0 )
iguana_sparseaddpk(PKbits,ramchain->H.data->pksparsebits,ramchain->H.data->numpksparse,rmd160,P,pkind,ramchain); iguana_sparseaddpk(PKbits,rdata->pksparsebits,rdata->numpksparse,rmd160,P,pkind,ramchain);
} }
if ( (ptr= iguana_hashsetPT(ramchain,'P',&P[pkind],pkind)) == 0 ) if ( (ptr= iguana_hashsetPT(ramchain,'P',&P[pkind],pkind)) == 0 )
{ {
@ -370,10 +370,6 @@ uint32_t iguana_ramchain_addunspent(struct iguana_info *coin,RAMCHAIN_FUNC,uint6
printf("addunspent error getting pkind\n"); printf("addunspent error getting pkind\n");
return(0); return(0);
} }
if ( 0 )
{
printf(" ROflag.%d pkind.%d unspentind.%d vout.%d %.8f script[%d] uoffset.%d %d:%d type.%d A.%p\n",ramchain->H.ROflag,pkind,unspentind,vout,dstr(value),scriptlen,u->scriptpos,ramchain->H.scriptoffset,ramchain->H.data->scriptspace,type,A);
}
if ( ramchain->H.ROflag != 0 ) if ( ramchain->H.ROflag != 0 )
{ {
/*if ( Kspace != 0 && ((u->scriptoffset != 0 && scriptlen > 0) || type == IGUANA_SCRIPT_76AC) ) /*if ( Kspace != 0 && ((u->scriptoffset != 0 && scriptlen > 0) || type == IGUANA_SCRIPT_76AC) )
@ -413,17 +409,17 @@ uint32_t iguana_ramchain_addunspent(struct iguana_info *coin,RAMCHAIN_FUNC,uint6
int32_t iguana_ramchain_txid(struct iguana_info *coin,RAMCHAIN_FUNC,bits256 *txidp,struct iguana_spend *s) int32_t iguana_ramchain_txid(struct iguana_info *coin,RAMCHAIN_FUNC,bits256 *txidp,struct iguana_spend *s)
{ {
uint32_t ind,external; uint32_t ind,external; struct iguana_ramchaindata *rdata;
memset(txidp,0,sizeof(*txidp)); memset(txidp,0,sizeof(*txidp));
//printf("s.%p ramchaintxid vout.%x spendtxidind.%d numexternals.%d isext.%d numspendinds.%d\n",s,s->vout,s->spendtxidind,ramchain->numexternaltxids,s->external,ramchain->numspends); //printf("s.%p ramchaintxid vout.%x spendtxidind.%d numexternals.%d isext.%d numspendinds.%d\n",s,s->vout,s->spendtxidind,ramchain->numexternaltxids,s->external,ramchain->numspends);
if ( s->prevout < 0 ) if ( s->prevout < 0 || (rdata= ramchain->H.data) == 0 )
return(-1); return(-1);
ind = s->spendtxidind; ind = s->spendtxidind;
external = (ind >> 31) & 1; external = (ind >> 31) & 1;
ind &= ~(1 << 31); ind &= ~(1 << 31);
if ( s->external != 0 && s->external == external && ind < ramchain->H.data->numexternaltxids ) if ( s->external != 0 && s->external == external && ind < rdata->numexternaltxids )
{ {
//printf("ind.%d externalind.%d X[%d]\n",ind,ramchain->externalind,ramchain->H.data->numexternaltxids); //printf("ind.%d externalind.%d X[%d]\n",ind,ramchain->externalind,rdata->numexternaltxids);
*txidp = X[ind]; *txidp = X[ind];
return(s->prevout); return(s->prevout);
} }
@ -437,8 +433,9 @@ int32_t iguana_ramchain_txid(struct iguana_info *coin,RAMCHAIN_FUNC,bits256 *txi
uint32_t iguana_ramchain_addspend(struct iguana_info *coin,RAMCHAIN_FUNC,bits256 prev_hash,int32_t prev_vout,uint32_t sequence,int32_t hdrsi,uint16_t fileid,uint64_t scriptpos,int32_t vinscriptlen) uint32_t iguana_ramchain_addspend(struct iguana_info *coin,RAMCHAIN_FUNC,bits256 prev_hash,int32_t prev_vout,uint32_t sequence,int32_t hdrsi,uint16_t fileid,uint64_t scriptpos,int32_t vinscriptlen)
{ {
struct iguana_spend *s; struct iguana_kvitem *ptr = 0; bits256 txid; struct iguana_spend *s; struct iguana_kvitem *ptr = 0; bits256 txid; uint32_t spendind,unspentind,txidind=0,pkind,external=0; uint64_t value = 0; struct iguana_ramchaindata *rdata;
uint32_t spendind,unspentind,txidind=0,pkind,external=0; uint64_t value = 0; if ( (rdata= ramchain->H.data) == 0 )
return(0);
// uint8_t _script[IGUANA_MAXSCRIPTSIZE]; int32_t metalen,i,checklen; // uint8_t _script[IGUANA_MAXSCRIPTSIZE]; int32_t metalen,i,checklen;
spendind = ramchain->H.spendind++; spendind = ramchain->H.spendind++;
s = &Sx[spendind]; s = &Sx[spendind];
@ -454,7 +451,7 @@ uint32_t iguana_ramchain_addspend(struct iguana_info *coin,RAMCHAIN_FUNC,bits256
{ {
if ( memcmp(X[txidind].bytes,prev_hash.bytes,sizeof(prev_hash)) != 0 ) if ( memcmp(X[txidind].bytes,prev_hash.bytes,sizeof(prev_hash)) != 0 )
{ {
char str[65],str2[65]; printf("iguana_ramchain_addspend X[%d] of %d cmperror %s vs %s\n",txidind,ramchain->H.data->numexternaltxids,bits256_str(str,X[txidind]),bits256_str(str2,prev_hash)); char str[65],str2[65]; printf("iguana_ramchain_addspend X[%d] of %d cmperror %s vs %s\n",txidind,rdata->numexternaltxids,bits256_str(str,X[txidind]),bits256_str(str2,prev_hash));
return(0); return(0);
} }
} else X[txidind] = prev_hash; } else X[txidind] = prev_hash;
@ -471,18 +468,18 @@ uint32_t iguana_ramchain_addspend(struct iguana_info *coin,RAMCHAIN_FUNC,bits256
printf("unexpected addspend case: null ptr prev.%d [%d] s%u\n",prev_vout,hdrsi,spendind); printf("unexpected addspend case: null ptr prev.%d [%d] s%u\n",prev_vout,hdrsi,spendind);
if ( prev_vout >= 0 && (external= ((txidind >> 31) & 1)) == 0 ) if ( prev_vout >= 0 && (external= ((txidind >> 31) & 1)) == 0 )
{ {
if ( txidind > 0 && txidind < ramchain->H.data->numtxids ) if ( txidind > 0 && txidind < rdata->numtxids )
{ {
if ( (unspentind= T[txidind].firstvout + prev_vout) > 0 && unspentind < ramchain->H.data->numunspents ) if ( (unspentind= T[txidind].firstvout + prev_vout) > 0 && unspentind < rdata->numunspents )
{ {
value = Ux[unspentind].value; value = Ux[unspentind].value;
if ( (pkind= Ux[unspentind].pkind) == 0 || pkind >= ramchain->H.data->numpkinds ) if ( (pkind= Ux[unspentind].pkind) == 0 || pkind >= rdata->numpkinds )
{ {
printf("spendind.%d -> unspendind.%d %.8f -> pkind.0x%x\n",spendind,unspentind,dstr(value),pkind); printf("spendind.%d -> unspendind.%d %.8f -> pkind.0x%x\n",spendind,unspentind,dstr(value),pkind);
return(0); return(0);
} }
} else printf("addspend illegal unspentind.%d vs %d\n",unspentind,ramchain->H.data->numunspents); } else printf("addspend illegal unspentind.%d vs %d\n",unspentind,rdata->numunspents);
} else printf("addspend illegal txidind.%d vs %d\n",txidind,ramchain->H.data->numtxids), exit(-1); } else printf("addspend illegal txidind.%d vs %d\n",txidind,rdata->numtxids), exit(-1);
} }
if ( ramchain->H.ROflag != 0 ) if ( ramchain->H.ROflag != 0 )
{ {
@ -492,7 +489,7 @@ uint32_t iguana_ramchain_addspend(struct iguana_info *coin,RAMCHAIN_FUNC,bits256
char str[65],str2[65]; printf("ramchain_addspend RO value mismatch diffseq.%x v %x (%d) vs (%d) %s vs %s\n",s->sequenceid,sequence,s->prevout,prev_vout,bits256_str(str,txid),bits256_str(str2,prev_hash)); char str[65],str2[65]; printf("ramchain_addspend RO value mismatch diffseq.%x v %x (%d) vs (%d) %s vs %s\n",s->sequenceid,sequence,s->prevout,prev_vout,bits256_str(str,txid),bits256_str(str2,prev_hash));
return(0); return(0);
} }
/*if ( (checklen= iguana_vinscriptdecode(coin,ramchain,&metalen,_script,&Kspace[ramchain->H.data->scriptspace],Kspace,s)) != vinscriptlen || (vinscript != 0 && memcmp(_script,vinscript,vinscriptlen) != 0) ) /*if ( (checklen= iguana_vinscriptdecode(coin,ramchain,&metalen,_script,&Kspace[rdata->scriptspace],Kspace,s)) != vinscriptlen || (vinscript != 0 && memcmp(_script,vinscript,vinscriptlen) != 0) )
{ {
static uint64_t counter; static uint64_t counter;
if ( counter++ < 100 ) if ( counter++ < 100 )
@ -711,9 +708,9 @@ void *iguana_ramchain_offset(char *fname,void *dest,uint8_t *lhash,FILE *fp,uint
int32_t iguana_ramchain_prefetch(struct iguana_info *coin,struct iguana_ramchain *ramchain,int32_t flag) int32_t iguana_ramchain_prefetch(struct iguana_info *coin,struct iguana_ramchain *ramchain,int32_t flag)
{ {
RAMCHAIN_DECLARE; RAMCHAIN_ZEROES; RAMCHAIN_DECLARE; RAMCHAIN_ZEROES;
struct iguana_pkhash p; struct iguana_unspent u; struct iguana_txid txid; uint32_t i,numpkinds,numtxids,numunspents,numexternal,tlen,plen,nonz=0; uint8_t *ptr; struct iguana_pkhash p; struct iguana_unspent u; struct iguana_txid txid; uint32_t i,numpkinds,numtxids,numunspents,numexternal,tlen,plen,nonz=0; uint8_t *ptr; struct iguana_ramchaindata *rdata;
//return(0); //return(0);
if ( ramchain->H.data != 0 ) if ( (rdata= ramchain->H.data) != 0 )
{ {
if ( flag == 0 ) if ( flag == 0 )
{ {
@ -725,15 +722,12 @@ int32_t iguana_ramchain_prefetch(struct iguana_info *coin,struct iguana_ramchain
else if ( (flag & 1) != 0 ) else if ( (flag & 1) != 0 )
{ {
//printf("nonz.%d of %d\n",nonz,(int32_t)ramchain->filesize); //printf("nonz.%d of %d\n",nonz,(int32_t)ramchain->filesize);
X = RAMCHAIN_PTR(ramchain->H.data,Xoffset); X = RAMCHAIN_PTR(rdata,Xoffset);
T = RAMCHAIN_PTR(ramchain->H.data,Toffset); T = RAMCHAIN_PTR(rdata,Toffset);
TXbits = RAMCHAIN_PTR(ramchain->H.data,TXoffset); TXbits = RAMCHAIN_PTR(rdata,TXoffset);
//X = (void *)(long)((long)ramchain->H.data + ramchain->H.data->Xoffset); numtxids = rdata->numtxids;
//T = (void *)(long)((long)ramchain->H.data + ramchain->H.data->Toffset); numexternal = rdata->numexternaltxids;
//TXbits = (void *)(long)((long)ramchain->H.data + ramchain->H.data->TXoffset); tlen = (rdata->numtxsparse * rdata->txsparsebits) >> 3;
numtxids = ramchain->H.data->numtxids;
numexternal = ramchain->H.data->numexternaltxids;
tlen = (ramchain->H.data->numtxsparse * ramchain->H.data->txsparsebits) >> 3;
for (i=0; i<numtxids; i++) for (i=0; i<numtxids; i++)
{ {
memcpy(&txid,&T[i],sizeof(txid)); memcpy(&txid,&T[i],sizeof(txid));
@ -752,9 +746,8 @@ int32_t iguana_ramchain_prefetch(struct iguana_info *coin,struct iguana_ramchain
} }
else if ( (flag & 2) != 0 ) else if ( (flag & 2) != 0 )
{ {
U = RAMCHAIN_PTR(ramchain->H.data,Uoffset); U = RAMCHAIN_PTR(rdata,Uoffset);
//U = (void *)(long)((long)ramchain->H.data + ramchain->H.data->Uoffset); numunspents = rdata->numunspents;
numunspents = ramchain->H.data->numunspents;
for (i=0; i<numunspents; i++) for (i=0; i<numunspents; i++)
{ {
memcpy(&u,&U[i],sizeof(u)); memcpy(&u,&U[i],sizeof(u));
@ -764,12 +757,10 @@ int32_t iguana_ramchain_prefetch(struct iguana_info *coin,struct iguana_ramchain
} }
else if ( (flag & 4) != 0 ) else if ( (flag & 4) != 0 )
{ {
P = RAMCHAIN_PTR(ramchain->H.data,Poffset); P = RAMCHAIN_PTR(rdata,Poffset);
PKbits = RAMCHAIN_PTR(ramchain->H.data,PKoffset); PKbits = RAMCHAIN_PTR(rdata,PKoffset);
//P = (void *)(long)((long)ramchain->H.data + ramchain->H.data->Poffset); numpkinds = rdata->numpkinds;
//PKbits = (void *)(long)((long)ramchain->H.data + ramchain->H.data->PKoffset); plen = (rdata->numpksparse * rdata->pksparsebits) >> 3;
numpkinds = ramchain->H.data->numpkinds;
plen = (ramchain->H.data->numpksparse * ramchain->H.data->pksparsebits) >> 3;
for (i=0; i<numpkinds; i++) for (i=0; i<numpkinds; i++)
{ {
memcpy(&p,&P[i],sizeof(p)); memcpy(&p,&P[i],sizeof(p));
@ -781,7 +772,7 @@ int32_t iguana_ramchain_prefetch(struct iguana_info *coin,struct iguana_ramchain
nonz++; nonz++;
} }
} }
//printf("PREFETCH.[%d] flag.%d -> nonz.%d\n",ramchain->H.data->height,flag,nonz); //printf("PREFETCH.[%d] flag.%d -> nonz.%d\n",rdata->height,flag,nonz);
return(nonz); return(nonz);
} }
@ -901,10 +892,13 @@ int64_t iguana_ramchain_action(char *fname,RAMCHAIN_FUNC,FILE *fp,bits256 lhashe
int64_t iguana_ramchain_size(char *fname,RAMCHAIN_FUNC,int32_t numblocks,int32_t scriptspace,uint8_t zcash) int64_t iguana_ramchain_size(char *fname,RAMCHAIN_FUNC,int32_t numblocks,int32_t scriptspace,uint8_t zcash)
{ {
int64_t allocsize; int64_t allocsize = -1; struct iguana_ramchaindata *rdata;
allocsize = iguana_ramchain_action(fname,RAMCHAIN_ARG,0,0,0,0,ramchain->H.data,numblocks,scriptspace,zcash); if ( (rdata= ramchain->H.data) != 0 )
{
allocsize = iguana_ramchain_action(fname,RAMCHAIN_ARG,0,0,0,0,rdata,numblocks,scriptspace,zcash);
if ( 0 && ramchain->expanded != 0 ) if ( 0 && ramchain->expanded != 0 )
printf("%p iguana_ramchain_size.expanded.%d %u: Koffset.%u scriptoffset.%u stacksize.%u stackspace.%u [%u]\n",ramchain,ramchain->expanded,(int32_t)allocsize,(int32_t)ramchain->H.data->Koffset,(int32_t)ramchain->H.scriptoffset,(int32_t)ramchain->H.stacksize,(int32_t)ramchain->H.data->stackspace,scriptspace); printf("%p iguana_ramchain_size.expanded.%d %u: Koffset.%u scriptoffset.%u stacksize.%u stackspace.%u [%u]\n",ramchain,ramchain->expanded,(int32_t)allocsize,(int32_t)rdata->Koffset,(int32_t)ramchain->H.scriptoffset,(int32_t)ramchain->H.stacksize,(int32_t)rdata->stackspace,scriptspace);
}
return(allocsize); return(allocsize);
} }
@ -912,6 +906,8 @@ long iguana_ramchain_setsize(char *fname,struct iguana_ramchain *ramchain,struct
{ {
RAMCHAIN_DECLARE; RAMCHAIN_ZEROES; struct iguana_ramchaindata *rdata = ramchain->H.data; RAMCHAIN_DECLARE; RAMCHAIN_ZEROES; struct iguana_ramchaindata *rdata = ramchain->H.data;
//B = 0, Ux = 0, Sx = 0, P = 0, A = 0, X = 0, Kspace = TXbits = PKbits = 0, U = 0, S = 0, T = 0; //U2 = 0, P2 = 0, //B = 0, Ux = 0, Sx = 0, P = 0, A = 0, X = 0, Kspace = TXbits = PKbits = 0, U = 0, S = 0, T = 0; //U2 = 0, P2 = 0,
if ( rdata != 0 )
{
rdata->numtxids = ramchain->H.txidind; rdata->numtxids = ramchain->H.txidind;
rdata->numunspents = ramchain->H.unspentind; rdata->numunspents = ramchain->H.unspentind;
rdata->numspends = ramchain->H.spendind; rdata->numspends = ramchain->H.spendind;
@ -924,6 +920,7 @@ long iguana_ramchain_setsize(char *fname,struct iguana_ramchain *ramchain,struct
printf("iguana_ramchain_setsize: Koffset.%d scriptspace.%d stackspace.%d (scriptoffset.%d stacksize.%d) allocsize.%d\n",(int32_t)rdata->Koffset,(int32_t)rdata->scriptspace,(int32_t)rdata->stackspace,(int32_t)ramchain->H.scriptoffset,(int32_t)ramchain->H.stacksize,(int32_t)rdata->allocsize); printf("iguana_ramchain_setsize: Koffset.%d scriptspace.%d stackspace.%d (scriptoffset.%d stacksize.%d) allocsize.%d\n",(int32_t)rdata->Koffset,(int32_t)rdata->scriptspace,(int32_t)rdata->stackspace,(int32_t)ramchain->H.scriptoffset,(int32_t)ramchain->H.stacksize,(int32_t)rdata->allocsize);
ramchain->datasize = rdata->allocsize; ramchain->datasize = rdata->allocsize;
return((long)rdata->allocsize); return((long)rdata->allocsize);
} else return(-1);
} }
int64_t iguana_ramchain_compact(char *fname,RAMCHAIN_FUNC,struct iguana_ramchaindata *destdata,struct iguana_ramchaindata *srcdata,int32_t numblocks,uint8_t zcash) int64_t iguana_ramchain_compact(char *fname,RAMCHAIN_FUNC,struct iguana_ramchaindata *destdata,struct iguana_ramchaindata *srcdata,int32_t numblocks,uint8_t zcash)
@ -952,7 +949,7 @@ int64_t iguana_ramchain_saveaction(char *fname,RAMCHAIN_FUNC,FILE *fp,struct igu
printf("%02x",Kspace[i]); printf("%02x",Kspace[i]);
printf(" SAVEACTION: K.%d:%ld rdata.%d DEST T.%d U.%d S.%d P.%d X.%d -> size.%ld %ld vs %ld %u\n",(int32_t)rdata->Koffset,(long)Kspace-(long)rdata,(int32_t)sizeof(*rdata),rdata->numtxids,rdata->numunspents,rdata->numspends,rdata->numpkinds,rdata->numexternaltxids,(long)rdata->allocsize,(long)iguana_ramchain_size(fname,RAMCHAIN_ARG,numblocks,scriptspace,zcash),after-before+sizeof(*rdata),scriptspace); printf(" SAVEACTION: K.%d:%ld rdata.%d DEST T.%d U.%d S.%d P.%d X.%d -> size.%ld %ld vs %ld %u\n",(int32_t)rdata->Koffset,(long)Kspace-(long)rdata,(int32_t)sizeof(*rdata),rdata->numtxids,rdata->numunspents,rdata->numspends,rdata->numpkinds,rdata->numexternaltxids,(long)rdata->allocsize,(long)iguana_ramchain_size(fname,RAMCHAIN_ARG,numblocks,scriptspace,zcash),after-before+sizeof(*rdata),scriptspace);
} }
//printf("before.%ld after.%ld allocsize.%ld [%ld] %ld expanded.%d\n",before,after,(long)srcdata->allocsize,(long)ramchain->H.data->allocsize,(long)iguana_ramchain_size(ramchain),ramchain->expanded); //printf("before.%ld after.%ld allocsize.%ld [%ld] %ld expanded.%d\n",before,after,(long)srcdata->allocsize,(long)rdata->allocsize,(long)iguana_ramchain_size(ramchain),ramchain->expanded);
return(after - before); return(after - before);
} }
@ -967,6 +964,8 @@ int64_t iguana_ramchain_init(char *fname,struct iguana_ramchain *ramchain,struct
if ( (ramchain->hashmem= hashmem) != 0 ) if ( (ramchain->hashmem= hashmem) != 0 )
iguana_memreset(hashmem); iguana_memreset(hashmem);
rdata = ramchain->H.data = mem->ptr;//, offset += sizeof(struct iguana_ramchaindata); rdata = ramchain->H.data = mem->ptr;//, offset += sizeof(struct iguana_ramchaindata);
if ( rdata == 0 )
return(0);
if ( (rdata->firsti= firsti) != 0 ) if ( (rdata->firsti= firsti) != 0 )
{ {
numtxids++, numunspents++, numspends++; numtxids++, numunspents++, numspends++;
@ -1060,7 +1059,7 @@ long iguana_ramchain_save(struct iguana_info *coin,RAMCHAIN_FUNC,uint32_t ipbits
tmp = *rdata; tmp = *rdata;
iguana_ramchain_compact(fname,RAMCHAIN_ARG,&tmp,rdata,bp!=0?bp->n:1,zcash); iguana_ramchain_compact(fname,RAMCHAIN_ARG,&tmp,rdata,bp!=0?bp->n:1,zcash);
if ( 0 && ramchain->expanded != 0 ) if ( 0 && ramchain->expanded != 0 )
printf("compact.%s: Koffset.%d scriptoffset.%d stacksize.%d allocsize.%d\n",fname,(int32_t)ramchain->H.data->Koffset,ramchain->H.scriptoffset,ramchain->H.stacksize,(int32_t)ramchain->H.data->allocsize); printf("compact.%s: Koffset.%d scriptoffset.%d stacksize.%d allocsize.%d\n",fname,(int32_t)rdata->Koffset,ramchain->H.scriptoffset,ramchain->H.stacksize,(int32_t)rdata->allocsize);
if ( fwrite(&tmp,1,sizeof(tmp),fp) != sizeof(tmp) ) if ( fwrite(&tmp,1,sizeof(tmp),fp) != sizeof(tmp) )
{ {
printf("ramchain_save error writing header.%s\n",fname); printf("ramchain_save error writing header.%s\n",fname);
@ -1119,13 +1118,13 @@ int32_t iguana_ramchain_verify(struct iguana_info *coin,struct iguana_ramchain *
printf("BIP 0 detected\n"); printf("BIP 0 detected\n");
else else
{ {
char str[65]; printf("error -3: %s itemind.%d vs txidind.%d | num.%d\n",bits256_str(str,t->txid),ptr->hh.itemind,ramchain->H.txidind,ramchain->H.data->numtxids); char str[65]; printf("error -3: %s itemind.%d vs txidind.%d | num.%d\n",bits256_str(str,t->txid),ptr->hh.itemind,ramchain->H.txidind,rdata->numtxids);
return(-3); return(-3);
} }
} }
else else
{ {
char str[65]; printf("error -3: %s itemind.%d vs txidind.%d | num.%d\n",bits256_str(str,t->txid),ptr->hh.itemind,ramchain->H.txidind,ramchain->H.data->numtxids); char str[65]; printf("error -3: %s itemind.%d vs txidind.%d | num.%d\n",bits256_str(str,t->txid),ptr->hh.itemind,ramchain->H.txidind,rdata->numtxids);
//exit(-1); //exit(-1);
return(-3); return(-3);
} }
@ -1217,19 +1216,21 @@ int32_t iguana_ramchain_verify(struct iguana_info *coin,struct iguana_ramchain *
int32_t iguana_ramchain_free(struct iguana_info *coin,struct iguana_ramchain *ramchain,int32_t deleteflag) int32_t iguana_ramchain_free(struct iguana_info *coin,struct iguana_ramchain *ramchain,int32_t deleteflag)
{ {
struct iguana_kvitem *item,*tmp; struct iguana_kvitem *item,*tmp; struct iguana_ramchaindata *rdata;
if ( (rdata= ramchain->H.data) == 0 )
return(-1);
if ( ramchain->H.ROflag != 0 && ramchain->hashmem == 0 ) if ( ramchain->H.ROflag != 0 && ramchain->hashmem == 0 )
{ {
if ( ramchain->A != ramchain->creditsA ) if ( ramchain->A != ramchain->creditsA )
{ {
//printf("hashmem.%p Free A %p %p, numpkinds.%d %ld\n",ramchain->hashmem,ramchain->A,ramchain->creditsA,ramchain->H.data->numpkinds,sizeof(*ramchain->A) * ramchain->H.data->numpkinds); //printf("hashmem.%p Free A %p %p, numpkinds.%d %ld\n",ramchain->hashmem,ramchain->A,ramchain->creditsA,rdata->numpkinds,sizeof(*ramchain->A) * rdata->numpkinds);
if ( deleteflag != 0 ) if ( deleteflag != 0 )
myfree(ramchain->A,sizeof(*ramchain->A) * ramchain->H.data->numpkinds), ramchain->A = 0; myfree(ramchain->A,sizeof(*ramchain->A) * rdata->numpkinds), ramchain->A = 0;
} }
//if ( ramchain->U2 != ramchain->roU2 ) //if ( ramchain->U2 != ramchain->roU2 )
// myfree(ramchain->U2,sizeof(*ramchain->U2) * ramchain->H.data->numunspents), ramchain->U2 = 0; // myfree(ramchain->U2,sizeof(*ramchain->U2) * rdata->numunspents), ramchain->U2 = 0;
//if ( ramchain->P2 != ramchain->roP2 ) //if ( ramchain->P2 != ramchain->roP2 )
// myfree(ramchain->P2,sizeof(*ramchain->P2) * ramchain->H.data->numpkinds), ramchain->P2 = 0; // myfree(ramchain->P2,sizeof(*ramchain->P2) * rdata->numpkinds), ramchain->P2 = 0;
} }
if ( deleteflag != 0 ) if ( deleteflag != 0 )
{ {
@ -1311,17 +1312,17 @@ int32_t iguana_bundleremove(struct iguana_info *coin,int32_t hdrsi,int32_t tmpfi
int32_t iguana_ramchain_extras(struct iguana_info *coin,struct iguana_ramchain *ramchain,struct OS_memspace *hashmem,int32_t extraflag) int32_t iguana_ramchain_extras(struct iguana_info *coin,struct iguana_ramchain *ramchain,struct OS_memspace *hashmem,int32_t extraflag)
{ {
RAMCHAIN_DECLARE; int32_t err=0; RAMCHAIN_DECLARE; int32_t err=0; struct iguana_ramchaindata *rdata;
if ( ramchain->expanded != 0 ) if ( ramchain->expanded != 0 && (rdata= ramchain->H.data) != 0 )
{ {
_iguana_ramchain_setptrs(RAMCHAIN_PTRS,ramchain->H.data); _iguana_ramchain_setptrs(RAMCHAIN_PTRS,rdata);
if ( extraflag == 0 && ramchain->H.data != 0 ) if ( extraflag == 0 )
{ {
if ( (ramchain->hashmem= hashmem) != 0 ) if ( (ramchain->hashmem= hashmem) != 0 )
iguana_memreset(hashmem); iguana_memreset(hashmem);
else printf("alloc ramchain->A %d\n",(int32_t)(sizeof(struct iguana_account) * ramchain->H.data->numpkinds)); else printf("alloc ramchain->A %d\n",(int32_t)(sizeof(struct iguana_account) * rdata->numpkinds));
ramchain->A = (hashmem != 0 && hashmem->ptr != 0) ? iguana_memalloc(hashmem,sizeof(struct iguana_account) * ramchain->H.data->numpkinds,1) : mycalloc('p',ramchain->H.data->numpkinds,sizeof(struct iguana_account)); ramchain->A = (hashmem != 0 && hashmem->ptr != 0) ? iguana_memalloc(hashmem,sizeof(struct iguana_account) * rdata->numpkinds,1) : mycalloc('p',rdata->numpkinds,sizeof(struct iguana_account));
ramchain->Uextras = (hashmem != 0 && hashmem->ptr != 0) ? iguana_memalloc(hashmem,sizeof(*ramchain->Uextras) * ramchain->H.data->numunspents,1) : mycalloc('p',ramchain->H.data->numunspents,sizeof(*ramchain->Uextras)); ramchain->Uextras = (hashmem != 0 && hashmem->ptr != 0) ? iguana_memalloc(hashmem,sizeof(*ramchain->Uextras) * rdata->numunspents,1) : mycalloc('p',rdata->numunspents,sizeof(*ramchain->Uextras));
} else err = iguana_volatilesmap(coin,ramchain); } else err = iguana_volatilesmap(coin,ramchain);
} }
return(err); return(err);
@ -1367,8 +1368,9 @@ int32_t iguana_Xspendmap(struct iguana_info *coin,struct iguana_ramchain *ramcha
struct iguana_ramchain *_iguana_ramchain_map(struct iguana_info *coin,char *fname,struct iguana_bundle *bp,int32_t numblocks,struct iguana_ramchain *ramchain,struct OS_memspace *hashmem,uint32_t ipbits,bits256 hash2,bits256 prevhash2,int32_t bundlei,long fpos,int32_t allocextras,int32_t expanded,uint8_t zcash) struct iguana_ramchain *_iguana_ramchain_map(struct iguana_info *coin,char *fname,struct iguana_bundle *bp,int32_t numblocks,struct iguana_ramchain *ramchain,struct OS_memspace *hashmem,uint32_t ipbits,bits256 hash2,bits256 prevhash2,int32_t bundlei,long fpos,int32_t allocextras,int32_t expanded,uint8_t zcash)
{ {
RAMCHAIN_DECLARE; int32_t valid,iter,i,checki,hdrsi; long filesize; void *ptr; RAMCHAIN_DECLARE; int32_t valid,iter,i,checki,hdrsi; long filesize; void *ptr; char str[65],str2[65],dirstr[64]; struct iguana_block *block; struct iguana_blockRO *bRO; struct iguana_ramchaindata *rdata;
char str[65],str2[65],dirstr[64]; struct iguana_block *block; struct iguana_blockRO *bRO; if ( (rdata= ramchain->H.data) == 0 )
return(0);
/*if ( ramchain->expanded != 0 && (ramchain->sigsfileptr == 0 || ramchain->sigsfilesize == 0) ) /*if ( ramchain->expanded != 0 && (ramchain->sigsfileptr == 0 || ramchain->sigsfilesize == 0) )
{ {
sprintf(sigsfname,"sigs/%s/%s",coin->symbol,bits256_str(str,hash2)); sprintf(sigsfname,"sigs/%s/%s",coin->symbol,bits256_str(str,hash2));
@ -1410,10 +1412,10 @@ struct iguana_ramchain *_iguana_ramchain_map(struct iguana_info *coin,char *fnam
ramchain->H.ROflag = 1; ramchain->H.ROflag = 1;
ramchain->expanded = expanded; ramchain->expanded = expanded;
ramchain->numblocks = (bp == 0) ? 1 : bp->n; ramchain->numblocks = (bp == 0) ? 1 : bp->n;
//printf("ptr.%p exp.%d extra.%d %p mapped P[%d] fpos.%d + %ld -> %ld vs %ld offset.%u:%u stack.%u:%u\n",ptr,expanded,allocextras,ramchain->H.data,(int32_t)ramchain->H.data->Poffset,(int32_t)fpos,(long)ramchain->H.data->allocsize,(long)(fpos + ramchain->H.data->allocsize),ramchain->filesize,ramchain->H.scriptoffset,ramchain->H.data->scriptspace,ramchain->H.stacksize,ramchain->H.data->stackspace); //printf("ptr.%p exp.%d extra.%d %p mapped P[%d] fpos.%d + %ld -> %ld vs %ld offset.%u:%u stack.%u:%u\n",ptr,expanded,allocextras,rdata,(int32_t)rdata->Poffset,(int32_t)fpos,(long)rdata->allocsize,(long)(fpos + rdata->allocsize),ramchain->filesize,rscriptoffset,rdata->scriptspace,rstacksize,rdata->stackspace);
if ( 0 && bp != 0 ) if ( 0 && bp != 0 )
{ {
/*blocksRO = (struct iguana_blockRO *)ramchain->H.data; /*blocksRO = (struct iguana_blockRO *)rdata;
for (i=0; i<bp->n; i++) for (i=0; i<bp->n; i++)
{ {
printf("%p ",&blocksRO[i]); printf("%p ",&blocksRO[i]);
@ -1425,7 +1427,7 @@ struct iguana_ramchain *_iguana_ramchain_map(struct iguana_info *coin,char *fnam
} }
bp->blocks[i]->RO = blocksRO[i]; bp->blocks[i]->RO = blocksRO[i];
} }
ramchain->H.data = (void *)&blocksRO[bp->n];*/ rdata = (void *)&blocksRO[bp->n];*/
for (valid=0,i=bp->n-1; i>=0; i--) for (valid=0,i=bp->n-1; i>=0; i--)
{ {
if ( (block= bp->blocks[i]) != 0 ) if ( (block= bp->blocks[i]) != 0 )
@ -1443,18 +1445,18 @@ struct iguana_ramchain *_iguana_ramchain_map(struct iguana_info *coin,char *fnam
return(0); return(0);
} }
} }
_iguana_ramchain_setptrs(RAMCHAIN_PTRS,ramchain->H.data); _iguana_ramchain_setptrs(RAMCHAIN_PTRS,rdata);
if ( iguana_ramchain_size(fname,RAMCHAIN_ARG,ramchain->numblocks,ramchain->H.data->scriptspace,zcash) != ramchain->H.data->allocsize || fpos+ramchain->H.data->allocsize > filesize ) if ( iguana_ramchain_size(fname,RAMCHAIN_ARG,ramchain->numblocks,rdata->scriptspace,zcash) != rdata->allocsize || fpos+rdata->allocsize > filesize )
{ {
printf("iguana_ramchain_map.(%s) size mismatch %ld vs %ld vs filesize.%ld numblocks.%d expanded.%d fpos.%d sum %ld\n",fname,(long)iguana_ramchain_size(fname,RAMCHAIN_ARG,ramchain->numblocks,ramchain->H.data->scriptspace,zcash),(long)ramchain->H.data->allocsize,(long)filesize,ramchain->numblocks,expanded,(int32_t)fpos,(long)(fpos+ramchain->H.data->allocsize)); printf("iguana_ramchain_map.(%s) size mismatch %ld vs %ld vs filesize.%ld numblocks.%d expanded.%d fpos.%d sum %ld\n",fname,(long)iguana_ramchain_size(fname,RAMCHAIN_ARG,ramchain->numblocks,rdata->scriptspace,zcash),(long)rdata->allocsize,(long)filesize,ramchain->numblocks,expanded,(int32_t)fpos,(long)(fpos+rdata->allocsize));
//exit(-1); //exit(-1);
munmap(ramchain->fileptr,ramchain->filesize); munmap(ramchain->fileptr,ramchain->filesize);
OS_removefile(fname,0); OS_removefile(fname,0);
return(0); return(0);
} }
else if ( memcmp(hash2.bytes,ramchain->H.data->firsthash2.bytes,sizeof(bits256)) != 0 ) else if ( memcmp(hash2.bytes,rdata->firsthash2.bytes,sizeof(bits256)) != 0 )
{ {
printf("iguana_ramchain_map.(%s) hash2 mismatch %s vs %s\n",fname,bits256_str(str,hash2),bits256_str(str2,ramchain->H.data->firsthash2)); printf("iguana_ramchain_map.(%s) hash2 mismatch %s vs %s\n",fname,bits256_str(str,hash2),bits256_str(str2,rdata->firsthash2));
//munmap(ramchain->fileptr,ramchain->filesize); //munmap(ramchain->fileptr,ramchain->filesize);
return(0); return(0);
} }
@ -1462,7 +1464,7 @@ struct iguana_ramchain *_iguana_ramchain_map(struct iguana_info *coin,char *fnam
{ {
if ( allocextras > 0 ) if ( allocextras > 0 )
{ {
ramchain->height = ramchain->H.data->height; ramchain->height = rdata->height;
if ( iguana_ramchain_extras(coin,ramchain,ramchain->hashmem,allocextras) == 0 && bp != 0 ) if ( iguana_ramchain_extras(coin,ramchain,ramchain->hashmem,allocextras) == 0 && bp != 0 )
{ {
bp->balancefinish = (uint32_t)time(NULL); bp->balancefinish = (uint32_t)time(NULL);
@ -1487,7 +1489,7 @@ struct iguana_ramchain *_iguana_ramchain_map(struct iguana_info *coin,char *fnam
} }
} }
} }
//printf("iguana_ramchain_map.(%s) size %ld vs %ld vs filesize.%ld numblocks.%d expanded.%d fpos.%d sum %ld\n",fname,(long)iguana_ramchain_size(RAMCHAIN_ARG,ramchain->numblocks,ramchain->H.data->scriptspace),(long)ramchain->H.data->allocsize,(long)filesize,ramchain->numblocks,expanded,(int32_t)fpos,(long)(fpos+ramchain->H.data->allocsize)); //printf("iguana_ramchain_map.(%s) size %ld vs %ld vs filesize.%ld numblocks.%d expanded.%d fpos.%d sum %ld\n",fname,(long)iguana_ramchain_size(RAMCHAIN_ARG,ramchain->numblocks,rdata->scriptspace),(long)rdata->allocsize,(long)filesize,ramchain->numblocks,expanded,(int32_t)fpos,(long)(fpos+rdata->allocsize));
bp->Xvalid = 1; bp->Xvalid = 1;
iguana_Xspendmap(coin,ramchain,bp); iguana_Xspendmap(coin,ramchain,bp);
return(ramchain); return(ramchain);
@ -1511,14 +1513,17 @@ struct iguana_ramchain *iguana_ramchain_map(struct iguana_info *coin,char *fname
} }
void iguana_ramchain_link(struct iguana_ramchain *ramchain,bits256 firsthash2,int32_t hdrsi,int32_t height,int32_t bundlei,int32_t numblocks,int32_t firsti,int32_t ROflag) void iguana_ramchain_link(struct iguana_ramchain *ramchain,bits256 firsthash2,int32_t hdrsi,int32_t height,int32_t bundlei,int32_t numblocks,int32_t firsti,int32_t ROflag)
{
struct iguana_ramchaindata *rdata;
if ( (rdata= ramchain->H.data) != 0 )
{ {
if ( ROflag == 0 ) if ( ROflag == 0 )
{ {
ramchain->H.data->firsthash2 = firsthash2; rdata->firsthash2 = firsthash2;
//ramchain->H.data->lasthash2 = lasthash2; //rdata->lasthash2 = lasthash2;
ramchain->H.data->hdrsi = hdrsi; rdata->hdrsi = hdrsi;
ramchain->H.data->height = height; rdata->height = height;
ramchain->H.data->numblocks = numblocks; rdata->numblocks = numblocks;
} }
ramchain->H.hdrsi = hdrsi; ramchain->H.hdrsi = hdrsi;
ramchain->H.bundlei = bundlei; ramchain->H.bundlei = bundlei;
@ -1528,6 +1533,7 @@ void iguana_ramchain_link(struct iguana_ramchain *ramchain,bits256 firsthash2,in
ramchain->H.txidind = ramchain->H.unspentind = ramchain->H.spendind = ramchain->pkind = firsti; ramchain->H.txidind = ramchain->H.unspentind = ramchain->H.spendind = ramchain->pkind = firsti;
ramchain->externalind = 0;//ramchain->H.scriptoffset = ramchain->H.stacksize = 0; ramchain->externalind = 0;//ramchain->H.scriptoffset = ramchain->H.stacksize = 0;
} }
}
int32_t iguana_ramchain_cmp(struct iguana_ramchain *A,struct iguana_ramchain *B,int32_t deepflag) int32_t iguana_ramchain_cmp(struct iguana_ramchain *A,struct iguana_ramchain *B,int32_t deepflag)
{ {
@ -1618,7 +1624,7 @@ int32_t iguana_ramchain_iterate(struct iguana_info *coin,struct iguana_ramchain
bits256 prevhash; uint64_t value; uint8_t type; struct iguana_unspent *u; bits256 prevhash; uint64_t value; uint8_t type; struct iguana_unspent *u;
struct iguana_txid *tx; struct iguana_ramchaindata *rdata; uint8_t rmd160[20]; struct iguana_txid *tx; struct iguana_ramchaindata *rdata; uint8_t rmd160[20];
//if ( dest != 0 ) //if ( dest != 0 )
// printf("iterate ramchain.%p rdata.%p dest.%p ht.%d/%d txids.%p destoffset.%d\n",ramchain,ramchain->H.data,dest,bp->bundleheight,bp->n,ramchain->txids,dest->H.scriptoffset); // printf("iterate ramchain.%p rdata.%p dest.%p ht.%d/%d txids.%p destoffset.%d\n",ramchain,rdata,dest,bp->bundleheight,bp->n,ramchain->txids,dest->H.scriptoffset);
if ( (rdata= ramchain->H.data) == 0 ) if ( (rdata= ramchain->H.data) == 0 )
{ {
printf("iguana_ramchain_iterate cant iterate without data\n"); printf("iguana_ramchain_iterate cant iterate without data\n");
@ -1627,7 +1633,7 @@ int32_t iguana_ramchain_iterate(struct iguana_info *coin,struct iguana_ramchain
if ( dest != 0 ) if ( dest != 0 )
_iguana_ramchain_setptrs(RAMCHAIN_DESTPTRS,dest->H.data); _iguana_ramchain_setptrs(RAMCHAIN_DESTPTRS,dest->H.data);
//fprintf(stderr,"iterate %d/%d dest.%p ramchain.%p rdata.%p\n",bp->bundleheight,bp->n,dest,ramchain,rdata); //fprintf(stderr,"iterate %d/%d dest.%p ramchain.%p rdata.%p\n",bp->bundleheight,bp->n,dest,ramchain,rdata);
_iguana_ramchain_setptrs(RAMCHAIN_PTRS,ramchain->H.data); _iguana_ramchain_setptrs(RAMCHAIN_PTRS,rdata);
ramchain->H.ROflag = 1; ramchain->H.ROflag = 1;
ramchain->H.unspentind = ramchain->H.spendind = ramchain->pkind = rdata->firsti; ramchain->H.unspentind = ramchain->H.spendind = ramchain->pkind = rdata->firsti;
ramchain->externalind = ramchain->H.stacksize = 0; ramchain->externalind = ramchain->H.stacksize = 0;
@ -1642,7 +1648,7 @@ int32_t iguana_ramchain_iterate(struct iguana_info *coin,struct iguana_ramchain
if ( coin->active == 0 ) if ( coin->active == 0 )
return(-1);; return(-1);;
if ( 0 && ramchain->expanded == 0 && dest != 0 ) if ( 0 && ramchain->expanded == 0 && dest != 0 )
printf("ITER [%d] TXID.%d -> dest.%p desttxid.%d dest->hashmem.%p numtxids.%d\n",ramchain->H.data->height,ramchain->H.txidind,dest,dest!=0?dest->H.txidind:0,dest!=0?dest->hashmem:0,rdata->numtxids); printf("ITER [%d] TXID.%d -> dest.%p desttxid.%d dest->hashmem.%p numtxids.%d\n",rdata->height,ramchain->H.txidind,dest,dest!=0?dest->H.txidind:0,dest!=0?dest->hashmem:0,rdata->numtxids);
tx = &T[ramchain->H.txidind]; tx = &T[ramchain->H.txidind];
if ( iguana_ramchain_addtxid(coin,RAMCHAIN_ARG,tx->txid,tx->numvouts,tx->numvins,tx->locktime,tx->version,tx->timestamp,bundlei) == 0 ) if ( iguana_ramchain_addtxid(coin,RAMCHAIN_ARG,tx->txid,tx->numvouts,tx->numvins,tx->locktime,tx->version,tx->timestamp,bundlei) == 0 )
return(-1); return(-1);
@ -1651,7 +1657,7 @@ int32_t iguana_ramchain_iterate(struct iguana_info *coin,struct iguana_ramchain
{ {
//char str[65]; //char str[65];
if ( 0 && ramchain->expanded == 0 ) if ( 0 && ramchain->expanded == 0 )
printf("ITER [%d] TXID.%d -> dest.%p desttxid.%d dest->hashmem.%p numtxids.%d\n",ramchain->H.data->height,ramchain->H.txidind,dest,dest!=0?dest->H.txidind:0,dest!=0?dest->hashmem:0,rdata->numtxids); printf("ITER [%d] TXID.%d -> dest.%p desttxid.%d dest->hashmem.%p numtxids.%d\n",rdata->height,ramchain->H.txidind,dest,dest!=0?dest->H.txidind:0,dest!=0?dest->hashmem:0,rdata->numtxids);
if ( iguana_ramchain_addtxid(coin,RAMCHAIN_DESTARG,tx->txid,tx->numvouts,tx->numvins,tx->locktime,tx->version,tx->timestamp,bundlei) == 0 ) if ( iguana_ramchain_addtxid(coin,RAMCHAIN_DESTARG,tx->txid,tx->numvouts,tx->numvins,tx->locktime,tx->version,tx->timestamp,bundlei) == 0 )
return(-2); return(-2);
} }
@ -1730,7 +1736,7 @@ int32_t iguana_ramchain_iterate(struct iguana_info *coin,struct iguana_ramchain
{ {
dest->H.txidind++; dest->H.txidind++;
dest->H.spendind += tx->numvins; dest->H.spendind += tx->numvins;
} //else printf("iter scriptoffset.%u/%u stacksize.%u/%u\n",ramchain->H.scriptoffset,ramchain->H.data->scriptspace,ramchain->H.stacksize,ramchain->H.data->stackspace); } //else printf("iter scriptoffset.%u/%u stacksize.%u/%u\n",ramchain->H.scriptoffset,rdata->scriptspace,ramchain->H.stacksize,rdata->stackspace);
} }
if ( dest != 0 ) if ( dest != 0 )
{ {
@ -1753,7 +1759,7 @@ int32_t iguana_ramchain_iterate(struct iguana_info *coin,struct iguana_ramchain
fileid = Sx[ramchain->H.spendind].fileid; fileid = Sx[ramchain->H.spendind].fileid;
scriptpos = Sx[ramchain->H.spendind].scriptpos; scriptpos = Sx[ramchain->H.spendind].scriptpos;
scriptlen = Sx[ramchain->H.spendind].scriptlen; scriptlen = Sx[ramchain->H.spendind].scriptlen;
//scriptlen = iguana_vinscriptdecode(coin,ramchain,&metalen,_script,&Kspace[ramchain->H.data->scriptspace],Kspace,&Sx[ramchain->H.spendind]); //scriptlen = iguana_vinscriptdecode(coin,ramchain,&metalen,_script,&Kspace[rdata->scriptspace],Kspace,&Sx[ramchain->H.spendind]);
//scriptdata = _script; //scriptdata = _script;
prevout = iguana_ramchain_txid(coin,RAMCHAIN_ARG,&prevhash,&Sx[ramchain->H.spendind]); prevout = iguana_ramchain_txid(coin,RAMCHAIN_ARG,&prevhash,&Sx[ramchain->H.spendind]);
//fprintf(stderr,"from expanded iter\n"); //fprintf(stderr,"from expanded iter\n");
@ -1761,7 +1767,7 @@ int32_t iguana_ramchain_iterate(struct iguana_info *coin,struct iguana_ramchain
{ {
char str[65]; char str[65];
printf("hdrsi.%d txidind.%d spendind.%d spendtxid.%x %d vin.%d %s vout.%d\n",bp->bundleheight,ramchain->H.txidind,ramchain->H.spendind,Sx[ramchain->H.spendind].spendtxidind,Sx[ramchain->H.spendind].spendtxidind&0xfffffff,j,bits256_str(str,prevhash),prevout); printf("hdrsi.%d txidind.%d spendind.%d spendtxid.%x %d vin.%d %s vout.%d\n",bp->bundleheight,ramchain->H.txidind,ramchain->H.spendind,Sx[ramchain->H.spendind].spendtxidind,Sx[ramchain->H.spendind].spendtxidind&0xfffffff,j,bits256_str(str,prevhash),prevout);
//for (i=0; i<ramchain->H.data->numexternaltxids; i++) //for (i=0; i<rdata->numexternaltxids; i++)
// printf("%p X[%d] %s\n",X,i,bits256_str(str,X[i])); // printf("%p X[%d] %s\n",X,i,bits256_str(str,X[i]));
//exit(-1); //exit(-1);
iguana_ramchain_txid(coin,RAMCHAIN_ARG,&prevhash,&Sx[ramchain->H.spendind]); iguana_ramchain_txid(coin,RAMCHAIN_ARG,&prevhash,&Sx[ramchain->H.spendind]);
@ -1808,10 +1814,9 @@ long iguana_ramchain_data(struct iguana_info *coin,struct iguana_peer *addr,stru
{ {
static uint64_t totalrecv; static uint64_t totalrecv;
int32_t verifyflag = 0; int32_t verifyflag = 0;
RAMCHAIN_DECLARE; uint32_t addr_ipbits; struct iguana_ramchain R,*mapchain,*ramchain = &addr->ramchain; RAMCHAIN_DECLARE; uint32_t addr_ipbits; struct iguana_ramchain R,*mapchain,*ramchain = &addr->ramchain; struct iguana_msgtx *tx; char fname[1024]; uint8_t rmd160[20]; struct iguana_ramchaindata *rdata; int32_t i,j,fpos,pubkeysize,msize,sigsize,subdir,firsti=1,err,flag,bundlei = -2; bits256 merkle_root; struct iguana_bundle *bp = 0; struct iguana_block *block; uint32_t scriptspace,stackspace;
struct iguana_msgtx *tx; char fname[1024]; uint8_t rmd160[20]; // long fsize; void *ptr; if ( (rdata= ramchain->H.data) == 0 )
int32_t i,j,fpos,pubkeysize,msize,sigsize,subdir,firsti=1,err,flag,bundlei = -2; bits256 merkle_root; return(-1);
struct iguana_bundle *bp = 0; struct iguana_block *block; uint32_t scriptspace,stackspace;
totalrecv += recvlen; totalrecv += recvlen;
#ifdef __PNACL__ #ifdef __PNACL__
//verifyflag = 1; //verifyflag = 1;
@ -1894,7 +1899,7 @@ long iguana_ramchain_data(struct iguana_info *coin,struct iguana_peer *addr,stru
} }
block->fpos = fpos = -1; block->fpos = fpos = -1;
iguana_ramchain_link(ramchain,block->RO.hash2,bp->hdrsi,bp->bundleheight+bundlei,bundlei,1,firsti,0); iguana_ramchain_link(ramchain,block->RO.hash2,bp->hdrsi,bp->bundleheight+bundlei,bundlei,1,firsti,0);
_iguana_ramchain_setptrs(RAMCHAIN_PTRS,ramchain->H.data); _iguana_ramchain_setptrs(RAMCHAIN_PTRS,rdata);
subdir = bp->bundleheight / IGUANA_SUBDIRDIVISOR; subdir = bp->bundleheight / IGUANA_SUBDIRDIVISOR;
char dirname[1024]; sprintf(dirname,"%s/%s/%d",GLOBAL_TMPDIR,coin->symbol,subdir), OS_ensure_directory(dirname); char dirname[1024]; sprintf(dirname,"%s/%s/%d",GLOBAL_TMPDIR,coin->symbol,subdir), OS_ensure_directory(dirname);
sprintf(dirname,"%s/%s/%d/%d",GLOBAL_TMPDIR,coin->symbol,subdir,bp->bundleheight), OS_ensure_directory(dirname); sprintf(dirname,"%s/%s/%d/%d",GLOBAL_TMPDIR,coin->symbol,subdir,bp->bundleheight), OS_ensure_directory(dirname);
@ -1920,7 +1925,7 @@ long iguana_ramchain_data(struct iguana_info *coin,struct iguana_peer *addr,stru
ramchain->H.spendind += tx->tx_in; ramchain->H.spendind += tx->tx_in;
} }
//printf("scriptoffset.%d after %d txids\n",ramchain->H.scriptoffset,txn_count); //printf("scriptoffset.%d after %d txids\n",ramchain->H.scriptoffset,txn_count);
ramchain->H.txidind = ramchain->H.spendind = ramchain->H.data->firsti; ramchain->H.txidind = ramchain->H.spendind = rdata->firsti;
for (i=0; i<txn_count; i++,ramchain->H.txidind++) for (i=0; i<txn_count; i++,ramchain->H.txidind++)
{ {
tx = &txarray[i]; tx = &txarray[i];
@ -1929,14 +1934,14 @@ long iguana_ramchain_data(struct iguana_info *coin,struct iguana_peer *addr,stru
iguana_ramchain_addspend256(coin,addr,RAMCHAIN_ARG,tx->vins[j].prev_hash,tx->vins[j].prev_vout,tx->vins[j].vinscript,tx->vins[j].scriptlen,tx->vins[j].sequence,bp);//,bp->hdrsi,bundlei); iguana_ramchain_addspend256(coin,addr,RAMCHAIN_ARG,tx->vins[j].prev_hash,tx->vins[j].prev_vout,tx->vins[j].vinscript,tx->vins[j].scriptlen,tx->vins[j].sequence,bp);//,bp->hdrsi,bundlei);
} }
} }
ramchain->H.data->prevhash2 = block->RO.prev_block; rdata->prevhash2 = block->RO.prev_block;
ramchain->H.data->scriptspace = scriptspace = ramchain->H.scriptoffset; rdata->scriptspace = scriptspace = ramchain->H.scriptoffset;
ramchain->H.data->stackspace = stackspace = ramchain->H.stacksize; rdata->stackspace = stackspace = ramchain->H.stacksize;
iguana_ramchain_setsize(fname,ramchain,ramchain->H.data,1,coin->chain->zcash); iguana_ramchain_setsize(fname,ramchain,rdata,1,coin->chain->zcash);
flag = 0; flag = 0;
if ( ramchain->H.txidind != ramchain->H.data->numtxids || ramchain->H.unspentind != ramchain->H.data->numunspents || ramchain->H.spendind != ramchain->H.data->numspends ) if ( ramchain->H.txidind != rdata->numtxids || ramchain->H.unspentind != rdata->numunspents || ramchain->H.spendind != rdata->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); 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,rdata->numtxids,ramchain->H.unspentind,rdata->numunspents,ramchain->H.spendind,rdata->numspends,ramchain->H.scriptoffset,rdata->scriptspace);
block->fpipbits = 0; block->fpipbits = 0;
block->issued = 0; block->issued = 0;
block->RO.recvlen = 0; block->RO.recvlen = 0;
@ -1946,11 +1951,11 @@ long iguana_ramchain_data(struct iguana_info *coin,struct iguana_peer *addr,stru
if ( (err= iguana_ramchain_verify(coin,ramchain)) == 0 ) if ( (err= iguana_ramchain_verify(coin,ramchain)) == 0 )
{ {
iguana_blockzcopyRO(coin->chain->zcash,B,0,&block->RO,0); iguana_blockzcopyRO(coin->chain->zcash,B,0,&block->RO,0);
ramchain->H.data->scriptspace = ramchain->H.scriptoffset = scriptspace; rdata->scriptspace = ramchain->H.scriptoffset = scriptspace;
ramchain->H.data->stackspace = ramchain->H.stacksize = stackspace; rdata->stackspace = ramchain->H.stacksize = stackspace;
if ( (fpos= (int32_t)iguana_ramchain_save(coin,RAMCHAIN_ARG,addr_ipbits,block->RO.hash2,block->RO.prev_block,bundlei,0,coin->chain->zcash)) >= 0 ) if ( (fpos= (int32_t)iguana_ramchain_save(coin,RAMCHAIN_ARG,addr_ipbits,block->RO.hash2,block->RO.prev_block,bundlei,0,coin->chain->zcash)) >= 0 )
{ {
origtxdata->datalen = (int32_t)ramchain->H.data->allocsize; origtxdata->datalen = (int32_t)rdata->allocsize;
//char str[65]; printf("saved.%s [%d:%d] fpos.%d datalen.%d\n",bits256_str(str,block->RO.hash2),bp->hdrsi,bundlei,fpos,origtxdata->datalen); //char str[65]; printf("saved.%s [%d:%d] fpos.%d datalen.%d\n",bits256_str(str,block->RO.hash2),bp->hdrsi,bundlei,fpos,origtxdata->datalen);
ramchain->H.ROflag = 0; ramchain->H.ROflag = 0;
flag = 1; flag = 1;
@ -1993,10 +1998,10 @@ long iguana_ramchain_data(struct iguana_info *coin,struct iguana_peer *addr,stru
if ( (err= iguana_ramchain_iterate(coin,0,&R,bp,bundlei)) != 0 ) if ( (err= iguana_ramchain_iterate(coin,0,&R,bp,bundlei)) != 0 )
printf("err.%d iterate ",err); printf("err.%d iterate ",err);
//printf("SUCCESS REMAP\n"); //printf("SUCCESS REMAP\n");
bp->numtxids += ramchain->H.data->numtxids; bp->numtxids += rdata->numtxids;
bp->numunspents += ramchain->H.data->numunspents; bp->numunspents += rdata->numunspents;
bp->numspends += ramchain->H.data->numspends; bp->numspends += rdata->numspends;
//bp->rawscriptspace += ramchain->H.data->scriptspace; //bp->rawscriptspace += rdata->scriptspace;
} }
iguana_ramchain_free(coin,&R,1); iguana_ramchain_free(coin,&R,1);
if ( err != 0 ) if ( err != 0 )
@ -2004,10 +2009,10 @@ long iguana_ramchain_data(struct iguana_info *coin,struct iguana_peer *addr,stru
} }
else else
{ {
bp->numtxids += ramchain->H.data->numtxids; bp->numtxids += rdata->numtxids;
bp->numunspents += ramchain->H.data->numunspents; bp->numunspents += rdata->numunspents;
bp->numspends += ramchain->H.data->numspends; bp->numspends += rdata->numspends;
//bp->rawscriptspace += ramchain->H.data->scriptspace; //bp->rawscriptspace += rdata->scriptspace;
} }
if ( fpos >= 0 ) if ( fpos >= 0 )
block->fpos = fpos, block->fpipbits = addr_ipbits; block->fpos = fpos, block->fpipbits = addr_ipbits;
@ -2021,7 +2026,7 @@ long iguana_ramchain_data(struct iguana_info *coin,struct iguana_peer *addr,stru
} }
if ( fpos < 0 ) if ( fpos < 0 )
iguana_blockunmark(coin,block,bp,bundlei,1); iguana_blockunmark(coin,block,bp,bundlei,1);
//fprintf(stderr,"finished with hdrsi.%d ht.%d scripts.%u:%u\n",bp->hdrsi,bp->bundleheight,ramchain->H.scriptoffset,ramchain->H.data->scriptspace); //fprintf(stderr,"finished with hdrsi.%d ht.%d scripts.%u:%u\n",bp->hdrsi,bp->bundleheight,ramchain->H.scriptoffset,rdata->scriptspace);
ramchain->H.ROflag = 0; ramchain->H.ROflag = 0;
iguana_ramchain_free(coin,ramchain,0); iguana_ramchain_free(coin,ramchain,0);
return(fpos); return(fpos);
@ -2031,12 +2036,12 @@ long iguana_ramchain_data(struct iguana_info *coin,struct iguana_peer *addr,stru
void iguana_ramchain_disp(struct iguana_ramchain *ramchain) void iguana_ramchain_disp(struct iguana_ramchain *ramchain)
{ {
RAMCHAIN_DECLARE; int32_t j; uint32_t txidind,unspentind,spendind; struct iguana_txid *tx; char str[65]; RAMCHAIN_DECLARE; int32_t j; uint32_t txidind,unspentind,spendind; struct iguana_txid *tx; char str[65]; struct iguana_ramchaindata *rdata;
_iguana_ramchain_setptrs(RAMCHAIN_PTRS,ramchain->H.data); if ( (rdata= ramchain->H.data) != 0 )
if ( ramchain->H.data != 0 )
{ {
unspentind = spendind = ramchain->H.data->firsti; _iguana_ramchain_setptrs(RAMCHAIN_PTRS,rdata);
for (txidind=ramchain->H.data->firsti; txidind<ramchain->H.data->numtxids; txidind++) unspentind = spendind = rdata->firsti;
for (txidind=rdata->firsti; txidind<rdata->numtxids; txidind++)
{ {
tx = &T[txidind]; tx = &T[txidind];
for (j=0; j<tx->numvins; j++, spendind++) for (j=0; j<tx->numvins; j++, spendind++)
@ -2199,51 +2204,51 @@ void iguana_bundlemapfree(struct iguana_info *coin,struct OS_memspace *mem,struc
int32_t iguana_ramchain_expandedsave(struct iguana_info *coin,RAMCHAIN_FUNC,struct iguana_ramchain *newchain,struct OS_memspace *hashmem,int32_t cmpflag,struct iguana_bundle *bp) int32_t iguana_ramchain_expandedsave(struct iguana_info *coin,RAMCHAIN_FUNC,struct iguana_ramchain *newchain,struct OS_memspace *hashmem,int32_t cmpflag,struct iguana_bundle *bp)
{ {
static const bits256 zero; static const bits256 zero;
bits256 firsthash2; int32_t err,bundlei,hdrsi,numblocks,firsti,height,retval= -1; bits256 firsthash2; int32_t err,bundlei,hdrsi,numblocks,firsti,height,retval= -1; struct iguana_ramchain checkR,*mapchain; char fname[1024]; struct iguana_block *block; uint32_t scriptspace,scriptoffset,stacksize; uint8_t *destoffset,*srcoffset; struct iguana_ramchaindata *rdata;
struct iguana_ramchain checkR,*mapchain; char fname[1024]; struct iguana_block *block; if ( (rdata= ramchain->H.data) == 0 )
uint32_t scriptspace,scriptoffset,stacksize; uint8_t *destoffset,*srcoffset; return(-1);
firsthash2 = ramchain->H.data->firsthash2;//, lasthash2 = ramchain->H.data->lasthash2; firsthash2 = rdata->firsthash2;//, lasthash2 = rdata->lasthash2;
height = ramchain->height, firsti = ramchain->H.data->firsti, hdrsi = ramchain->H.hdrsi, numblocks = ramchain->numblocks; height = ramchain->height, firsti = rdata->firsti, hdrsi = ramchain->H.hdrsi, numblocks = ramchain->numblocks;
destoffset = &Kspace[ramchain->H.scriptoffset]; destoffset = &Kspace[ramchain->H.scriptoffset];
srcoffset = &Kspace[ramchain->H.data->scriptspace - ramchain->H.stacksize]; srcoffset = &Kspace[rdata->scriptspace - ramchain->H.stacksize];
if ( ramchain->expanded != 0 ) if ( ramchain->expanded != 0 )
{ {
if ( (long)destoffset > (long)srcoffset ) if ( (long)destoffset > (long)srcoffset )
printf("smashed stack? dest.%ld vs src %ld offset.%u stacksize.%u space.%u\n",(long)destoffset,(long)srcoffset,(uint32_t)ramchain->H.scriptoffset,(uint32_t)ramchain->H.stacksize,(uint32_t)ramchain->H.scriptoffset); printf("smashed stack? dest.%ld vs src %ld offset.%u stacksize.%u space.%u\n",(long)destoffset,(long)srcoffset,(uint32_t)ramchain->H.scriptoffset,(uint32_t)ramchain->H.stacksize,(uint32_t)ramchain->H.scriptoffset);
} }
//printf("%d SAVE: Koffset.%d scriptoffset.%d stacksize.%d allocsize.%d gap.%ld RO.%d\n",bp->bundleheight,(int32_t)ramchain->H.data->Koffset,ramchain->H.scriptoffset,ramchain->H.stacksize,(int32_t)ramchain->H.data->allocsize,(long)destoffset - (long)srcoffset,ramchain->H.ROflag); //printf("%d SAVE: Koffset.%d scriptoffset.%d stacksize.%d allocsize.%d gap.%ld RO.%d\n",bp->bundleheight,(int32_t)rdata->Koffset,ramchain->H.scriptoffset,ramchain->H.stacksize,(int32_t)rdata->allocsize,(long)destoffset - (long)srcoffset,ramchain->H.ROflag);
scriptspace = ramchain->H.data->scriptspace; scriptspace = rdata->scriptspace;
scriptoffset = ramchain->H.scriptoffset; scriptoffset = ramchain->H.scriptoffset;
stacksize = ramchain->H.stacksize; stacksize = ramchain->H.stacksize;
//ramchain->H.scriptoffset = scriptoffset; //ramchain->H.scriptoffset = scriptoffset;
if ( (block= bp->blocks[0]) != 0 ) if ( (block= bp->blocks[0]) != 0 )
ramchain->H.data->prevhash2 = block->RO.prev_block; rdata->prevhash2 = block->RO.prev_block;
ramchain->H.data->scriptspace = scriptoffset; rdata->scriptspace = scriptoffset;
ramchain->H.stacksize = ramchain->H.data->stackspace = stacksize; ramchain->H.stacksize = rdata->stackspace = stacksize;
iguana_ramchain_setsize(fname,ramchain,ramchain->H.data,bp->n,coin->chain->zcash); iguana_ramchain_setsize(fname,ramchain,rdata,bp->n,coin->chain->zcash);
//printf("Apresave T.%d U.%d S.%d P.%d X.%d -> size.%ld firsti.%d scriptoffset.%d stacksize.%d\n",ramchain->H.data->numtxids,ramchain->H.data->numunspents,ramchain->H.data->numspends,ramchain->H.data->numpkinds,ramchain->H.data->numexternaltxids,(long)ramchain->H.data->allocsize,firsti,ramchain->H.scriptoffset,ramchain->H.stacksize); //printf("Apresave T.%d U.%d S.%d P.%d X.%d -> size.%ld firsti.%d scriptoffset.%d stacksize.%d\n",rdata->numtxids,rdata->numunspents,rdata->numspends,rdata->numpkinds,rdata->numexternaltxids,(long)rdata->allocsize,firsti,ramchain->H.scriptoffset,ramchain->H.stacksize);
*newchain = *ramchain; *newchain = *ramchain;
//memcpy(ramchain->roU2,ramchain->U2,sizeof(*ramchain->U2) * ramchain->H.data->numunspents); //memcpy(ramchain->roU2,ramchain->U2,sizeof(*ramchain->U2) * rdata->numunspents);
//memcpy(ramchain->roP2,ramchain->P2,sizeof(*ramchain->P2) * ramchain->H.data->numpkinds); //memcpy(ramchain->roP2,ramchain->P2,sizeof(*ramchain->P2) * rdata->numpkinds);
memcpy(ramchain->creditsA,ramchain->A,sizeof(*ramchain->A) * ramchain->H.data->numpkinds); memcpy(ramchain->creditsA,ramchain->A,sizeof(*ramchain->A) * rdata->numpkinds);
memset(ramchain->A,0,sizeof(*ramchain->A) * ramchain->H.data->numpkinds); memset(ramchain->A,0,sizeof(*ramchain->A) * rdata->numpkinds);
//printf("presave T.%d U.%d S.%d P.%d X.%d -> size.%ld firsti.%d\n",ramchain->H.data->numtxids,ramchain->H.data->numunspents,ramchain->H.data->numspends,ramchain->H.data->numpkinds,ramchain->H.data->numexternaltxids,(long)ramchain->H.data->allocsize,firsti); //printf("presave T.%d U.%d S.%d P.%d X.%d -> size.%ld firsti.%d\n",rdata->numtxids,rdata->numunspents,rdata->numspends,rdata->numpkinds,rdata->numexternaltxids,(long)rdata->allocsize,firsti);
//printf("0 preSAVE: Koffset.%d scriptoffset.%d stacksize.%d allocsize.%d\n",(int32_t)ramchain->H.data->Koffset,ramchain->H.scriptoffset,ramchain->H.stacksize,(int32_t)ramchain->H.data->allocsize); //printf("0 preSAVE: Koffset.%d scriptoffset.%d stacksize.%d allocsize.%d\n",(int32_t)rdata->Koffset,ramchain->H.scriptoffset,ramchain->H.stacksize,(int32_t)rdata->allocsize);
if ( (err= iguana_ramchain_iterate(coin,0,ramchain,bp,-1)) != 0 ) if ( (err= iguana_ramchain_iterate(coin,0,ramchain,bp,-1)) != 0 )
printf("ERROR.%d iterating presave ramchain hdrsi.%d\n",err,hdrsi); printf("ERROR.%d iterating presave ramchain hdrsi.%d\n",err,hdrsi);
else else
{ {
//printf("postiterate0.%d T.%d U.%d S.%d P.%d X.%d -> size.%ld firsti.%d scripts.%d:%d stack.%d:%d\n",bp->bundleheight,ramchain->H.data->numtxids,ramchain->H.data->numunspents,ramchain->H.data->numspends,ramchain->H.data->numpkinds,ramchain->H.data->numexternaltxids,(long)ramchain->H.data->allocsize,firsti,(int32_t)ramchain->H.scriptoffset,scriptoffset,(int32_t)ramchain->H.stacksize,stacksize); //printf("postiterate0.%d T.%d U.%d S.%d P.%d X.%d -> size.%ld firsti.%d scripts.%d:%d stack.%d:%d\n",bp->bundleheight,rdata->numtxids,rdata->numunspents,rdata->numspends,rdata->numpkinds,rdata->numexternaltxids,(long)rdata->allocsize,firsti,(int32_t)ramchain->H.scriptoffset,scriptoffset,(int32_t)ramchain->H.stacksize,stacksize);
if ( ramchain->H.scriptoffset > scriptoffset || ramchain->H.stacksize > stacksize ) if ( ramchain->H.scriptoffset > scriptoffset || ramchain->H.stacksize > stacksize )
printf("MEMORY OVERFLOW\n"); printf("MEMORY OVERFLOW\n");
if ( (err= iguana_ramchain_verify(coin,ramchain)) != 0 ) if ( (err= iguana_ramchain_verify(coin,ramchain)) != 0 )
printf("ERROR.%d verifying presave ramchain hdrsi.%d\n",err,hdrsi); printf("ERROR.%d verifying presave ramchain hdrsi.%d\n",err,hdrsi);
else retval = 0; else retval = 0;
} }
//printf("postiterateA.%d T.%d U.%d S.%d P.%d X.%d -> size.%ld firsti.%d scripts.%d:%d stack.%d:%d\n",bp->bundleheight,ramchain->H.data->numtxids,ramchain->H.data->numunspents,ramchain->H.data->numspends,ramchain->H.data->numpkinds,ramchain->H.data->numexternaltxids,(long)ramchain->H.data->allocsize,firsti,(int32_t)ramchain->H.scriptoffset,scriptoffset,(int32_t)ramchain->H.stacksize,stacksize); //printf("postiterateA.%d T.%d U.%d S.%d P.%d X.%d -> size.%ld firsti.%d scripts.%d:%d stack.%d:%d\n",bp->bundleheight,rdata->numtxids,rdata->numunspents,rdata->numspends,rdata->numpkinds,rdata->numexternaltxids,(long)rdata->allocsize,firsti,(int32_t)ramchain->H.scriptoffset,scriptoffset,(int32_t)ramchain->H.stacksize,stacksize);
ramchain->H.scriptoffset = scriptoffset; ramchain->H.scriptoffset = scriptoffset;
ramchain->H.data->scriptspace = scriptoffset; rdata->scriptspace = scriptoffset;
ramchain->H.stacksize = ramchain->H.data->stackspace = stacksize; ramchain->H.stacksize = rdata->stackspace = stacksize;
if ( iguana_ramchain_save(coin,RAMCHAIN_ARG,0,firsthash2,zero,0,bp,coin->chain->zcash) < 0 ) if ( iguana_ramchain_save(coin,RAMCHAIN_ARG,0,firsthash2,zero,0,bp,coin->chain->zcash) < 0 )
{ {
printf("ERROR saving ramchain hdrsi.%d, deleting and will regenerate\n",hdrsi); printf("ERROR saving ramchain hdrsi.%d, deleting and will regenerate\n",hdrsi);
@ -2251,7 +2256,7 @@ int32_t iguana_ramchain_expandedsave(struct iguana_info *coin,RAMCHAIN_FUNC,stru
} }
else else
{ {
//printf("DEST T.%d U.%d S.%d P.%d X.%d -> size.%ld Xoffset.%d\n",ramchain->H.data->numtxids,ramchain->H.data->numunspents,ramchain->H.data->numspends,ramchain->H.data->numpkinds,ramchain->H.data->numexternaltxids,(long)ramchain->H.data->allocsize,(int32_t)ramchain->H.data->Xoffset); //printf("DEST T.%d U.%d S.%d P.%d X.%d -> size.%ld Xoffset.%d\n",rdata->numtxids,rdata->numunspents,rdata->numspends,rdata->numpkinds,rdata->numexternaltxids,(long)rdata->allocsize,(int32_t)rdata->Xoffset);
//printf("free dest hdrs.%d retval.%d\n",bp->hdrsi,retval); //printf("free dest hdrs.%d retval.%d\n",bp->hdrsi,retval);
memset(&checkR,0,sizeof(checkR)); memset(&checkR,0,sizeof(checkR));
checkR.sigsfileptr = ramchain->sigsfileptr; checkR.sigsfileptr = ramchain->sigsfileptr;
@ -2293,15 +2298,17 @@ struct iguana_ramchain *iguana_bundleload(struct iguana_info *coin,struct iguana
{ {
static const bits256 zero; static const bits256 zero;
struct iguana_blockRO *B; struct iguana_txid *T; int32_t i,firsti = 1; char fname[512]; struct iguana_blockRO *B; struct iguana_txid *T; int32_t i,firsti = 1; char fname[512];
struct iguana_block *block,*prev,*prev2; struct iguana_ramchain *mapchain; struct iguana_block *block,*prev,*prev2; struct iguana_ramchain *mapchain; struct iguana_ramchaindata *rdata;
memset(ramchain,0,sizeof(*ramchain)); memset(ramchain,0,sizeof(*ramchain));
if ( (mapchain= iguana_ramchain_map(coin,fname,bp,bp->n,ramchain,0,0,bp->hashes[0],zero,0,0,extraflag,1)) != 0 ) if ( (mapchain= iguana_ramchain_map(coin,fname,bp,bp->n,ramchain,0,0,bp->hashes[0],zero,0,0,extraflag,1)) != 0 )
{ {
iguana_ramchain_link(mapchain,bp->hashes[0],bp->hdrsi,bp->bundleheight,0,bp->n,firsti,1); iguana_ramchain_link(mapchain,bp->hashes[0],bp->hdrsi,bp->bundleheight,0,bp->n,firsti,1);
//char str[65]; printf("bp.%d: T.%d U.%d S.%d P%d X.%d MAPPED %s %p\n",bp->hdrsi,mapchain->H.data->numtxids,mapchain->H.data->numunspents,mapchain->H.data->numspends,mapchain->H.data->numpkinds,mapchain->H.data->numexternaltxids,mbstr(str,mapchain->H.data->allocsize),mapchain->H.data); //char str[65]; printf("bp.%d: T.%d U.%d S.%d P%d X.%d MAPPED %s %p\n",bp->hdrsi,mapchain->H.data->numtxids,mapchain->H.data->numunspents,mapchain->H.data->numspends,mapchain->H.data->numpkinds,mapchain->H.data->numexternaltxids,mbstr(str,mapchain->H.data->allocsize),mapchain->H.data);
//ramcoder_test(mapchain->H.data,mapchain->H.data->allocsize); //ramcoder_test(mapchain->H.data,mapchain->H.data->allocsize);
B = RAMCHAIN_PTR(ramchain->H.data,Boffset); if ( (rdata= ramchain->H.data) != 0 )
T = RAMCHAIN_PTR(ramchain->H.data,Toffset); {
B = RAMCHAIN_PTR(rdata,Boffset);
T = RAMCHAIN_PTR(rdata,Toffset);
prev = prev2 = 0; prev = prev2 = 0;
for (i=0; i<bp->n; i++) for (i=0; i<bp->n; i++)
{ {
@ -2336,6 +2343,7 @@ struct iguana_ramchain *iguana_bundleload(struct iguana_info *coin,struct iguana
prev2 = prev, prev = block; prev2 = prev, prev = block;
} }
} }
}
//printf("mapped bundle.%d\n",bp->bundleheight); //printf("mapped bundle.%d\n",bp->bundleheight);
bp->emitfinish = (uint32_t)time(NULL) + 1; bp->emitfinish = (uint32_t)time(NULL) + 1;
iguana_bundlecalcs(coin,bp,60); iguana_bundlecalcs(coin,bp,60);
@ -2403,7 +2411,7 @@ int64_t iguana_ramchainopen(char *fname,struct iguana_info *coin,struct iguana_r
iguana_ramchain_link(ramchain,hash2,bundleheight/coin->chain->bundlesize,bundleheight,0,0,1,0); iguana_ramchain_link(ramchain,hash2,bundleheight/coin->chain->bundlesize,bundleheight,0,0,1,0);
ramchain->expanded = 1; ramchain->expanded = 1;
ramchain->H.scriptoffset = 1; ramchain->H.scriptoffset = 1;
_iguana_ramchain_setptrs(RAMCHAIN_PTRS,ramchain->H.data); _iguana_ramchain_setptrs(RAMCHAIN_PTRS,rdata);
iguana_ramchain_extras(coin,ramchain,hashmem,0); iguana_ramchain_extras(coin,ramchain,hashmem,0);
} }
if ( rdata != 0 ) if ( rdata != 0 )

16
iguana/iguana_scripts.c

@ -632,9 +632,9 @@ int32_t iguana_vinscriptdecode(struct iguana_info *coin,struct iguana_ramchain *
for (i=0; i<s->numpubkeys; i++) for (i=0; i<s->numpubkeys; i++)
{ {
len += iguana_rwvarint32(0,&metascript[len],(void *)&poffset); len += iguana_rwvarint32(0,&metascript[len],(void *)&poffset);
if ( poffset > ramchain->H.data->scriptspace-33 ) if ( poffset > rdata->scriptspace-33 )
{ {
printf("illegal poffset.%d/%d\n",poffset,ramchain->H.data->scriptspace); printf("illegal poffset.%d/%d\n",poffset,rdata->scriptspace);
return(-1); return(-1);
} }
//printf("poffset[%d] of %d poffset %x\n",i,s->numpubkeys,poffset); //printf("poffset[%d] of %d poffset %x\n",i,s->numpubkeys,poffset);
@ -790,7 +790,7 @@ int32_t iguana_metascript(struct iguana_info *coin,RAMCHAIN_FUNC,struct iguana_s
{ {
ramchain->H.stacksize += sigslen; ramchain->H.stacksize += sigslen;
s->scriptoffset = ramchain->H.scriptoffset; s->scriptoffset = ramchain->H.scriptoffset;
len = iguana_vinscriptencode(coin,&metalen,&Kspace[ramchain->H.data->scriptspace],ramchain->H.stacksize,Kspace,ramchain->H.scriptoffset,s,sigsbuf,sigslen,poffsets,V.p2shscript,V.p2shlen,suffix,suffixlen); len = iguana_vinscriptencode(coin,&metalen,&Kspace[rdata->scriptspace],ramchain->H.stacksize,Kspace,ramchain->H.scriptoffset,s,sigsbuf,sigslen,poffsets,V.p2shscript,V.p2shlen,suffix,suffixlen);
} else printf("sigslen.%d numsigs.%d numpubs.%d suffixlen.%d\n",sigslen,V.numsigs,V.numpubkeys,suffixlen); } else printf("sigslen.%d numsigs.%d numpubs.%d suffixlen.%d\n",sigslen,V.numsigs,V.numpubkeys,suffixlen);
} }
else else
@ -810,7 +810,7 @@ int32_t iguana_metascript(struct iguana_info *coin,RAMCHAIN_FUNC,struct iguana_s
} }
} }
//printf("checklen.%d scriptoffset.%d\n",checklen,ramchain->H.scriptoffset); //printf("checklen.%d scriptoffset.%d\n",checklen,ramchain->H.scriptoffset);
if ( (decodelen= iguana_vinscriptdecode(coin,ramchain,&checkmetalen,_script,&Kspace[ramchain->H.data->scriptspace],Kspace,s)) != vinscriptlen || (vinscript != 0 && memcmp(_script,vinscript,vinscriptlen) != 0) || checkmetalen != metalen ) if ( (decodelen= iguana_vinscriptdecode(coin,ramchain,&checkmetalen,_script,&Kspace[rdata->scriptspace],Kspace,s)) != vinscriptlen || (vinscript != 0 && memcmp(_script,vinscript,vinscriptlen) != 0) || checkmetalen != metalen )
{ {
//static uint64_t counter; //static uint64_t counter;
//if ( counter++ < 100 ) //if ( counter++ < 100 )
@ -877,7 +877,7 @@ int32_t iguana_ramchain_scriptspace(struct iguana_info *coin,int32_t *sigspacep,
int32_t j,scriptlen; struct vin_info V; int32_t j,scriptlen; struct vin_info V;
uint32_t sequence,p2shspace,altspace,sigspace,pubkeyspace,spendind,unspentind,p2shsize,pubkeysize,sigsize,scriptspace,suffixlen; uint32_t sequence,p2shspace,altspace,sigspace,pubkeyspace,spendind,unspentind,p2shsize,pubkeysize,sigsize,scriptspace,suffixlen;
struct iguana_txid *tx; struct iguana_ramchaindata *rdata; uint8_t *scriptdata; struct iguana_txid *tx; struct iguana_ramchaindata *rdata; uint8_t *scriptdata;
_iguana_ramchain_setptrs(RAMCHAIN_PTRS,ramchain->H.data); _iguana_ramchain_setptrs(RAMCHAIN_PTRS,rdata);
*sigspacep = *pubkeyspacep = altspace = 0; *sigspacep = *pubkeyspacep = altspace = 0;
return(1); return(1);
if ( (rdata= ramchain->H.data) == 0 || ramchain->expanded != 0 ) if ( (rdata= ramchain->H.data) == 0 || ramchain->expanded != 0 )
@ -902,7 +902,7 @@ int32_t iguana_ramchain_scriptspace(struct iguana_info *coin,int32_t *sigspacep,
{ {
sequence = S[spendind].sequenceid; sequence = S[spendind].sequenceid;
scriptlen = S[spendind].vinscriptlen; scriptlen = S[spendind].vinscriptlen;
if ( S[spendind].scriptoffset != 0 && S[spendind].scriptoffset+scriptlen < ramchain->H.data->scriptspace ) if ( S[spendind].scriptoffset != 0 && S[spendind].scriptoffset+scriptlen < rdata->scriptspace )
{ {
scriptdata = &Kspace[S[spendind].scriptoffset]; scriptdata = &Kspace[S[spendind].scriptoffset];
altspace += scriptlen; altspace += scriptlen;
@ -1000,14 +1000,14 @@ uint8_t *iguana_ramchain_scriptdecode(int32_t *metalenp,int32_t *scriptlenp,uint
/*origoffset = ramchain->H.scriptoffset; /*origoffset = ramchain->H.scriptoffset;
if ( type != IGUANA_SCRIPT_STRANGE && type != IGUANA_SCRIPT_DATA && type != IGUANA_SCRIPT_OPRETURN && scriptlen > 0 && script != 0 ) if ( type != IGUANA_SCRIPT_STRANGE && type != IGUANA_SCRIPT_DATA && type != IGUANA_SCRIPT_OPRETURN && scriptlen > 0 && script != 0 )
{ {
if ( Kspace != 0 && ramchain->H.scriptoffset+scriptlen+3 <= ramchain->H.data->scriptspace-ramchain->H.stacksize ) if ( Kspace != 0 && ramchain->H.scriptoffset+scriptlen+3 <= rdata->scriptspace-ramchain->H.stacksize )
{ {
if ( (u->scriptoffset= iguana_ramchain_scriptencode(coin,Kspace,&ramchain->H.scriptoffset,type,script,scriptlen,&pubkeyoffset)) > 0 || type == IGUANA_SCRIPT_76AC ) if ( (u->scriptoffset= iguana_ramchain_scriptencode(coin,Kspace,&ramchain->H.scriptoffset,type,script,scriptlen,&pubkeyoffset)) > 0 || type == IGUANA_SCRIPT_76AC )
{ {
fprintf(stderr,"new offset.%d from scriptlen.%d pubkeyoffset.%d\n",ramchain->H.scriptoffset,scriptlen,pubkeyoffset); fprintf(stderr,"new offset.%d from scriptlen.%d pubkeyoffset.%d\n",ramchain->H.scriptoffset,scriptlen,pubkeyoffset);
} }
//printf("[%d] u%d offset.%u len.%d\n",hdrsi,unspentind,u->scriptoffset,scriptlen); //printf("[%d] u%d offset.%u len.%d\n",hdrsi,unspentind,u->scriptoffset,scriptlen);
} else printf("[%d] u%d Kspace.%p scriptspace overflow! %d + %d vs space.%d - stack.%d\n",hdrsi,unspentind,Kspace,ramchain->H.scriptoffset,scriptlen,ramchain->H.data->scriptspace,ramchain->H.stacksize); } else printf("[%d] u%d Kspace.%p scriptspace overflow! %d + %d vs space.%d - stack.%d\n",hdrsi,unspentind,Kspace,ramchain->H.scriptoffset,scriptlen,rdata->scriptspace,ramchain->H.stacksize);
checkscript = iguana_ramchain_scriptdecode(&metalen,&checklen,Kspace,u->type,_script,u->scriptoffset,P[pkind].pubkeyoffset < ramchain->H.scriptoffset ? P[pkind].pubkeyoffset : 0); checkscript = iguana_ramchain_scriptdecode(&metalen,&checklen,Kspace,u->type,_script,u->scriptoffset,P[pkind].pubkeyoffset < ramchain->H.scriptoffset ? P[pkind].pubkeyoffset : 0);
if ( checklen != scriptlen || (script != 0 && checkscript != 0 && memcmp(checkscript,script,scriptlen) != 0) ) if ( checklen != scriptlen || (script != 0 && checkscript != 0 && memcmp(checkscript,script,scriptlen) != 0) )
{ {

31
iguana/iguana_spendvectors.c

@ -100,13 +100,11 @@ int32_t iguana_spendvectorsave(struct iguana_info *coin,struct iguana_bundle *bp
struct iguana_bundle *iguana_externalspent(struct iguana_info *coin,bits256 *prevhashp,uint32_t *unspentindp,struct iguana_ramchain *ramchain,int32_t spent_hdrsi,struct iguana_spend *s,int32_t prefetchflag) struct iguana_bundle *iguana_externalspent(struct iguana_info *coin,bits256 *prevhashp,uint32_t *unspentindp,struct iguana_ramchain *ramchain,int32_t spent_hdrsi,struct iguana_spend *s,int32_t prefetchflag)
{ {
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]; struct iguana_bundle *spentbp=0; struct iguana_txid *T,TX,*tp; bits256 *X; bits256 prev_hash; struct iguana_ramchaindata *rdata;
struct iguana_bundle *spentbp=0; struct iguana_txid *T,TX,*tp; bits256 *X; bits256 prev_hash; if ( (rdata= ramchain->H.data) != 0 )
X = RAMCHAIN_PTR(ramchain->H.data,Xoffset); {
T = RAMCHAIN_PTR(ramchain->H.data,Toffset); X = RAMCHAIN_PTR(rdata,Xoffset);
//X = (void *)(long)((long)ramchain->H.data + ramchain->H.data->Xoffset); T = RAMCHAIN_PTR(rdata,Toffset);
//T = (void *)(long)((long)ramchain->H.data + ramchain->H.data->Toffset);
//printf("external X.%p %ld num.%d\n",X,(long)ramchain->H.data->Xoffset,(int32_t)ramchain->H.data->numexternaltxids);
sequenceid = s->sequenceid; sequenceid = s->sequenceid;
hdrsi = spent_hdrsi; hdrsi = spent_hdrsi;
*unspentindp = 0; *unspentindp = 0;
@ -121,7 +119,7 @@ struct iguana_bundle *iguana_externalspent(struct iguana_info *coin,bits256 *pre
else else
{ {
prev_vout = s->prevout; prev_vout = s->prevout;
iguana_ramchain_spendtxid(coin,&unspentind,&prev_hash,T,ramchain->H.data->numtxids,X,ramchain->H.data->numexternaltxids,s); iguana_ramchain_spendtxid(coin,&unspentind,&prev_hash,T,rdata->numtxids,X,rdata->numexternaltxids,s);
*prevhashp = prev_hash; *prevhashp = prev_hash;
*unspentindp = unspentind; *unspentindp = unspentind;
if ( unspentind == 0 ) if ( unspentind == 0 )
@ -180,7 +178,8 @@ struct iguana_bundle *iguana_externalspent(struct iguana_info *coin,bits256 *pre
printf("illegal unspentind.%d vs max.%d spentbp.%p[%d]\n",unspentind,spentbp->ramchain.H.data->numunspents,spentbp,hdrsi); printf("illegal unspentind.%d vs max.%d spentbp.%p[%d]\n",unspentind,spentbp->ramchain.H.data->numunspents,spentbp,hdrsi);
else return(spentbp); else return(spentbp);
iguana_bundleremove(coin,spent_hdrsi,1); iguana_bundleremove(coin,spent_hdrsi,1);
exit(-1); }
//exit(-1);
return(0); return(0);
} }
@ -243,7 +242,7 @@ int32_t iguana_spendvectors(struct iguana_info *coin,struct iguana_bundle *bp,st
struct iguana_bundle *spentbp; struct iguana_blockRO *B; struct iguana_spendvector *ptr; struct iguana_bundle *spentbp; struct iguana_blockRO *B; struct iguana_spendvector *ptr;
struct iguana_unspent *u,*spentU; struct iguana_txid *T; char str[65]; struct iguana_unspent *u,*spentU; struct iguana_txid *T; char str[65];
struct iguana_spend *S,*s; //void *fastfind = 0; struct iguana_spend *S,*s; //void *fastfind = 0;
//printf("iguana_spendvectors.[%d] gen.%d ramchain data.%p txbits.%p\n",bp->hdrsi,bp->bundleheight,ramchain->H.data,ramchain->txbits); //printf("iguana_spendvectors.[%d] gen.%d ramchain data.%p txbits.%p\n",bp->hdrsi,bp->bundleheight,rdata,ramchain->txbits);
if ( (rdata= ramchain->H.data) == 0 || (n= rdata->numspends) < 1 ) if ( (rdata= ramchain->H.data) == 0 || (n= rdata->numspends) < 1 )
{ {
printf("iguana_spendvectors.[%d]: no rdata.%p %d\n",bp->hdrsi,rdata,n); printf("iguana_spendvectors.[%d]: no rdata.%p %d\n",bp->hdrsi,rdata,n);
@ -396,14 +395,14 @@ int32_t iguana_spendvectors(struct iguana_info *coin,struct iguana_bundle *bp,st
free(coin->fast[iter]); free(coin->fast[iter]);
coin->fast[iter] = fastfind; coin->fast[iter] = fastfind;
}*/ }*/
if ( txidind != ramchain->H.data->numtxids && txidind != ramchain->H.txidind ) if ( txidind != rdata->numtxids && txidind != ramchain->H.txidind )
{ {
printf("spendvectors: numtxid.%d != bp numtxids %d/%d\n",txidind,ramchain->H.txidind,ramchain->H.data->numtxids); printf("spendvectors: numtxid.%d != bp numtxids %d/%d\n",txidind,ramchain->H.txidind,rdata->numtxids);
errs++; errs++;
} }
if ( spendind != ramchain->H.data->numspends && spendind != ramchain->H.spendind ) if ( spendind != rdata->numspends && spendind != ramchain->H.spendind )
{ {
printf("spendvectors: spendind.%d != bp numspends %d/%d\n",spendind,ramchain->H.spendind,ramchain->H.data->numspends); printf("spendvectors: spendind.%d != bp numspends %d/%d\n",spendind,ramchain->H.spendind,rdata->numspends);
errs++; errs++;
} }
} }
@ -448,7 +447,7 @@ int32_t iguana_balancegen(struct iguana_info *coin,int32_t incremental,struct ig
struct iguana_txid *T; struct iguana_blockRO *B; struct iguana_bundle *spentbp; struct iguana_txid *T; struct iguana_blockRO *B; struct iguana_bundle *spentbp;
int32_t spent_hdrsi,spendind,n,numXspends,errs=0,emit=0; struct iguana_spend *S,*s; int32_t spent_hdrsi,spendind,n,numXspends,errs=0,emit=0; struct iguana_spend *S,*s;
ramchain = &bp->ramchain; //(bp == coin->current) ? &coin->RTramchain : &bp->ramchain; ramchain = &bp->ramchain; //(bp == coin->current) ? &coin->RTramchain : &bp->ramchain;
if ( (rdata= ramchain->H.data) == 0 || (n= ramchain->H.data->numspends) < 1 ) if ( (rdata= ramchain->H.data) == 0 || (n= rdata->numspends) < 1 )
return(-1); return(-1);
S = (void *)(long)((long)rdata + rdata->Soffset); S = (void *)(long)((long)rdata + rdata->Soffset);
B = (void *)(long)((long)rdata + rdata->Boffset); B = (void *)(long)((long)rdata + rdata->Boffset);
@ -556,7 +555,7 @@ int32_t iguana_balancegen(struct iguana_info *coin,int32_t incremental,struct ig
printf("numtxid.%d != bp numtxids %d/%d\n",txidind,bp->ramchain.H.txidind,bp->ramchain.H.data->numtxids); printf("numtxid.%d != bp numtxids %d/%d\n",txidind,bp->ramchain.H.txidind,bp->ramchain.H.data->numtxids);
errs++; errs++;
} }
if ( spendind != ramchain->H.data->numspends && (bp != coin->current || spendind != ramchain->H.spendind) ) if ( spendind != rdata->numspends && (bp != coin->current || spendind != ramchain->H.spendind) )
{ {
printf("spendind.%d != bp numspends %d/%d\n",spendind,bp->ramchain.H.spendind,bp->ramchain.H.data->numspends); printf("spendind.%d != bp numspends %d/%d\n",spendind,bp->ramchain.H.spendind,bp->ramchain.H.data->numspends);
errs++; errs++;

56
iguana/iguana_txidfind.c

@ -17,17 +17,17 @@
int32_t iguana_alloctxbits(struct iguana_info *coin,struct iguana_ramchain *ramchain) int32_t iguana_alloctxbits(struct iguana_info *coin,struct iguana_ramchain *ramchain)
{ {
static int64_t total; static int64_t total; struct iguana_ramchaindata *rdata;
if ( 0 && ramchain->txbits == 0 ) if ( 0 && ramchain->txbits == 0 && (rdata= ramchain->H.data) != 0 )
{ {
int32_t tlen; uint8_t *TXbits; int32_t tlen; uint8_t *TXbits;
TXbits = RAMCHAIN_PTR(ramchain->H.data,TXoffset); TXbits = RAMCHAIN_PTR(rdata,TXoffset);
//TXbits = (uint8_t *)((long)ramchain->H.data + ramchain->H.data->TXoffset); //TXbits = (uint8_t *)((long)rdata + rdata->TXoffset);
tlen = (int32_t)hconv_bitlen(ramchain->H.data->numtxsparse * ramchain->H.data->txsparsebits); tlen = (int32_t)hconv_bitlen(rdata->numtxsparse * rdata->txsparsebits);
ramchain->txbits = calloc(1,tlen); ramchain->txbits = calloc(1,tlen);
memcpy(ramchain->txbits,TXbits,tlen); memcpy(ramchain->txbits,TXbits,tlen);
total += tlen; total += tlen;
char str[65]; printf("%s alloc.[%d] txbits.%p[%d] total %s\n",coin->symbol,ramchain->H.data->height/coin->chain->bundlesize,ramchain->txbits,tlen,mbstr(str,total)); char str[65]; printf("%s alloc.[%d] txbits.%p[%d] total %s\n",coin->symbol,rdata->height/coin->chain->bundlesize,ramchain->txbits,tlen,mbstr(str,total));
return(tlen); return(tlen);
} }
return(-1); return(-1);
@ -35,21 +35,21 @@ int32_t iguana_alloctxbits(struct iguana_info *coin,struct iguana_ramchain *ramc
int32_t iguana_alloccacheT(struct iguana_info *coin,struct iguana_ramchain *ramchain) int32_t iguana_alloccacheT(struct iguana_info *coin,struct iguana_ramchain *ramchain)
{ {
static int64_t total; static int64_t total; struct iguana_ramchaindata *rdata;
if ( ramchain->cacheT == 0 ) if ( ramchain->cacheT == 0 && (rdata= ramchain->H.data) != 0 )
{ {
int32_t i,tlen; struct iguana_txid *T; int32_t i,tlen; struct iguana_txid *T;
T = RAMCHAIN_PTR(ramchain->H.data,Toffset); T = RAMCHAIN_PTR(rdata,Toffset);
//T = (void *)((long)ramchain->H.data + ramchain->H.data->Toffset); //T = (void *)((long)rdata + rdata->Toffset);
tlen = sizeof(*T) * ramchain->H.data->numtxids; tlen = sizeof(*T) * rdata->numtxids;
if ( (ramchain->cacheT= calloc(1,tlen)) != 0 ) if ( (ramchain->cacheT= calloc(1,tlen)) != 0 )
{ {
//memcpy(ramchain->cacheT,T,tlen); //memcpy(ramchain->cacheT,T,tlen);
for (i=0; i<ramchain->H.data->numtxids; i++) for (i=0; i<rdata->numtxids; i++)
ramchain->cacheT[i] = T[i]; ramchain->cacheT[i] = T[i];
} else ramchain->cacheT = T; } else ramchain->cacheT = T;
total += tlen; total += tlen;
char str[65]; printf("alloc.[%d] cacheT.%p[%d] total %s\n",ramchain->H.data->height/coin->chain->bundlesize,ramchain->cacheT,tlen,mbstr(str,total)); char str[65]; printf("alloc.[%d] cacheT.%p[%d] total %s\n",rdata->height/coin->chain->bundlesize,ramchain->cacheT,tlen,mbstr(str,total));
return(tlen); return(tlen);
} }
return(-1); return(-1);
@ -58,6 +58,7 @@ int32_t iguana_alloccacheT(struct iguana_info *coin,struct iguana_ramchain *ramc
uint32_t iguana_sparseadd(uint8_t *bits,uint32_t ind,int32_t width,uint32_t tablesize,uint8_t *key,int32_t keylen,uint32_t setind,void *refdata,int32_t refsize,struct iguana_ramchain *ramchain,uint32_t maxitems) uint32_t iguana_sparseadd(uint8_t *bits,uint32_t ind,int32_t width,uint32_t tablesize,uint8_t *key,int32_t keylen,uint32_t setind,void *refdata,int32_t refsize,struct iguana_ramchain *ramchain,uint32_t maxitems)
{ {
static uint8_t masks[8] = { 1, 2, 4, 8, 16, 32, 64, 128 }; static uint8_t masks[8] = { 1, 2, 4, 8, 16, 32, 64, 128 };
struct iguana_ramchaindata *rdata;
int32_t i,j,x,n,modval; int64_t bitoffset; uint8_t *ptr; uint32_t *table,retval = 0; int32_t i,j,x,n,modval; int64_t bitoffset; uint8_t *ptr; uint32_t *table,retval = 0;
if ( tablesize == 0 ) if ( tablesize == 0 )
{ {
@ -87,8 +88,8 @@ uint32_t iguana_sparseadd(uint8_t *bits,uint32_t ind,int32_t width,uint32_t tabl
//if ( setind == 0 ) //if ( setind == 0 )
// ramchain->sparsesearches++; // ramchain->sparsesearches++;
//else ramchain->sparseadds++; //else ramchain->sparseadds++;
if ( 0 && (ramchain->sparsesearches % 1000000) == 0 ) if ( 0 && (rdata= ramchain->H.data) != 0 && (ramchain->sparsesearches % 1000000) == 0 )
printf("[%3d] %7d.[%-2d %8d] %5.3f adds.(%-10ld %10ld) search.(hits.%-10ld %10ld) %5.2f%% max.%ld\n",ramchain->height/ramchain->H.data->numblocks,ramchain->height,width,tablesize,(double)(ramchain->sparseadditers + ramchain->sparsesearchiters)/(1+ramchain->sparsesearches+ramchain->sparseadds),ramchain->sparseadds,ramchain->sparseadditers,ramchain->sparsehits,ramchain->sparsesearches,100.*(double)ramchain->sparsehits/(1+ramchain->sparsesearches),ramchain->sparsemax+1); printf("[%3d] %7d.[%-2d %8d] %5.3f adds.(%-10ld %10ld) search.(hits.%-10ld %10ld) %5.2f%% max.%ld\n",ramchain->height/rdata->numblocks,ramchain->height,width,tablesize,(double)(ramchain->sparseadditers + ramchain->sparsesearchiters)/(1+ramchain->sparsesearches+ramchain->sparseadds),ramchain->sparseadds,ramchain->sparseadditers,ramchain->sparsehits,ramchain->sparsesearches,100.*(double)ramchain->sparsehits/(1+ramchain->sparsesearches),ramchain->sparsemax+1);
if ( width == 32 ) if ( width == 32 )
{ {
table = (uint32_t *)bits; table = (uint32_t *)bits;
@ -209,10 +210,10 @@ uint32_t iguana_sparseadd(uint8_t *bits,uint32_t ind,int32_t width,uint32_t tabl
uint32_t iguana_sparseaddtx(uint8_t *bits,int32_t width,uint32_t tablesize,bits256 txid,struct iguana_txid *T,uint32_t txidind,struct iguana_ramchain *ramchain) uint32_t iguana_sparseaddtx(uint8_t *bits,int32_t width,uint32_t tablesize,bits256 txid,struct iguana_txid *T,uint32_t txidind,struct iguana_ramchain *ramchain)
{ {
uint32_t ind,retval; uint32_t ind,retval=0; struct iguana_ramchaindata *rdata = ramchain->H.data;
//char str[65]; printf("sparseaddtx %s txidind.%d bits.%p\n",bits256_str(str,txid),txidind,bits); //char str[65]; printf("sparseaddtx %s txidind.%d bits.%p\n",bits256_str(str,txid),txidind,bits);
ind = (txid.ulongs[0] ^ txid.ulongs[1] ^ txid.ulongs[2] ^ txid.ulongs[3]) % tablesize; ind = (txid.ulongs[0] ^ txid.ulongs[1] ^ txid.ulongs[2] ^ txid.ulongs[3]) % tablesize;
if ( (retval= iguana_sparseadd(bits,ind,width,tablesize,txid.bytes,sizeof(txid),txidind,T,sizeof(*T),ramchain,ramchain->H.data->numtxids)) != 0 ) if ( rdata != 0 && (retval= iguana_sparseadd(bits,ind,width,tablesize,txid.bytes,sizeof(txid),txidind,T,sizeof(*T),ramchain,rdata->numtxids)) != 0 )
{ {
char str[65]; char str[65];
if ( txidind != 0 && retval != txidind ) if ( txidind != 0 && retval != txidind )
@ -224,7 +225,9 @@ uint32_t iguana_sparseaddtx(uint8_t *bits,int32_t width,uint32_t tablesize,bits2
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) 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)
{ {
uint32_t ind,key2; uint64_t key0,key1; uint32_t ind,key2; uint64_t key0,key1; struct iguana_ramchaindata *rdata;
if ( (rdata= ramchain->H.data) != 0 )
{
//int32_t i; for (i=0; i<20; i++) //int32_t i; for (i=0; i<20; i++)
// printf("%02x",rmd160[i]); // printf("%02x",rmd160[i]);
//char str[65]; printf(" sparseaddpk pkind.%d bits.%p\n",pkind,bits); //char str[65]; printf(" sparseaddpk pkind.%d bits.%p\n",pkind,bits);
@ -232,7 +235,8 @@ uint32_t iguana_sparseaddpk(uint8_t *bits,int32_t width,uint32_t tablesize,uint8
memcpy(&key1,&rmd160[sizeof(key0)],sizeof(key1)); memcpy(&key1,&rmd160[sizeof(key0)],sizeof(key1));
memcpy(&key2,&rmd160[sizeof(key0) + sizeof(key1)],sizeof(key2)); memcpy(&key2,&rmd160[sizeof(key0) + sizeof(key1)],sizeof(key2));
ind = (key0 ^ key1 ^ key2) % tablesize; ind = (key0 ^ key1 ^ key2) % tablesize;
return(iguana_sparseadd(bits,ind,width,tablesize,rmd160,20,pkind,P,sizeof(*P),ramchain,ramchain->H.data->numpkinds)); return(iguana_sparseadd(bits,ind,width,tablesize,rmd160,20,pkind,P,sizeof(*P),ramchain,rdata->numpkinds));
} else return(0);
} }
int32_t iguana_ramchain_spendtxid(struct iguana_info *coin,uint32_t *unspentindp,bits256 *txidp,struct iguana_txid *T,int32_t numtxids,bits256 *X,int32_t numexternaltxids,struct iguana_spend *s) int32_t iguana_ramchain_spendtxid(struct iguana_info *coin,uint32_t *unspentindp,bits256 *txidp,struct iguana_txid *T,int32_t numtxids,bits256 *X,int32_t numexternaltxids,struct iguana_spend *s)
@ -274,7 +278,7 @@ struct iguana_txid *iguana_txidfind(struct iguana_info *coin,int32_t *heightp,st
if ( (bp= coin->bundles[i]) != 0 && (bp == coin->current || bp->emitfinish > 1) ) if ( (bp= coin->bundles[i]) != 0 && (bp == coin->current || bp->emitfinish > 1) )
{ {
ramchain = (bp == coin->current) ? &coin->RTramchain : &bp->ramchain; ramchain = (bp == coin->current) ? &coin->RTramchain : &bp->ramchain;
if ( ramchain->H.data != 0 ) if ( (rdata= ramchain->H.data) != 0 )
{ {
if ( (TXbits= ramchain->txbits) == 0 ) if ( (TXbits= ramchain->txbits) == 0 )
{ {
@ -282,9 +286,9 @@ struct iguana_txid *iguana_txidfind(struct iguana_info *coin,int32_t *heightp,st
iguana_alloctxbits(coin,ramchain); iguana_alloctxbits(coin,ramchain);
if ( (TXbits= ramchain->txbits) == 0 ) if ( (TXbits= ramchain->txbits) == 0 )
{ {
//printf("use memory mapped.[%d]\n",ramchain->H.data->height/coin->chain->bundlesize); //printf("use memory mapped.[%d]\n",rdata->height/coin->chain->bundlesize);
TXbits = RAMCHAIN_PTR(ramchain->H.data,TXoffset); TXbits = RAMCHAIN_PTR(rdata,TXoffset);
//TXbits = (void *)(long)((long)ramchain->H.data + ramchain->H.data->TXoffset); //TXbits = (void *)(long)((long)rdata + rdata->TXoffset);
} }
} }
if ( (T= ramchain->cacheT) == 0 ) if ( (T= ramchain->cacheT) == 0 )
@ -292,10 +296,10 @@ struct iguana_txid *iguana_txidfind(struct iguana_info *coin,int32_t *heightp,st
//if ( coin->fastfind == 0 ) //if ( coin->fastfind == 0 )
// iguana_alloccacheT(coin,ramchain); // iguana_alloccacheT(coin,ramchain);
//if ( (T= ramchain->cacheT) == 0 ) //if ( (T= ramchain->cacheT) == 0 )
T = RAMCHAIN_PTR(ramchain->H.data,Toffset); T = RAMCHAIN_PTR(rdata,Toffset);
//T = (void *)(long)((long)ramchain->H.data + ramchain->H.data->Toffset); //T = (void *)(long)((long)rdata + rdata->Toffset);
} }
if ( (txidind= iguana_sparseaddtx(TXbits,ramchain->H.data->txsparsebits,ramchain->H.data->numtxsparse,txid,T,0,ramchain)) > 0 ) if ( (txidind= iguana_sparseaddtx(TXbits,rdata->txsparsebits,rdata->numtxsparse,txid,T,0,ramchain)) > 0 )
{ {
//printf("found txidind.%d\n",txidind); //printf("found txidind.%d\n",txidind);
if ( bits256_cmp(txid,T[txidind].txid) == 0 ) if ( bits256_cmp(txid,T[txidind].txid) == 0 )

23
iguana/iguana_unspents.c

@ -407,32 +407,37 @@ int32_t iguana_unspentslists(struct supernet_info *myinfo,struct iguana_info *co
int32_t iguana_uvaltxid(struct supernet_info *myinfo,bits256 *txidp,struct iguana_info *coin,int16_t hdrsi,uint32_t unspentind) int32_t iguana_uvaltxid(struct supernet_info *myinfo,bits256 *txidp,struct iguana_info *coin,int16_t hdrsi,uint32_t unspentind)
{ {
struct iguana_bundle *bp; struct iguana_unspent *U,*u; struct iguana_txid *T; struct iguana_ramchain *ramchain; struct iguana_bundle *bp; struct iguana_unspent *U,*u; struct iguana_txid *T; struct iguana_ramchain *ramchain; struct iguana_ramchaindata *rdata;
if ( (bp= coin->bundles[hdrsi]) == 0 ) if ( (bp= coin->bundles[hdrsi]) == 0 )
return(-1); return(-1);
ramchain = (bp == coin->current) ? &coin->RTramchain : &bp->ramchain; ramchain = (bp == coin->current) ? &coin->RTramchain : &bp->ramchain;
U = RAMCHAIN_PTR(ramchain->H.data,Uoffset); if ( (rdata= ramchain->H.data) != 0 )
T = RAMCHAIN_PTR(ramchain->H.data,Toffset); {
if ( unspentind > 0 && unspentind < ramchain->H.data->numunspents ) U = RAMCHAIN_PTR(rdata,Uoffset);
T = RAMCHAIN_PTR(rdata,Toffset);
if ( unspentind > 0 && unspentind < rdata->numunspents )
{ {
u = &U[unspentind]; u = &U[unspentind];
if ( u->txidind > 0 && u->txidind < ramchain->H.data->numtxids ) if ( u->txidind > 0 && u->txidind < rdata->numtxids )
{ {
*txidp = T[u->txidind].txid; *txidp = T[u->txidind].txid;
return(unspentind - T[u->txidind].firstvout); return(unspentind - T[u->txidind].firstvout);
} }
} }
}
return(-1); return(-1);
} }
int64_t iguana_unspentavail(struct iguana_info *coin,uint64_t hdrsi_unspentind,int32_t minconf,int32_t maxconf) int64_t iguana_unspentavail(struct iguana_info *coin,uint64_t hdrsi_unspentind,int32_t minconf,int32_t maxconf)
{ {
struct iguana_ramchain *ramchain; struct iguana_bundle *bp; int64_t RTspend; int32_t hdrsi,spentheight,spentflag; struct iguana_unspent *U,*u; uint32_t unspentind; struct iguana_ramchain *ramchain; struct iguana_bundle *bp; int64_t RTspend; int32_t hdrsi,spentheight,spentflag; struct iguana_unspent *U,*u; uint32_t unspentind; struct iguana_ramchaindata *rdata;
if ( (bp= coin->bundles[hdrsi_unspentind>>32]) == 0 ) if ( (bp= coin->bundles[hdrsi_unspentind>>32]) == 0 )
return(-1); return(-1);
hdrsi = (int16_t)(hdrsi_unspentind >> 32); hdrsi = (int16_t)(hdrsi_unspentind >> 32);
unspentind = (uint32_t)hdrsi_unspentind; unspentind = (uint32_t)hdrsi_unspentind;
ramchain = (bp == coin->current) ? &coin->RTramchain : &bp->ramchain; ramchain = (bp == coin->current) ? &coin->RTramchain : &bp->ramchain;
if ( (rdata= ramchain->H.data) == 0 )
return(0);
if ( (spentflag= iguana_spentflag(coin,&RTspend,&spentheight,ramchain,hdrsi,unspentind,0,minconf,maxconf,0)) > 0 ) if ( (spentflag= iguana_spentflag(coin,&RTspend,&spentheight,ramchain,hdrsi,unspentind,0,minconf,maxconf,0)) > 0 )
{ {
printf("[%d].u%d was already spent ht.%d\n",hdrsi,(uint32_t)unspentind,spentheight); printf("[%d].u%d was already spent ht.%d\n",hdrsi,(uint32_t)unspentind,spentheight);
@ -440,15 +445,15 @@ int64_t iguana_unspentavail(struct iguana_info *coin,uint64_t hdrsi_unspentind,i
} }
else if ( spentflag == 0 ) else if ( spentflag == 0 )
{ {
U = RAMCHAIN_PTR(ramchain->H.data,Uoffset); U = RAMCHAIN_PTR(rdata,Uoffset);
if ( unspentind > 0 && unspentind < ramchain->H.data->numunspents ) if ( unspentind > 0 && unspentind < rdata->numunspents )
{ {
u = &U[unspentind]; u = &U[unspentind];
return(u->value); return(u->value);
} }
else else
{ {
printf("illegal unspentind.%u vs %u [%d]\n",unspentind,ramchain->H.data->numunspents,bp->hdrsi); printf("illegal unspentind.%u vs %u [%d]\n",unspentind,rdata->numunspents,bp->hdrsi);
return(-2); return(-2);
} }
} }

19
iguana/iguana_volatiles.c

@ -83,16 +83,16 @@ int32_t iguana_utxoupdate(struct iguana_info *coin,int16_t spent_hdrsi,uint32_t
struct iguana_utxo iguana_utxofind(struct iguana_info *coin,int16_t spent_hdrsi,uint32_t spent_unspentind,int32_t *RTspendflagp,int32_t lockflag) struct iguana_utxo iguana_utxofind(struct iguana_info *coin,int16_t spent_hdrsi,uint32_t spent_unspentind,int32_t *RTspendflagp,int32_t lockflag)
{ {
uint64_t val,uval; struct iguana_hhutxo *hhutxo; struct iguana_utxo utxo; struct iguana_ramchain *ramchain; struct iguana_bundle *bp; uint64_t val,uval; struct iguana_hhutxo *hhutxo; struct iguana_utxo utxo; struct iguana_ramchain *ramchain; struct iguana_bundle *bp; struct iguana_ramchaindata *rdata;
*RTspendflagp = 0; *RTspendflagp = 0;
memset(&utxo,0,sizeof(utxo)); memset(&utxo,0,sizeof(utxo));
if ( (bp= coin->bundles[spent_hdrsi]) == 0 ) if ( (bp= coin->bundles[spent_hdrsi]) == 0 )
return(utxo); return(utxo);
ramchain = (bp == coin->current) ? &coin->RTramchain : &bp->ramchain; ramchain = (bp == coin->current) ? &coin->RTramchain : &bp->ramchain;
if ( ramchain->H.data == 0 ) if ( (rdata= ramchain->H.data) == 0 )
return(utxo); return(utxo);
val = ((uint64_t)spent_hdrsi << 32) | spent_unspentind; val = ((uint64_t)spent_hdrsi << 32) | spent_unspentind;
if ( spent_unspentind > 0 && spent_unspentind < ramchain->H.data->numunspents ) if ( spent_unspentind > 0 && spent_unspentind < rdata->numunspents )
{ {
if ( ramchain->Uextras != 0 ) if ( ramchain->Uextras != 0 )
{ {
@ -133,7 +133,7 @@ struct iguana_utxo iguana_utxofind(struct iguana_info *coin,int16_t spent_hdrsi,
} }
else else
{ {
printf("illegal unspentind.%u vs %u hdrs.%d\n",spent_unspentind,ramchain->H.data->numunspents,spent_hdrsi); printf("illegal unspentind.%u vs %u hdrs.%d\n",spent_unspentind,rdata->numunspents,spent_hdrsi);
} }
return(utxo); return(utxo);
} }
@ -141,8 +141,11 @@ struct iguana_utxo iguana_utxofind(struct iguana_info *coin,int16_t spent_hdrsi,
int32_t iguana_spentflag(struct iguana_info *coin,int64_t *RTspendp,int32_t *spentheightp,struct iguana_ramchain *ramchain,int16_t spent_hdrsi,uint32_t spent_unspentind,int32_t height,int32_t minconf,int32_t maxconf,uint64_t amount) int32_t iguana_spentflag(struct iguana_info *coin,int64_t *RTspendp,int32_t *spentheightp,struct iguana_ramchain *ramchain,int16_t spent_hdrsi,uint32_t spent_unspentind,int32_t height,int32_t minconf,int32_t maxconf,uint64_t amount)
{ {
uint32_t numunspents; int32_t RTspentflag; struct iguana_utxo utxo; uint64_t confs,RTspend = 0; uint32_t numunspents; int32_t RTspentflag; struct iguana_utxo utxo; uint64_t confs,RTspend = 0;
struct iguana_ramchaindata *rdata;
if ( (rdata= ramchain->H.data) == 0 )
return(0);
*spentheightp = 0; *spentheightp = 0;
numunspents = ramchain->H.data->numunspents; numunspents = rdata->numunspents;
utxo = iguana_utxofind(coin,spent_hdrsi,spent_unspentind,&RTspentflag,0); utxo = iguana_utxofind(coin,spent_hdrsi,spent_unspentind,&RTspentflag,0);
if ( RTspentflag != 0 ) if ( RTspentflag != 0 )
*RTspendp = (amount == 0) ? coin->txfee : amount; *RTspendp = (amount == 0) ? coin->txfee : amount;
@ -308,7 +311,7 @@ int32_t iguana_volatilesmap(struct iguana_info *coin,struct iguana_ramchain *ram
for (iter=0; iter<2; iter++) for (iter=0; iter<2; iter++)
{ {
sprintf(fname,"%s/%s%s/accounts/debits.%d",GLOBAL_DBDIR,iter==0?"ro/":"",coin->symbol,ramchain->height); sprintf(fname,"%s/%s%s/accounts/debits.%d",GLOBAL_DBDIR,iter==0?"ro/":"",coin->symbol,ramchain->height);
if ( (ramchain->debitsfileptr= OS_mapfile(fname,&ramchain->debitsfilesize,0)) != 0 && ramchain->debitsfilesize == sizeof(int32_t) + 2*sizeof(bits256) + sizeof(*ramchain->A2) * ramchain->H.data->numpkinds ) if ( (ramchain->debitsfileptr= OS_mapfile(fname,&ramchain->debitsfilesize,0)) != 0 && ramchain->debitsfilesize == sizeof(int32_t) + 2*sizeof(bits256) + sizeof(*ramchain->A2) * rdata->numpkinds )
{ {
ramchain->from_roA = (iter == 0); ramchain->from_roA = (iter == 0);
numhdrsi = *(int32_t *)ramchain->debitsfileptr; numhdrsi = *(int32_t *)ramchain->debitsfileptr;
@ -324,7 +327,7 @@ int32_t iguana_volatilesmap(struct iguana_info *coin,struct iguana_ramchain *ram
{ {
ramchain->A2 = (void *)((long)ramchain->debitsfileptr + sizeof(numhdrsi) + 2*sizeof(bits256)); ramchain->A2 = (void *)((long)ramchain->debitsfileptr + sizeof(numhdrsi) + 2*sizeof(bits256));
sprintf(fname,"%s/%s%s/accounts/lastspends.%d",GLOBAL_DBDIR,iter==0?"ro/":"",coin->symbol,ramchain->height); sprintf(fname,"%s/%s%s/accounts/lastspends.%d",GLOBAL_DBDIR,iter==0?"ro/":"",coin->symbol,ramchain->height);
if ( (ramchain->lastspendsfileptr= OS_mapfile(fname,&ramchain->lastspendsfilesize,0)) != 0 && ramchain->lastspendsfilesize == sizeof(int32_t) + 2*sizeof(bits256) + sizeof(*ramchain->Uextras) * ramchain->H.data->numunspents ) if ( (ramchain->lastspendsfileptr= OS_mapfile(fname,&ramchain->lastspendsfilesize,0)) != 0 && ramchain->lastspendsfilesize == sizeof(int32_t) + 2*sizeof(bits256) + sizeof(*ramchain->Uextras) * rdata->numunspents )
{ {
numhdrsi = *(int32_t *)ramchain->lastspendsfileptr; numhdrsi = *(int32_t *)ramchain->lastspendsfileptr;
memcpy(balancehash.bytes,(void *)((long)ramchain->lastspendsfileptr + sizeof(numhdrsi)),sizeof(balancehash)); memcpy(balancehash.bytes,(void *)((long)ramchain->lastspendsfileptr + sizeof(numhdrsi)),sizeof(balancehash));
@ -340,7 +343,7 @@ int32_t iguana_volatilesmap(struct iguana_info *coin,struct iguana_ramchain *ram
} }
else else
{ {
printf("ramchain.[%d] map error balanceswritten %d vs %d hashes %x %x\n",ramchain->H.data->height,coin->balanceswritten,numhdrsi,coin->balancehash.uints[0],balancehash.uints[0]); printf("ramchain.[%d] map error balanceswritten %d vs %d hashes %x %x\n",rdata->height,coin->balanceswritten,numhdrsi,coin->balancehash.uints[0],balancehash.uints[0]);
err++; err++;
OS_removefile(fname,0); OS_removefile(fname,0);
} }

Loading…
Cancel
Save