From 2ae172f17260b5b45d029d9a63feb38a12cbd93a Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 23 Apr 2016 23:47:53 -0500 Subject: [PATCH] test --- iguana/SuperNET.h | 14 ------------- iguana/exchanges/bitcoin.c | 27 +++++++++++++++---------- iguana/exchanges/bitcoin.h | 14 +++++++++++++ iguana/iguana777.h | 4 ++-- iguana/iguana_json.c | 10 +++++++++- iguana/iguana_rpc.c | 2 +- iguana/ramchain_api.c | 37 +++++++++++++++++++++++++++++++++-- includes/iguana_apideclares.h | 2 +- includes/iguana_apidefs.h | 2 ++ includes/iguana_apiundefs.h | 1 + 10 files changed, 82 insertions(+), 31 deletions(-) diff --git a/iguana/SuperNET.h b/iguana/SuperNET.h index 123823542..b18e90d0a 100755 --- a/iguana/SuperNET.h +++ b/iguana/SuperNET.h @@ -132,20 +132,6 @@ struct category_msg { struct queueitem DL; struct tai t; uint64_t remoteipbits; struct exchange_quote { uint64_t satoshis,orderid,offerNXT,exchangebits; double price,volume; uint32_t timestamp,val; }; -struct bitcoin_unspent -{ - bits256 txid,privkeys[16]; uint64_t value; int32_t vout,spendlen; uint32_t sequence; - uint8_t addrtype,rmd160[20],spendscript[2048]; -}; - -struct bitcoin_spend -{ - char changeaddr[64]; uint8_t change160[20]; - int32_t numinputs; - int64_t txfee,input_satoshis,satoshis,change; - struct bitcoin_unspent inputs[]; -}; - void expand_epbits(char *endpoint,struct endpoint epbits); struct endpoint calc_epbits(char *transport,uint32_t ipbits,uint16_t port,int32_t type); diff --git a/iguana/exchanges/bitcoin.c b/iguana/exchanges/bitcoin.c index 37b51da44..4dc1541b0 100755 --- a/iguana/exchanges/bitcoin.c +++ b/iguana/exchanges/bitcoin.c @@ -877,8 +877,8 @@ int32_t bitcoin_verifytx(struct iguana_info *coin,bits256 *signedtxidp,char **si char *bitcoin_json2hex(struct iguana_info *coin,bits256 *txidp,cJSON *txjson) { int32_t txstart; uint8_t *serialized; struct iguana_msgtx msgtx; char *txbytes = 0; - serialized = malloc(IGUANA_MAXPACKETSIZE); - *txidp = iguana_parsetxobj(coin,&txstart,serialized,IGUANA_MAXPACKETSIZE,&msgtx,txjson); + serialized = malloc(IGUANA_MAXPACKETSIZE*1.5); + *txidp = iguana_parsetxobj(coin,&txstart,serialized,IGUANA_MAXPACKETSIZE*1.5,&msgtx,txjson); if ( msgtx.allocsize > 0 ) { txbytes = malloc(msgtx.allocsize*2 + 1); @@ -913,7 +913,7 @@ cJSON *bitcoin_hex2json(struct iguana_info *coin,bits256 *txidp,struct iguana_ms return(txobj); } -cJSON *bitcoin_createtx(struct iguana_info *coin,int32_t locktime) +cJSON *bitcoin_createtx(struct iguana_info *coin,uint32_t locktime) { cJSON *json = cJSON_CreateObject(); if ( locktime == 0 ) @@ -951,16 +951,22 @@ cJSON *bitcoin_addoutput(struct iguana_info *coin,cJSON *txobj,uint8_t *payments return(txobj); } -cJSON *bitcoin_addinput(struct iguana_info *coin,cJSON *txobj,bits256 txid,int32_t vout,uint32_t sequence,uint8_t *script,int32_t scriptlen) +cJSON *bitcoin_addinput(struct iguana_info *coin,cJSON *txobj,bits256 txid,int32_t vout,uint32_t sequenceid,uint8_t *script,int32_t scriptlen,uint8_t *redeemscript,int32_t p2shlen) { - cJSON *item,*vins; + cJSON *item,*vins; char p2shscriptstr[IGUANA_MAXSCRIPTSIZE*2+1]; vins = jduplicate(jobj(txobj,"vin")); jdelete(txobj,"vin"); item = cJSON_CreateObject(); - iguana_addscript(coin,item,script,scriptlen,"scriptPubKey"); + if ( script != 0 && scriptlen > 0 ) + iguana_addscript(coin,item,script,scriptlen,"scriptPubKey"); + if ( redeemscript != 0 && p2shlen > 0 ) + { + init_hexbytes_noT(p2shscriptstr,redeemscript,p2shlen); + jaddstr(item,"redeemScript",p2shscriptstr); + } jaddbits256(item,"txid",txid); jaddnum(item,"vout",vout); - jaddnum(item,"sequence",sequence); + jaddnum(item,"sequenceid",sequenceid); jaddi(vins,item); jadd(txobj,"vin",vins); //printf("addvin -> (%s)\n",jprint(txobj,0)); @@ -1055,7 +1061,7 @@ void iguana_addinputs(struct iguana_info *coin,struct bitcoin_spend *spend,cJSON for (i=0; inuminputs; i++) { spend->inputs[i].sequence = sequence; - bitcoin_addinput(coin,txobj,spend->inputs[i].txid,spend->inputs[i].vout,spend->inputs[i].sequence,spend->inputs[i].spendscript,spend->inputs[i].spendlen); + bitcoin_addinput(coin,txobj,spend->inputs[i].txid,spend->inputs[i].vout,spend->inputs[i].sequence,spend->inputs[i].spendscript,spend->inputs[i].spendlen,spend->inputs[i].p2shscript,spend->inputs[i].p2shlen); } } @@ -1567,7 +1573,7 @@ int32_t bitcoin_txaddspend(struct iguana_info *coin,cJSON *txobj,char *destaddre P2SH_SPENDAPI(iguana,spendmsig,activecoin,vintxid,vinvout,destaddress,destamount,destaddress2,destamount2,M,N,pubA,wifA,pubB,wifB,pubC,wifC) { - struct vin_info V; uint8_t p2sh_rmd160[20],serialized[2096]; + struct vin_info V; uint8_t p2sh_rmd160[20],serialized[2096],spendscript[32]; int32_t spendlen; char msigaddr[64],*retstr; cJSON *retjson,*txobj; struct iguana_info *active; bits256 signedtxid; char *signedtx; struct iguana_msgtx msgtx; @@ -1589,7 +1595,8 @@ P2SH_SPENDAPI(iguana,spendmsig,activecoin,vintxid,vinvout,destaddress,destamount return(retstr); V.M = M, V.N = N, V.type = IGUANA_SCRIPT_P2SH; V.p2shlen = bitcoin_MofNspendscript(p2sh_rmd160,V.p2shscript,0,&V); - bitcoin_addinput(active,txobj,vintxid,vinvout,0xffffffff,V.p2shscript,V.p2shlen); + spendlen = bitcoin_p2shspend(spendscript,0,p2sh_rmd160); + bitcoin_addinput(active,txobj,vintxid,vinvout,0xffffffff,spendscript,spendlen,V.p2shscript,V.p2shlen); bitcoin_address(msigaddr,active->chain->p2shtype,V.p2shscript,V.p2shlen); retjson = cJSON_CreateObject(); if ( bitcoin_verifyvins(active,&signedtxid,&signedtx,&msgtx,serialized,sizeof(serialized),&V,0) == 0 ) diff --git a/iguana/exchanges/bitcoin.h b/iguana/exchanges/bitcoin.h index 7aca22435..28f6fd00e 100755 --- a/iguana/exchanges/bitcoin.h +++ b/iguana/exchanges/bitcoin.h @@ -63,6 +63,20 @@ struct bp_key { EC_KEY *k; }; +struct bitcoin_unspent +{ + bits256 txid,privkeys[16]; uint64_t value; int32_t vout,spendlen,p2shlen; uint32_t sequence; + uint8_t addrtype,rmd160[20],pubkey[65],spendscript[IGUANA_MAXSCRIPTSIZE],p2shscript[IGUANA_MAXSCRIPTSIZE]; +}; + +struct bitcoin_spend +{ + char changeaddr[64]; uint8_t change160[20]; + int32_t numinputs; + int64_t txfee,input_satoshis,satoshis,change; + struct bitcoin_unspent inputs[]; +}; + int32_t bitcoin_validaddress(struct iguana_info *coin,char *coinaddr); int32_t bitcoin_cltvscript(uint8_t p2shtype,char *ps2h_coinaddr,uint8_t p2sh_rmd160[20],uint8_t *script,int32_t n,char *senderaddr,char *otheraddr,uint8_t secret160[20],uint32_t locktime); int32_t bitcoin_addr2rmd160(uint8_t *addrtypep,uint8_t rmd160[20],char *coinaddr); diff --git a/iguana/iguana777.h b/iguana/iguana777.h index 87f7f62ab..eceacf309 100755 --- a/iguana/iguana777.h +++ b/iguana/iguana777.h @@ -803,10 +803,10 @@ int32_t bitcoin_checklocktimeverify(uint8_t *script,int32_t n,uint32_t locktime) struct bitcoin_spend *iguana_spendset(struct supernet_info *myinfo,struct iguana_info *coin,int64_t satoshis,int64_t insurance,char *account); cJSON *bitcoin_hex2json(struct iguana_info *coin,bits256 *txidp,struct iguana_msgtx *msgtx,char *txbytes); cJSON *iguana_signtx(struct iguana_info *coin,bits256 *txidp,char **signedtxp,struct bitcoin_spend *spend,cJSON *txobj); -cJSON *bitcoin_createtx(struct iguana_info *coin,int32_t locktime); +cJSON *bitcoin_createtx(struct iguana_info *coin,uint32_t locktime); cJSON *bitcoin_addoutput(struct iguana_info *coin,cJSON *txobj,uint8_t *paymentscript,int32_t len,uint64_t satoshis); int32_t bitcoin_changescript(struct iguana_info *coin,uint8_t *changescript,int32_t n,uint64_t *changep,char *changeaddr,uint64_t inputsatoshis,uint64_t satoshis,uint64_t txfee); -cJSON *bitcoin_addinput(struct iguana_info *coin,cJSON *txobj,bits256 txid,int32_t vout,uint32_t sequence,uint8_t *script,int32_t scriptlen); +cJSON *bitcoin_addinput(struct iguana_info *coin,cJSON *txobj,bits256 txid,int32_t vout,uint32_t sequence,uint8_t *script,int32_t scriptlen,uint8_t *redeemscript,int32_t p2shlen); int32_t bitcoin_verifytx(struct iguana_info *coin,bits256 *signedtxidp,char **signedtx,char *rawtxstr,struct vin_info *V); char *bitcoin_json2hex(struct iguana_info *coin,bits256 *txidp,cJSON *txjson); int32_t bitcoin_addr2rmd160(uint8_t *addrtypep,uint8_t rmd160[20],char *coinaddr); diff --git a/iguana/iguana_json.c b/iguana/iguana_json.c index 5554af06c..aee5cfd64 100755 --- a/iguana/iguana_json.c +++ b/iguana/iguana_json.c @@ -119,6 +119,7 @@ cJSON *SuperNET_helpjson() #define IGUANA_HELP_64A(agent,name,j64,obj) array = helpjson(IGUANA_ARGS,#agent,#name,helparray2(cJSON_CreateArray(),helpitem(#j64,"u64bits"),helpitem(#obj,"array"))) #define IGUANA_HELP_AA(agent,name,obj,obj2) array = helpjson(IGUANA_ARGS,#agent,#name,helparray2(cJSON_CreateArray(),helpitem(#obj,"array"),helpitem(#obj2,"array"))) +#define IGUANA_HELP_AOI(agent,name,obj,obj2,val) array = helpjson(IGUANA_ARGS,#agent,#name,helparray3(cJSON_CreateArray(),helpitem(#obj,"array"),helpitem(#obj2,"object"),helpitem(#val,"int"))) #define IGUANA_HELP_D(agent,name,amount) array = helpjson(IGUANA_ARGS,#agent,#name,helparray(cJSON_CreateArray(),helpitem(#amount,"float"))) #define IGUANA_HELP_H(agent,name,hash) array = helpjson(IGUANA_ARGS,#agent,#name,helparray(cJSON_CreateArray(),helpitem(#hash,"hash"))) @@ -180,7 +181,8 @@ cJSON *SuperNET_helpjson() #define TWO_STRINGS_AND_TWO_DOUBLES IGUANA_HELP_SSDD #define STRING_AND_TWO_DOUBLES IGUANA_HELP_SDD #define P2SH_SPENDAPI IGUANA_HELP_SHI_SDSD_II_SSSSSS - +#define ARRAY_OBJ_INT IGUANA_HELP_AOI + #include "../includes/iguana_apideclares.h" #include "../includes/iguana_apiundefs.h" @@ -222,6 +224,10 @@ int32_t agentform(FILE *fp,char *form,int32_t max,char *agent,cJSON *methoditem) width = 24; else if ( strcmp(typestr,"u64bits") == 0 ) width = 24; + else if ( strcmp(typestr,"array") == 0 ) + width = 64; + else if ( strcmp(typestr,"object") == 0 ) + width = 64; else width = 0; } //sprintf(buf,"",fieldname); @@ -902,6 +908,7 @@ char *SuperNET_parser(struct supernet_info *myinfo,char *agentstr,char *method,c #define IGUANA_DISPATCH_SDD(agent,name,str,val,val2) else if ( strcmp(#agent,agentstr) == 0 && strcmp(method,#name) == 0 ) return(agent ## _ ## name(IGUANA_ARGS,jstr(json,#str),jdouble(json,#val),jdouble(json,#val2))) #define IGUANA_DISPATCH_SA(agent,name,str,array) else if ( strcmp(#agent,agentstr) == 0 && strcmp(method,#name) == 0 ) return(agent ## _ ## name(IGUANA_ARGS,jstr(json,#str),jobj(json,#array))) #define IGUANA_DISPATCH_SAA(agent,name,str,array,array2) else if ( strcmp(#agent,agentstr) == 0 && strcmp(method,#name) == 0 ) return(agent ## _ ## name(IGUANA_ARGS,jstr(json,#str),jobj(json,#array),jobj(json,#array2))) +#define IGUANA_DISPATCH_AOI(agent,name,array,object,val) else if ( strcmp(#agent,agentstr) == 0 && strcmp(method,#name) == 0 ) return(agent ## _ ## name(IGUANA_ARGS,jobj(json,#array),jobj(json,#object),juint(json,#val))) #define IGUANA_DISPATCH_SIII(agent,name,str,val,val2,val3) else if ( strcmp(#agent,agentstr) == 0 && strcmp(method,#name) == 0 ) return(agent ## _ ## name(IGUANA_ARGS,jstr(json,#str),juint(json,#val),juint(json,#val2),juint(json,#val3))) #define IGUANA_DISPATCH_I(agent,name,val) else if ( strcmp(#agent,agentstr) == 0 && strcmp(method,#name) == 0 ) return(agent ## _ ## name(IGUANA_ARGS,juint(json,#val))) @@ -975,6 +982,7 @@ char *SuperNET_parser(struct supernet_info *myinfo,char *agentstr,char *method,c #define TWO_STRINGS_AND_TWO_DOUBLES IGUANA_DISPATCH_SSDD #define STRING_AND_TWO_DOUBLES IGUANA_DISPATCH_SDD #define P2SH_SPENDAPI IGUANA_DISPATCH_SHI_SDSD_II_SSSSSS +#define ARRAY_OBJ_INT IGUANA_DISPATCH_AOI #include "../includes/iguana_apideclares.h" //#undef IGUANA_ARGS diff --git a/iguana/iguana_rpc.c b/iguana/iguana_rpc.c index 215eb0991..45984d670 100755 --- a/iguana/iguana_rpc.c +++ b/iguana/iguana_rpc.c @@ -480,7 +480,7 @@ static char *getrawtransaction(RPCARGS) static char *createrawtransaction(RPCARGS) { - return(sglue2(0,CALLGLUE,"bitcoinrpc","createrawtransaction","vins",params[0],"vouts",params[1])); + return(sglue3(0,CALLGLUE,"bitcoinrpc","createrawtransaction","vins",params[0],"vouts",params[1],"locktime",params[2])); } static char *decoderawtransaction(RPCARGS) diff --git a/iguana/ramchain_api.c b/iguana/ramchain_api.c index ce1d488f1..5d74ad03b 100755 --- a/iguana/ramchain_api.c +++ b/iguana/ramchain_api.c @@ -386,9 +386,42 @@ THREE_STRINGS(bitcoinrpc,verifymessage,address,sig,message) } // tx -TWO_ARRAYS(bitcoinrpc,createrawtransaction,vins,vouts) +ARRAY_OBJ_INT(bitcoinrpc,createrawtransaction,vins,vouts,locktime) { - cJSON *retjson = cJSON_CreateObject(); + bits256 txid; int32_t vout,scriptlen=0,p2shlen=0,i,n; uint32_t sequenceid; uint8_t script[IGUANA_MAXSCRIPTSIZE],redeemscript[IGUANA_MAXSCRIPTSIZE]; char *str; cJSON *txobj,*item,*retjson = cJSON_CreateObject(); + if ( coin != 0 && (txobj= bitcoin_createtx(coin,locktime)) != 0 ) + { + if ( (n= cJSON_GetArraySize(vins)) > 0 ) + { + for (i=0; i> 1; + decode_hex(script,scriptlen,str); + } + if ( (str= jstr(item,"redeemScript")) != 0 ) + { + p2shlen = (int32_t)strlen(str) >> 1; + decode_hex(redeemscript,p2shlen,str); + } + vout = jint(item,"vout"); + sequenceid = juint(item,"sequenceid"); + txid = jbits256(item,"txid"); + bitcoin_addinput(coin,txobj,txid,vout,sequenceid,script,scriptlen,redeemscript,p2shlen); + } + } + if ( (n= cJSON_GetArraySize(vouts)) > 0 ) + { + for (i=0; i