From 5c0013ec1e20966a6eefa7d818c2b475da03b116 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 23 Apr 2016 21:58:41 -0500 Subject: [PATCH] test --- iguana/exchanges/bitcoin.c | 44 +++++++++++++++++++++++++++++++------- iguana/iguana_msg.c | 26 +++++++++++++++++----- iguana/iguana_ramchain.c | 8 +------ iguana/iguana_rpc.c | 4 ++-- iguana/iguana_tx.c | 12 +++++------ iguana/ramchain_api.c | 4 ++-- 6 files changed, 68 insertions(+), 30 deletions(-) diff --git a/iguana/exchanges/bitcoin.c b/iguana/exchanges/bitcoin.c index fb8cf02e7..37b51da44 100755 --- a/iguana/exchanges/bitcoin.c +++ b/iguana/exchanges/bitcoin.c @@ -455,6 +455,8 @@ cJSON *iguana_voutjson(struct iguana_info *coin,struct iguana_msgvout *vout,int3 void iguana_addscript(struct iguana_info *coin,cJSON *dest,uint8_t *script,int32_t scriptlen,char *fieldname) { char *scriptstr,scriptbuf[8192+256]; int32_t len; cJSON *scriptobj; + if ( scriptlen < 0 ) + return; if ( scriptlen > sizeof(scriptbuf) ) len = (scriptlen << 1) + 256, scriptstr = malloc(len); else scriptstr = scriptbuf, len = sizeof(scriptbuf); @@ -499,6 +501,11 @@ int32_t iguana_vinparse(struct iguana_info *coin,int32_t rwflag,uint8_t *seriali len += iguana_rwbignum(rwflag,&serialized[len],sizeof(msg->prev_hash),msg->prev_hash.bytes); len += iguana_rwnum(rwflag,&serialized[len],sizeof(msg->prev_vout),&msg->prev_vout); len += iguana_rwvarint32(rwflag,&serialized[len],&msg->scriptlen); + if ( msg->scriptlen > IGUANA_MAXSCRIPTSIZE ) + { + printf("iguana_vinparse illegal scriptlen.%d\n",msg->scriptlen); + return(-1); + } if ( rwflag == 0 ) { msg->vinscript = &serialized[len]; @@ -528,6 +535,11 @@ int32_t iguana_voutparse(int32_t rwflag,uint8_t *serialized,struct iguana_msgvou int32_t len = 0; len += iguana_rwnum(rwflag,&serialized[len],sizeof(msg->value),&msg->value); len += iguana_rwvarint32(rwflag,&serialized[len],&msg->pk_scriptlen); + if ( msg->pk_scriptlen > IGUANA_MAXSCRIPTSIZE ) + { + printf("iguana_voutparse illegal scriptlen.%d\n",msg->pk_scriptlen); + return(-1); + } if ( rwflag == 0 ) msg->pk_script = &serialized[len]; else memcpy(&serialized[len],msg->pk_script,msg->pk_scriptlen); @@ -547,21 +559,25 @@ int32_t iguana_voutparse(int32_t rwflag,uint8_t *serialized,struct iguana_msgvou int32_t iguana_rwmsgtx(struct iguana_info *coin,int32_t rwflag,cJSON *json,uint8_t *serialized,int32_t maxsize,struct iguana_msgtx *msg,bits256 *txidp,char *vpnstr) { - int32_t i,len = 0; uint8_t *txstart = serialized; char txidstr[65]; cJSON *array=0; + int32_t i,n,len = 0; uint8_t *txstart = serialized; char txidstr[65]; cJSON *array=0; len += iguana_rwnum(rwflag,&serialized[len],sizeof(msg->version),&msg->version); if ( json != 0 ) { jaddnum(json,"version",msg->version); array = cJSON_CreateArray(); } + //printf("version.%d\n",msg->version); if ( coin->chain->hastimestamp != 0 ) { len += iguana_rwnum(rwflag,&serialized[len],sizeof(msg->timestamp),&msg->timestamp); - //char str[65]; printf("timestamp.%08x %u %s\n",msg->timestamp,msg->timestamp,utc_str(str,msg->timestamp)); + //char str[65]; printf("version.%d timestamp.%08x %u %s\n",msg->version,msg->timestamp,msg->timestamp,utc_str(str,msg->timestamp)); if ( json != 0 ) jaddnum(json,"timestamp",msg->timestamp); } + //for (i=len; itx_in); + //printf(" tx_in.%08x\n",msg->tx_in); if ( rwflag == 0 ) { if ( len + sizeof(struct iguana_msgvin)*msg->tx_in > maxsize ) @@ -573,12 +589,14 @@ int32_t iguana_rwmsgtx(struct iguana_info *coin,int32_t rwflag,cJSON *json,uint8 msg->vins = (struct iguana_msgvin *)&serialized[maxsize]; memset(msg->vins,0,sizeof(struct iguana_msgvin) * msg->tx_in); } - //printf("tx_in.%08x\n",msg->tx_in); if ( msg->tx_in > 0 && msg->tx_in*sizeof(struct iguana_msgvin) < maxsize ) { for (i=0; itx_in; i++) { - len += iguana_vinparse(coin,rwflag,&serialized[len],&msg->vins[i]); + if ( (n= iguana_vinparse(coin,rwflag,&serialized[len],&msg->vins[i])) < 0 ) + return(-1); + //printf("vin.%d n.%d len.%d\n",i,n,len); + len += n; if ( array != 0 ) jaddi(array,iguana_vinjson(coin,&msg->vins[i])); } @@ -594,7 +612,10 @@ int32_t iguana_rwmsgtx(struct iguana_info *coin,int32_t rwflag,cJSON *json,uint8 jaddnum(json,"numvins",msg->tx_in); array = cJSON_CreateArray(); } + //for (i=len; itx_out); + //printf(" txout.%d\n",msg->tx_out); if ( rwflag == 0 ) { if ( len + sizeof(struct iguana_msgvout)*msg->tx_out > maxsize ) @@ -610,7 +631,9 @@ int32_t iguana_rwmsgtx(struct iguana_info *coin,int32_t rwflag,cJSON *json,uint8 { for (i=0; itx_out; i++) { - len += iguana_voutparse(rwflag,&serialized[len],&msg->vouts[i]); + if ( (n= iguana_voutparse(rwflag,&serialized[len],&msg->vouts[i])) < 0 ) + return(-1); + len += n; if ( array != 0 ) jaddi(array,iguana_voutjson(coin,&msg->vouts[i],i,*txidp)); } @@ -700,7 +723,12 @@ bits256 iguana_parsetxobj(struct iguana_info *coin,int32_t *txstartp,uint8_t *se msg->lock_time = juint(txobj,"locktime"); msg->txid = jbits256(txobj,"txid"); *txstartp = len; - msg->allocsize = iguana_rwmsgtx(coin,1,0,&serialized[len],maxsize-len,msg,&txid,vpnstr); + if ( (msg->allocsize= iguana_rwmsgtx(coin,1,0,&serialized[len],maxsize-len,msg,&txid,vpnstr)) < 0 ) + { + memset(txid.bytes,0,sizeof(txid)); + printf("error parsing txobj\n"); + msg->allocsize = 0; + } //char str[65]; printf("json -> %s\n",bits256_str(str,txid)); return(txid); } @@ -869,12 +897,12 @@ cJSON *bitcoin_hex2json(struct iguana_info *coin,bits256 *txidp,struct iguana_ms msgtx = &M; memset(msgtx,0,sizeof(M)); } - len = (int32_t)strlen(txbytes); + len = (int32_t)strlen(txbytes) >> 1; serialized = malloc(len + 32768); decode_hex(serialized,len,txbytes); vpnstr[0] = 0; memset(txidp,0,sizeof(*txidp)); - printf("bitcoin_hex2json len.%d\n",len); + printf("B bitcoin_hex2json len.%d\n",len); if ( (n= iguana_rwmsgtx(coin,0,txobj,serialized,len + 32768,msgtx,txidp,vpnstr)) <= 0 ) { printf("error from rwmsgtx\n"); diff --git a/iguana/iguana_msg.c b/iguana/iguana_msg.c index 39f29e9e9..ac598aaea 100755 --- a/iguana/iguana_msg.c +++ b/iguana/iguana_msg.c @@ -340,6 +340,7 @@ int32_t iguana_rwvin(int32_t rwflag,struct OS_memspace *mem,uint8_t *serialized, return(len); } +int32_t debugtest; int32_t iguana_rwvout(int32_t rwflag,struct OS_memspace *mem,uint8_t *serialized,struct iguana_msgvout *msg) { int32_t len = 0; @@ -348,10 +349,13 @@ int32_t iguana_rwvout(int32_t rwflag,struct OS_memspace *mem,uint8_t *serialized if ( rwflag == 0 ) msg->pk_script = iguana_memalloc(mem,msg->pk_scriptlen,1); len += iguana_rwmem(rwflag,&serialized[len],msg->pk_scriptlen,msg->pk_script); - //printf("(%.8f scriptlen.%d) ",dstr(msg->value),msg->pk_scriptlen); - //int i; for (i=0; ipk_scriptlen; i++) - // printf("%02x",msg->pk_script[i]); - //printf("\n"); + if ( debugtest != 0 ) + { + printf("(%.8f scriptlen.%d) ",dstr(msg->value),msg->pk_scriptlen); + int i; for (i=0; ipk_scriptlen; i++) + printf("%02x",msg->pk_script[i]); + printf("\n"); + } return(len); } @@ -363,7 +367,7 @@ int32_t iguana_rwtx(int32_t rwflag,struct OS_memspace *mem,uint8_t *serialized,s len += iguana_rwnum(rwflag,&serialized[len],sizeof(msg->timestamp),&msg->timestamp); len += iguana_rwvarint32(rwflag,&serialized[len],&msg->tx_in); //printf("version.%d ",msg->version); - if ( msg->tx_in > 0 && msg->tx_out*100 < maxsize ) + if ( msg->tx_in > 0 && msg->tx_in*100 < maxsize ) { if ( rwflag == 0 ) msg->vins = iguana_memalloc(mem,msg->tx_in * sizeof(*msg->vins),1); @@ -441,6 +445,18 @@ int32_t iguana_gentxarray(struct iguana_info *coin,struct OS_memspace *mem,struc { if ( (n= iguana_rwtx(0,mem,&data[len],&tx[i],recvlen - len,&tx[i].txid,coin->chain->hastimestamp,strcmp(coin->symbol,"VPN")==0)) < 0 ) break; + if ( 1 && bits256_cmp(tx[i].txid,bits256_conv("091c99b7b7f9b83ad2385c45b342ed5dd57035d15ff812262a3ceb3f1b291a5a")) == 0 ) + { + int32_t j; for (j=0; len+jchain->hastimestamp,strcmp(coin->symbol,"VPN")==0)) < 0 ) + { + + } + debugtest = 0;*/ + } numvouts += tx[i].tx_out; numvins += tx[i].tx_in; len += n; diff --git a/iguana/iguana_ramchain.c b/iguana/iguana_ramchain.c index 4ca21107f..07ab0ff2c 100755 --- a/iguana/iguana_ramchain.c +++ b/iguana/iguana_ramchain.c @@ -266,12 +266,6 @@ uint32_t iguana_ramchain_addpkhash(struct iguana_info *coin,RAMCHAIN_FUNC,uint8_ uint32_t iguana_ramchain_addunspent20(struct iguana_info *coin,struct iguana_peer *addr,RAMCHAIN_FUNC,uint64_t value,uint8_t *script,int32_t scriptlen,bits256 txid,int32_t vout,int8_t type,struct iguana_bundle *bp,uint8_t rmd160[20]) { uint32_t unspentind; struct iguana_unspent20 *u; long scriptpos; struct vin_info V; char asmstr[IGUANA_MAXSCRIPTSIZE*2+1]; - { - if ( bits256_cmp(txid,bits256_conv("9d30c5f3ed9924f5a4eba8e274540f007d94d08ad41e34fda96c4803d3c6239a")) == 0 ) - { - ; - } - } unspentind = ramchain->H.unspentind++; u = &U[unspentind]; if ( scriptlen > 0 ) @@ -361,7 +355,7 @@ uint32_t iguana_ramchain_addunspent(struct iguana_info *coin,RAMCHAIN_FUNC,uint6 for (i=0; i<20; i++) if ( rmd160[i] != 0 ) break; - if ( i == 20 && (txi != 0 || vout > 0) ) + if ( i == 20 && vout > 0 ) { printf("iguana_ramchain_addunspent: null rmd160 warning txi.%d vout.%d\n",txi,vout); //return(0); diff --git a/iguana/iguana_rpc.c b/iguana/iguana_rpc.c index 3963135c5..215eb0991 100755 --- a/iguana/iguana_rpc.c +++ b/iguana/iguana_rpc.c @@ -47,7 +47,7 @@ char *sglue(GLUEARGS,char *agent,char *method) len = (int32_t)strlen(rpcretstr); if ( rpcretstr[0] == '"' && rpcretstr[len-1] == '"' ) { - for (i=1,j=0; i= 0 && height < coin->chain->bundlesize*coin->bundlescount && (bp= coin->bundles[height / coin->chain->bundlesize]) != 0 && (rdata= bp->ramchain.H.data) != 0 && txi < tx->numvouts ) + if ( height >= 0 && height < coin->chain->bundlesize*coin->bundlescount && (bp= coin->bundles[height / coin->chain->bundlesize]) != 0 && (rdata= bp->ramchain.H.data) != 0 && i < tx->numvouts ) { U = (void *)(long)((long)rdata + rdata->Uoffset); P = (void *)(long)((long)rdata + rdata->Poffset); - unspentind = (tx->firstvout + txi); + unspentind = (tx->firstvout + i); u = &U[unspentind]; - if ( u->txidind != tx->txidind || u->vout != txi || u->hdrsi != height / coin->chain->bundlesize ) - printf("iguana_voutset: txidind mismatch %d vs %d || %d vs %d || (%d vs %d)\n",u->txidind,u->txidind,u->vout,txi,u->hdrsi,height / coin->chain->bundlesize); + if ( u->txidind != tx->txidind || u->vout != i || u->hdrsi != height / coin->chain->bundlesize ) + printf("iguana_voutset: txidind mismatch %d vs %d || %d vs %d || (%d vs %d)\n",u->txidind,u->txidind,u->vout,i,u->hdrsi,height / coin->chain->bundlesize); vout->value = u->value; vout->pk_script = scriptspace; - scriptlen = iguana_voutscript(coin,bp,scriptspace,asmstr,u,&P[u->pkind],txi); + scriptlen = iguana_voutscript(coin,bp,scriptspace,asmstr,u,&P[u->pkind],i); } else printf("iguana_voutset unexpected path\n"); vout->pk_scriptlen = scriptlen; if ( err != 0 ) diff --git a/iguana/ramchain_api.c b/iguana/ramchain_api.c index 45f6f1169..ce1d488f1 100755 --- a/iguana/ramchain_api.c +++ b/iguana/ramchain_api.c @@ -151,7 +151,7 @@ HASH_AND_INT(bitcoinrpc,getrawtransaction,txid,verbose) txbytes = calloc(1,len*2+1); init_hexbytes_noT(txbytes,coin->blockspace,len); jaddstr(retjson,"result",txbytes); - //printf("txbytes.(%s)\n",txbytes); + printf("txbytes.(%s) len.%d (%s)\n",txbytes,len,jprint(retjson,0)); free(txbytes); return(jprint(retjson,1)); } @@ -193,7 +193,7 @@ STRING_ARG(bitcoinrpc,decoderawtransaction,rawtx) if ( (strlen(rawtx) & 1) != 0 ) return(clonestr("{\"error\":\"rawtx hex has odd length\"}")); txobj = bitcoin_hex2json(coin,&txid,0,rawtx); - char str[65]; printf("got txid.(%s)\n",bits256_str(str,txid)); + //char str[65]; printf("got txid.(%s)\n",bits256_str(str,txid)); } if ( txobj == 0 ) txobj = cJSON_CreateObject();