diff --git a/crypto777/iguana_OS.c b/crypto777/iguana_OS.c index 1d462a514..4788e9e49 100755 --- a/crypto777/iguana_OS.c +++ b/crypto777/iguana_OS.c @@ -535,10 +535,10 @@ void OS_ensure_directory(char *dirname) ,511 #endif ); - printf("mkdir.(%s) retval.%d errno.%d %s\n",dirname,retval,errno,strerror(errno)); + //printf("mkdir.(%s) retval.%d errno.%d %s\n",dirname,retval,errno,strerror(errno)); } else fclose(fp), printf("dirname.(%s) exists\n",dirname); if ( (fp= fopen(fname,"wb")) != 0 ) - fclose(fp), printf("created.(%s)\n",fname); + fclose(fp);//, printf("created.(%s)\n",fname); else printf("cant create.(%s) errno.%d %s\n",fname,errno,strerror(errno)); } else fclose(fp);//, printf("%s exists\n",fname); } diff --git a/deprecated/obsolete.h b/deprecated/obsolete.h index 90816f278..6353e9894 100755 --- a/deprecated/obsolete.h +++ b/deprecated/obsolete.h @@ -14147,6 +14147,7 @@ len = 0; } return(scriptdata); } + //struct scriptdata { uint32_t ind:31,spendflag:1; uint16_t hdrsi,scriptlen; }__attribute__((packed)); #endif diff --git a/iguana/iguana777.h b/iguana/iguana777.h index eb83e8962..77a7dd1cf 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -334,15 +334,13 @@ struct iguana_unspent { uint64_t value; uint32_t txidind,pkind,prevunspentind,sc struct iguana_spend { uint32_t spendtxidind,sequenceid,scriptpos,ipbits; int16_t prevout; uint16_t scriptlen:15,external:1; } __attribute__((packed)); // numsigs:4,numpubkeys:4,p2sh:1,sighash:4 -struct iguana_pkhash { uint8_t rmd160[20]; uint32_t pkind,pubkeyoffset; } __attribute__((packed)); //firstunspentind - -struct scriptdata { uint32_t ind:31,spendflag:1; uint16_t hdrsi,scriptlen; }__attribute__((packed)); +struct iguana_pkhash { uint8_t rmd160[20]; uint32_t pkind; } __attribute__((packed)); //firstunspentind,pubkeyoffset // dynamic -struct iguana_account { uint64_t balance; uint32_t lastunspentind; } __attribute__((packed)); // pkind +struct iguana_account { int64_t total; uint32_t lastind; } __attribute__((packed)); // GLOBAL one zero to non-zero write (unless reorg) -struct iguana_Uextra { uint32_t spendind; uint16_t hdrsi; } __attribute__((packed)); // unspentind +struct iguana_bundleind { uint32_t ind; uint16_t hdrsi; } __attribute__((packed)); // unspentind //struct iguana_pkextra { uint32_t firstspendind; } __attribute__((packed)); // pkind struct iguana_txblock @@ -376,7 +374,7 @@ struct iguana_ramchain uint32_t numblocks:31,expanded:1,pkind,externalind,height; struct iguana_kvitem *txids,*pkhashes; struct OS_memspace *hashmem; long filesize,sigsfilesize; void *fileptr,*sigsfileptr; - struct iguana_account *A,*roA; struct iguana_Uextra *spents; + struct iguana_account *A,*creditsA; struct iguana_bundleind *spents; //struct iguana_Uextra *U2,*roU2; struct iguana_pkextra *P2,*roP2; }; diff --git a/iguana/iguana_ramchain.c b/iguana/iguana_ramchain.c index 3073c94f1..1906d7411 100755 --- a/iguana/iguana_ramchain.c +++ b/iguana/iguana_ramchain.c @@ -442,43 +442,6 @@ uint8_t *iguana_ramchain_scriptdecode(int32_t *metalenp,int32_t *scriptlenp,uint } else return(0); } -uint32_t iguana_ramchain_pubkeyoffset(struct iguana_info *coin,RAMCHAIN_FUNC,int32_t createflag,uint32_t *pkindp,uint32_t *scriptoffsetp,uint8_t *pubkey,uint8_t rmd160[20]) -{ - uint32_t pkind; int32_t plen; struct iguana_kvitem *ptr; - if ( (ptr= iguana_hashfind(ramchain,'P',rmd160)) == 0 ) - { - if ( createflag != 0 ) - { - //printf("from pubkeyoffset\n"); - pkind = iguana_ramchain_addpkhash(coin,RAMCHAIN_ARG,rmd160,0,0,0); - //int32_t i; for (i=0; i<33; i++) - // printf("%02x",pubkey[i]); - //printf(" pkind.%d created from pubkeyoffset\n",pkind); - *pkindp = pkind + 1; - } else return(0); - } else pkind = ptr->hh.itemind; - if ( P[pkind].pubkeyoffset == 0 ) - { - plen = bitcoin_pubkeylen(pubkey); - if ( plen > 0 ) - { - if ( *scriptoffsetp == 0 ) - *scriptoffsetp++ = 0; - P[pkind].pubkeyoffset = *scriptoffsetp, *scriptoffsetp += plen; - // printf(" plen.%d -> new offset.%d\n",plen,*scriptoffsetp); - memcpy(&Kspace[P[pkind].pubkeyoffset],pubkey,plen); - } - else - { - //int32_t i; for (i=0; iH.unspentind++; u = &Ux[unspentind]; if ( (ptr= iguana_hashfind(ramchain,'P',rmd160)) == 0 ) @@ -567,9 +530,9 @@ uint32_t iguana_ramchain_addunspent(struct iguana_info *coin,RAMCHAIN_FUNC,uint6 printf("script mismatch len.%d vs %d or cmp error.%d\n",scriptlen,checklen,(checkscript != 0 && script != 0) ? memcmp(checkscript,script,scriptlen):0); } //else printf("RO spendscript match.%d\n",scriptlen); }*/ - if ( u->ipbits != ipbits || u->scriptpos != fpos || u->scriptlen != scriptlen || u->value != value || u->pkind != pkind || u->value != value || u->txidind != ramchain->H.txidind || (pkind != 0 && u->prevunspentind != A[pkind].lastunspentind) || u->vout != vout || u->hdrsi != hdrsi ) + if ( u->ipbits != ipbits || u->scriptpos != fpos || u->scriptlen != scriptlen || u->value != value || u->pkind != pkind || u->value != value || u->txidind != ramchain->H.txidind || (pkind != 0 && u->prevunspentind != A[pkind].lastind) || u->vout != vout || u->hdrsi != hdrsi ) { - printf("iguana_ramchain_addunspent: (%d %d %d) vs (%d %d %d) mismatched values.(%d %.8f %d %d %d %d) vs (%d %.8f %d %d %d %d)\n",u->ipbits,u->scriptpos,u->scriptlen,ipbits,fpos,scriptlen,u->pkind,dstr(u->value),u->txidind,u->prevunspentind,u->vout,u->hdrsi,pkind,dstr(value),ramchain->H.txidind,A[pkind].lastunspentind,vout,hdrsi); + printf("iguana_ramchain_addunspent: (%d %d %d) vs (%d %d %d) mismatched values.(%d %.8f %d %d %d %d) vs (%d %.8f %d %d %d %d)\n",u->ipbits,u->scriptpos,u->scriptlen,ipbits,fpos,scriptlen,u->pkind,dstr(u->value),u->txidind,u->prevunspentind,u->vout,u->hdrsi,pkind,dstr(value),ramchain->H.txidind,A[pkind].lastind,vout,hdrsi); exit(-1); return(0); } @@ -577,12 +540,12 @@ uint32_t iguana_ramchain_addunspent(struct iguana_info *coin,RAMCHAIN_FUNC,uint6 else { u->value = value; - if ( type == IGUANA_SCRIPT_76AC ) - pubkeyoffset = P[pkind].pubkeyoffset; - else pubkeyoffset = 0; + //if ( type == IGUANA_SCRIPT_76AC ) + // pubkeyoffset = P[pkind].pubkeyoffset; + //else pubkeyoffset = 0; u->vout = vout, u->hdrsi = hdrsi; u->txidind = ramchain->H.txidind, u->pkind = pkind; - u->prevunspentind = A[pkind].lastunspentind; + u->prevunspentind = A[pkind].lastind; /*origoffset = ramchain->H.scriptoffset; if ( type != IGUANA_SCRIPT_STRANGE && type != IGUANA_SCRIPT_DATA && type != IGUANA_SCRIPT_OPRETURN && scriptlen > 0 && script != 0 ) { @@ -619,8 +582,8 @@ uint32_t iguana_ramchain_addunspent(struct iguana_info *coin,RAMCHAIN_FUNC,uint6 u->type = type; } //printf("%p A[%d] last <- U%d\n",&A[pkind],pkind,unspentind); - A[pkind].balance += value; - A[pkind].lastunspentind = unspentind; + A[pkind].total += value; + A[pkind].lastind = unspentind; return(unspentind); } @@ -834,7 +797,7 @@ uint32_t iguana_ramchain_addspend256(struct iguana_info *coin,struct iguana_peer int64_t iguana_hashmemsize(int64_t numtxids,int64_t numunspents,int64_t numspends,int64_t numpkinds,int64_t numexternaltxids,int64_t scriptspace) { int64_t allocsize = 0; - allocsize += (scriptspace + IGUANA_MAXSCRIPTSIZE + ((numtxids + numpkinds) * (sizeof(UT_hash_handle)*2)) + (((sizeof(struct iguana_account)) * 2 * numpkinds)) + (2 * numunspents * sizeof(struct iguana_Uextra))); + allocsize += (scriptspace + IGUANA_MAXSCRIPTSIZE + ((numtxids + numpkinds) * (sizeof(UT_hash_handle)*2)) + (((sizeof(struct iguana_account)) * 2 * numpkinds)) + (2 * numunspents * sizeof(struct iguana_bundleind))); if ( allocsize >= (1LL << 32) ) { printf("REALLY big hashmemsize %llu, truncate and hope for best\n",(long long)allocsize); @@ -857,13 +820,13 @@ void _iguana_ramchain_setptrs(RAMCHAIN_PTRPS,struct iguana_ramchaindata *rdata) *X = (void *)(long)((long)rdata + (long)rdata->Xoffset); //ramchain->roU2 = (void *)(long)((long)rdata + (long)rdata->U2offset); //ramchain->roP2 = (void *)(long)((long)rdata + (long)rdata->P2offset); - ramchain->roA = (void *)(long)(long)((long)rdata + (long)rdata->Aoffset); + ramchain->creditsA = (void *)(long)(long)((long)rdata + (long)rdata->Aoffset); //if ( (*U2= ramchain->U2) == 0 ) // *U2 = ramchain->U2 = ramchain->roU2; //if ( (*P2= ramchain->P2) == 0 ) // *P2 = ramchain->P2 = ramchain->roP2; if ( (*A= ramchain->A) == 0 ) - *A = ramchain->A = ramchain->roA; + *A = ramchain->A = ramchain->creditsA; //printf("T.%p Ux.%p Sx.%p P.%p\n",*T,*Ux,*Sx,*P); *TXbits = (void *)(long)((long)rdata + (long)rdata->TXoffset); *PKbits = (void *)(long)((long)rdata + (long)rdata->PKoffset); @@ -1309,13 +1272,13 @@ int32_t iguana_ramchain_verify(struct iguana_info *coin,struct iguana_ramchain * } } } - if ( ramchain->expanded != 0 && ramchain->A != ramchain->roA ) + if ( ramchain->expanded != 0 && ramchain->A != ramchain->creditsA ) { for (k=rdata->firsti; knumpkinds; k++) { - if ( memcmp(&ramchain->A[k],&ramchain->roA[k],sizeof(ramchain->A[k])) != 0 ) + if ( memcmp(&ramchain->A[k],&ramchain->creditsA[k],sizeof(ramchain->A[k])) != 0 ) { - printf("k.%d balance.(%.8f vs %.8f) lastU.(%d %d)\n",k,dstr(ramchain->A[k].balance),dstr(ramchain->roA[k].balance),ramchain->A[k].lastunspentind,ramchain->roA[k].lastunspentind); + printf("k.%d balance.(%.8f vs %.8f) lastU.(%d %d)\n",k,dstr(ramchain->A[k].total),dstr(ramchain->creditsA[k].total),ramchain->A[k].lastind,ramchain->creditsA[k].lastind); //return(-14); } //if ( memcmp(&ramchain->P2[k],&ramchain->roP2[k],sizeof(ramchain->P2[k])) != 0 ) @@ -1333,8 +1296,8 @@ int32_t iguana_ramchain_free(struct iguana_ramchain *ramchain,int32_t deleteflag struct iguana_kvitem *item,*tmp; if ( ramchain->H.ROflag != 0 && ramchain->hashmem == 0 ) { - //printf("Free A %p %p, U2, P2\n",ramchain->A,ramchain->roA); - if ( ramchain->A != ramchain->roA ) + //printf("Free A %p %p, U2, P2\n",ramchain->A,ramchain->creditsA); + if ( ramchain->A != ramchain->creditsA ) myfree(ramchain->A,sizeof(*ramchain->A) * ramchain->H.data->numpkinds), ramchain->A = 0; //if ( ramchain->U2 != ramchain->roU2 ) // myfree(ramchain->U2,sizeof(*ramchain->U2) * ramchain->H.data->numunspents), ramchain->U2 = 0; @@ -2117,7 +2080,7 @@ int32_t iguana_ramchain_expandedsave(struct iguana_info *coin,RAMCHAIN_FUNC,stru *newchain = *ramchain; //memcpy(ramchain->roU2,ramchain->U2,sizeof(*ramchain->U2) * ramchain->H.data->numunspents); //memcpy(ramchain->roP2,ramchain->P2,sizeof(*ramchain->P2) * ramchain->H.data->numpkinds); - memcpy(ramchain->roA,ramchain->A,sizeof(*ramchain->A) * ramchain->H.data->numpkinds); + memcpy(ramchain->creditsA,ramchain->A,sizeof(*ramchain->A) * ramchain->H.data->numpkinds); memset(ramchain->A,0,sizeof(*ramchain->A) * ramchain->H.data->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("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); @@ -2406,6 +2369,7 @@ int32_t iguana_bundlesaveHT(struct iguana_info *coin,struct OS_memspace *mem,str iguana_bundlemapfree(mem,&HASHMEM,ipbits,ptrs,filesizes,num,R,bp->n); if ( retval == 0 )//|| bp->generrs > 3 ) { + char dirname[1024]; //printf("delete %d files hdrs.%d retval.%d\n",num,bp->hdrsi,retval); for (j=0; jpeers.numfiles -= OS_removefile(fname,0); else printf("error removing.(%s)\n",fname); } + sprintf(dirname,"%s/%s/%d",GLOBALTMPDIR,coin->symbol,bp->bundleheight); + OS_portable_rmdir(dirname,1); bp->ramchain = newchain; iguana_bundleload(coin,bp); } diff --git a/iguana/iguana_recv.c b/iguana/iguana_recv.c index c64acfba6..4ab9d2722 100755 --- a/iguana/iguana_recv.c +++ b/iguana/iguana_recv.c @@ -468,7 +468,7 @@ int32_t iguana_bundleiters(struct iguana_info *coin,struct iguana_bundle *bp,int char str[64]; queue_enqueue("hdrsQ",&coin->hdrsQ,queueitem(bits256_str(str,bp->hashes[0])),1); } - else if ( time(NULL) > bp->lastspeculative+600 || (bp->hdrsi == starti && time(NULL) > bp->lastspeculative+90) ) + else if ( time(NULL) > bp->lastspeculative+3600 || (bp->hdrsi == starti && time(NULL) > bp->lastspeculative+90) ) { for (i=1,counter=0; in && inumspec; i++) { @@ -561,7 +561,7 @@ int32_t iguana_bundleiters(struct iguana_info *coin,struct iguana_bundle *bp,int endmillis = OS_milliseconds() + timelimit + (rand() % 1000); if ( bp->numsaved < bp->n ) width = 100 + max*100;//sqrt(sqrt(bp->n * (1+bp->numsaved+issued)) * (10+coin->bundlescount-bp->hdrsi)); - if ( 1 && bp->hdrsi == starti ) + if ( 0 && bp->hdrsi == starti ) printf("ITERATE.%d max.%d bundle.%d h.%d n.%d r.%d s.%d F.%d I.%d T.%d %f %u next %f counter.%d\n",bp->rank,max,bp->bundleheight/coin->chain->bundlesize,bp->numhashes,bp->n,bp->numrecv,bp->numsaved,bp->emitfinish,issued,timelimit,endmillis-OS_milliseconds(),(uint32_t)time(NULL),width,counter); if ( bp->emitfinish == 0 ) { diff --git a/iguana/iguana_scripts.c b/iguana/iguana_scripts.c index a161b77de..b5fcfaf47 100755 --- a/iguana/iguana_scripts.c +++ b/iguana/iguana_scripts.c @@ -783,6 +783,43 @@ char *iguana_scriptget(struct iguana_info *coin,char *scriptstr,char *asmstr,int #ifdef later +uint32_t iguana_ramchain_pubkeyoffset(struct iguana_info *coin,RAMCHAIN_FUNC,int32_t createflag,uint32_t *pkindp,uint32_t *scriptoffsetp,uint8_t *pubkey,uint8_t rmd160[20]) +{ + uint32_t pkind; int32_t plen; struct iguana_kvitem *ptr; + if ( (ptr= iguana_hashfind(ramchain,'P',rmd160)) == 0 ) + { + if ( createflag != 0 ) + { + //printf("from pubkeyoffset\n"); + pkind = iguana_ramchain_addpkhash(coin,RAMCHAIN_ARG,rmd160,0,0,0); + //int32_t i; for (i=0; i<33; i++) + // printf("%02x",pubkey[i]); + //printf(" pkind.%d created from pubkeyoffset\n",pkind); + *pkindp = pkind + 1; + } else return(0); + } else pkind = ptr->hh.itemind; + if ( P[pkind].pubkeyoffset == 0 ) + { + plen = bitcoin_pubkeylen(pubkey); + if ( plen > 0 ) + { + if ( *scriptoffsetp == 0 ) + *scriptoffsetp++ = 0; + P[pkind].pubkeyoffset = *scriptoffsetp, *scriptoffsetp += plen; + // printf(" plen.%d -> new offset.%d\n",plen,*scriptoffsetp); + memcpy(&Kspace[P[pkind].pubkeyoffset],pubkey,plen); + } + else + { + //int32_t i; for (i=0; iscriptoffset]; uint32_t poffset; int32_t totalsize,sigslen,plen,stacksize=0,p2shlen=0,scriptlen = 0; diff --git a/iguana/iguana_unspents.c b/iguana/iguana_unspents.c index 7db61654e..9a4afa529 100755 --- a/iguana/iguana_unspents.c +++ b/iguana/iguana_unspents.c @@ -35,8 +35,8 @@ struct iguana_pkhash *iguana_pkhashfind(struct iguana_info *coin,struct iguana_r if ( (pkind= iguana_sparseaddpk(PKbits,ramchain->H.data->pksparsebits,ramchain->H.data->numpksparse,rmd160,P,0)) > 0 && pkind < ramchain->H.data->numpkinds ) { *ramchainp = ramchain; - *balancep = ACCTS[pkind].balance; - *lastunspentindp = ACCTS[pkind].lastunspentind; + *balancep = ACCTS[pkind].total; + *lastunspentindp = ACCTS[pkind].lastind; *p = P[pkind]; return(p); } //else printf("not found pkind.%d vs num.%d\n",pkind,ramchain->H.data->numpkinds); @@ -75,11 +75,7 @@ struct iguana_bundle *iguana_spent(struct iguana_info *coin,uint32_t *unspentind struct iguana_bundle *spentbp=0; struct iguana_txid *T,TX,*tp; bits256 *X; bits256 prev_hash; X = (void *)(long)((long)ramchain->H.data + ramchain->H.data->Xoffset); T = (void *)(long)((long)ramchain->H.data + ramchain->H.data->Toffset); - if ( s->sequenceid == 1 ) - sequenceid = 0xffffffff; - else if ( s->sequenceid == 2 ) - sequenceid = 0xfffffffe; - else sequenceid = 0; + sequenceid = s->sequenceid; hdrsi = spend_hdrsi; if ( s->prevout < 0 ) { @@ -109,15 +105,15 @@ struct iguana_bundle *iguana_spent(struct iguana_info *coin,uint32_t *unspentind } if ( hdrsi > spend_hdrsi || (spentbp= coin->bundles[hdrsi]) == 0 ) printf("illegal hdrsi.%d when [%d] spentbp.%p\n",hdrsi,spend_hdrsi,spentbp);//, getchar(); - else if ( spentbp->ramchain.spents[unspentind].spendind != 0 || hdrsi < 0 ) - printf("DOUBLE SPEND? U%d %p bp.[%d] unspentind.%u already has %u, no room\n",unspentind,&spentbp->ramchain.spents[unspentind],hdrsi,unspentind,spentbp->ramchain.spents[unspentind].spendind);//, getchar(); + else if ( spentbp->ramchain.spents[unspentind].ind != 0 || hdrsi < 0 ) + printf("DOUBLE SPEND? U%d %p bp.[%d] unspentind.%u already has %u, no room\n",unspentind,&spentbp->ramchain.spents[unspentind],hdrsi,unspentind,spentbp->ramchain.spents[unspentind].ind);//, getchar(); else if ( unspentind == 0 || unspentind >= spentbp->ramchain.H.data->numunspents ) printf("illegal unspentind.%d vs max.%d spentbp.%p[%d]\n",unspentind,spentbp->ramchain.H.data->numunspents,spentbp,hdrsi);//, getchar(); else return(spentbp); return(0); } -int32_t iguana_spentsinit(struct iguana_info *coin,struct iguana_Uextra *spents,struct iguana_bundle *bp,struct iguana_ramchain *ramchain) +int32_t iguana_spentsinit(struct iguana_info *coin,struct iguana_bundleind *spents,struct iguana_bundle *bp,struct iguana_ramchain *ramchain) { //struct iguana_Uextra { uint32_t spendind; uint16_t hdrsi; } __attribute__((packed)); // unspentind //struct iguana_spend { uint32_t spendtxidind; int16_t prevout; uint16_t tbd:14,external:1,diffsequence:1; } __attribute__((packed)); @@ -134,7 +130,7 @@ int32_t iguana_spentsinit(struct iguana_info *coin,struct iguana_Uextra *spents, hdrsi = bp->hdrsi; if ( (spentbp= iguana_spent(coin,&unspentind,ramchain,bp->hdrsi,&S[spendind])) != 0 ) { - spentbp->ramchain.spents[unspentind].spendind = spendind; + spentbp->ramchain.spents[unspentind].ind = spendind; spentbp->ramchain.spents[unspentind].hdrsi = bp->hdrsi; printf("%p bp.[%d] U%d <- S%d.[%d] [%p %p %p]\n",&spentbp->ramchain.spents[unspentind],hdrsi,unspentind,spendind,bp->hdrsi,coin->bundles[0],coin->bundles[1],coin->bundles[2]); flag = 1; @@ -150,7 +146,7 @@ int32_t iguana_spentsinit(struct iguana_info *coin,struct iguana_Uextra *spents, // if file exists and is valid, load and then process only the incremental long iguana_spentsfile(struct iguana_info *coin,int32_t n) { - int32_t i,iter,allocated = 0; long filesize,total,count; struct iguana_Uextra *spents = 0; struct iguana_ramchain *ramchain; char fname[1024]; struct iguana_bundle *bp; FILE *fp; + int32_t i,iter,allocated = 0; long filesize,total,count; struct iguana_bundleind *spents = 0; struct iguana_ramchain *ramchain; char fname[1024]; struct iguana_bundle *bp; FILE *fp; fname[0] = 0; for (total=iter=0; iter<2; iter++) { @@ -240,14 +236,12 @@ int64_t iguana_pkhashbalance(struct iguana_info *coin,cJSON *array,int64_t *spen { (*nump)++; printf("%s u.%d %.8f\n",jprint(iguana_unspentjson(coin,hdrsi,unspentind,T,&U[unspentind],rmd160,coinaddr,pubkey33),1),unspentind,dstr(U[unspentind].value)); - if ( ramchain->spents[unspentind].spendind == 0 ) + if ( ramchain->spents[unspentind].ind == 0 ) { balance += U[unspentind].value; if ( array != 0 ) jaddi(array,iguana_unspentjson(coin,hdrsi,unspentind,T,&U[unspentind],rmd160,coinaddr,pubkey33)); } else (*spentp) += U[unspentind].value; - //if ( unspentind == p->firstunspentind ) - // break; unspentind = U[unspentind].prevunspentind; } return(balance);