From bcc47cb07b5676c911f2f4a255163b9a25612fed Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 06:46:58 -1100 Subject: [PATCH 01/37] Updated oracle feed --- src/cc/dapps/oraclefeed.c | 155 +++++++++++++++++++++++++++++++++----- 1 file changed, 135 insertions(+), 20 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index da8b9c4f2..967be380e 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -343,6 +343,106 @@ void komodobroadcast(char *acname,cJSON *hexjson) } } +int32_t get_KMDheight() +{ + cJSON *retjson; char *retstr; int32_t height; + if ( (retjson= get_komodocli(&retstr,"","getinfo","","","")) != 0 ) + { + height = jint(retjson,"blocks"); + fprintf(stderr,"KMDheight.%d\n",height); + free_json(retjson); + } + else if ( retstr != 0 ) + { + fprintf(stderr,"get_KMDheight error.(%s)\n",retstr); + free(retstr); + } + return(0); +} + +bits256 get_KMDblockhash(int32_t height) +{ + cJSON *retjson; char *retstr,heightstr[32]; bits256 hash; + memset(hash.bytes,0,sizeof(hash)); + if ( (retjson= get_komodocli(&retstr,"","getblockhash",heightstr,"","")) != 0 ) + { + fprintf(stderr,"unexpected blockhash json.(%s)\n",jprint(retjson,0)); + free_json(retjson); + } + else if ( retstr != 0 ) + { + fprintf(stderr,"get_KMDblockhash.(%s)\n",retstr); + if ( strlen(retstr) == 64 ) + decode_hex(hash.bytes,32,retstr); + free(retstr); + } + return(hash); +} + +bits256 get_KMDmerkleroot(bits256 blockhash) +{ + cJSON *retjson; char *retstr,str[65]; bits256 merkleroot; + memset(hash.bytes,0,sizeof(hash)); + if ( (retjson= get_komodocli(&retstr,"","getblockheader",bits256_str(str,blockhash),"","")) != 0 ) + { + merkleroot = jbits256(retjson,"merkleroot"); + fprintf(stderr,"got merkleroot.(%s)\n",bits256_str(str,merkleroot)); + free_json(retjson); + } + else if ( retstr != 0 ) + { + fprintf(stderr,"get_KMDmerkleroot error.(%s)\n",retstr); + free(retstr); + } + return(hash); +} + +int32_t get_KMDheader(bits256 *blockhashp,bits256 *merklerootp,int32_t prevheight) +{ + int32_t height = 0; char str[65]; + if ( prevheight == 0 ) + height = get_KMDheight(); + else height = prevheight + 1; + if ( height > 0 ) + { + *blockhashp = get_KMDblockhash(height); + *merklerootp = get_KMDmerkleroot(*blockhashp); + return(height); + } + return(0); +} + +int32_t get_oracledata(int32_t prevheight,char *hexstr,int32_t maxsize,char *format) +{ + uint32_t i,height; uint64_t price; bits256 blockhash,merkleroot; + hexstr[0] = 0; + if ( format[0] == 'L' || format[0] == 'l' ) + { + if ( (price= get_btcusd()) != 0 ) + { + for (i=0; i<8; i++) + sprintf(&hexstr[i*2],"%02x",(uint8_t)((price >> (i*8)) & 0xff)); + hexstr[16] = 0; + return(16); + } + } + else if ( strcmp(format,"Ihh") == 0 ) + { + if ( (height= get_KMDheader(&blockhash,&merkleroot,prevheight)) > prevheight ) + { + for (i=0; i<4; i++) + sprintf(&hexstr[i*2],"%02x",(uint8_t)((height >> (i*8)) & 0xff)); + for (i=0; i<32; i++) + sprintf(&hexstr[8 + i*2],"%02x",blockhash.bytes[i]); + for (i=0; i<32; i++) + sprintf(&hexstr[8 + 64 + i*2],"%02x",merkleroot.bytes[i]); + hexstr[8 + 64*2] = 0; + return(height); + } + } + return(0); +} + /* oraclescreate "BTCUSD" "coindeskpricedata" "L" -> 4895f631316a649e216153aee7a574bd281686265dc4e8d37597f72353facac3 oraclesregister 4895f631316a649e216153aee7a574bd281686265dc4e8d37597f72353facac3 1000000 -> 11c54d4ab17293217276396e27d86f714576ff55a3300dac34417047825edf93 @@ -365,39 +465,54 @@ oraclesdata 17a841a919c284cea8a676f34e793da002e606f19a9258a3190bed12d5aaa3ff 034 */ -#define ORACLETXID "4895f631316a649e216153aee7a574bd281686265dc4e8d37597f72353facac3" -#define MYPUBKEY "02ebc786cb83de8dc3922ab83c21f3f8a2f3216940c3bf9da43ce39e2a3a882c92" -#define ACNAME "ORCL" +//#define ORACLETXID "4895f631316a649e216153aee7a574bd281686265dc4e8d37597f72353facac3" +//#define MYPUBKEY "02ebc786cb83de8dc3922ab83c21f3f8a2f3216940c3bf9da43ce39e2a3a882c92" +//#define ACNAME "ORCL" int32_t main(int32_t argc,char **argv) { - cJSON *clijson,*clijson2,*regjson,*item; int32_t i,j,n; char *retstr,*retstr2,*pkstr,hexstr[64]; uint64_t price; - printf("Powered by CoinDesk (%s) %.8f\n","https://www.coindesk.com/price/",dstr(get_btcusd())); + cJSON *clijson,*clijson2,*regjson,*item; int32_t i,n,height,prevheight = 0; char *format,*acname,*oraclestr,*pkstr,*retstr,*retstr2,*pkstr,hexstr[4096]; uint64_t price; + if ( argc != 5 ) + { + printf("usage: oraclefeed $ACNAME $ORACLETXID $MYPUBKEY $FORMAT\nPowered by CoinDesk (%s) %.8f\n","https://www.coindesk.com/price/",dstr(get_btcusd())); + return(-1); + } + acname = argv[1]; + oraclestr = argv[2]; + pkstr = argv[3]; + format = argv[4]; + if ( strncmp(format,"Ihh",3) != 0 && format[0] != 'L' ) + { + printf("only formats of L and Ihh are supported now\n"); + return(-1); + } while ( 1 ) { retstr = 0; - if ( (price= get_btcusd()) != 0 && (clijson= get_komodocli(&retstr,ACNAME,"oraclesinfo",ORACLETXID,"","")) != 0 ) + if ( (clijson= get_komodocli(&retstr,acname,"oraclesinfo",oraclestr,"","")) != 0 ) { if ( (regjson= jarray(&n,clijson,"registered")) != 0 ) { for (i=0; i> (j*8)) & 0xff)); - hexstr[16] = 0; - if ( (clijson2= get_komodocli(&retstr2,ACNAME,"oraclesdata",ORACLETXID,hexstr,"")) != 0 ) + if ( (height= get_oracledata(prevheight,hexstr,sizeof(hexstr),"Ihh")) != 0 ) { - //printf("data.(%s)\n",jprint(clijson2,0)); - komodobroadcast(ACNAME,clijson2); - free_json(clijson2); - } - else if ( retstr2 != 0 ) - { - printf("error parsing oraclesdata.(%s)\n",retstr2); - free(retstr2); + if ( (clijson2= get_komodocli(&retstr2,acname,"oraclesdata",oraclestr,hexstr,"")) != 0 ) + { + //printf("data.(%s)\n",jprint(clijson2,0)); + komodobroadcast(acname,clijson2); + free_json(clijson2); + prevheight = height; + printf("ht.%d <- %s\n",height,hexstr); + } + else if ( retstr2 != 0 ) + { + printf("error parsing oraclesdata.(%s)\n",retstr2); + free(retstr2); + } } break; } @@ -410,7 +525,7 @@ int32_t main(int32_t argc,char **argv) printf("got json parse error.(%s)\n",retstr); free(retstr); } - sleep(60); + sleep(10); } return(0); } From cbb7f9336c8b2e436053cc4ba71126263759624a Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 06:50:13 -1100 Subject: [PATCH 02/37] Test --- src/cc/dapps/oraclefeed.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 967be380e..fae9773a7 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -382,7 +382,7 @@ bits256 get_KMDblockhash(int32_t height) bits256 get_KMDmerkleroot(bits256 blockhash) { cJSON *retjson; char *retstr,str[65]; bits256 merkleroot; - memset(hash.bytes,0,sizeof(hash)); + memset(merkleroot.bytes,0,sizeof(merkleroot)); if ( (retjson= get_komodocli(&retstr,"","getblockheader",bits256_str(str,blockhash),"","")) != 0 ) { merkleroot = jbits256(retjson,"merkleroot"); @@ -394,7 +394,7 @@ bits256 get_KMDmerkleroot(bits256 blockhash) fprintf(stderr,"get_KMDmerkleroot error.(%s)\n",retstr); free(retstr); } - return(hash); + return(merkleroot); } int32_t get_KMDheader(bits256 *blockhashp,bits256 *merklerootp,int32_t prevheight) @@ -471,7 +471,7 @@ oraclesdata 17a841a919c284cea8a676f34e793da002e606f19a9258a3190bed12d5aaa3ff 034 int32_t main(int32_t argc,char **argv) { - cJSON *clijson,*clijson2,*regjson,*item; int32_t i,n,height,prevheight = 0; char *format,*acname,*oraclestr,*pkstr,*retstr,*retstr2,*pkstr,hexstr[4096]; uint64_t price; + cJSON *clijson,*clijson2,*regjson,*item; int32_t i,n,height,prevheight = 0; char *format,*acname,*oraclestr,*pkstr,*pubstr,*retstr,*retstr2,hexstr[4096]; uint64_t price; if ( argc != 5 ) { printf("usage: oraclefeed $ACNAME $ORACLETXID $MYPUBKEY $FORMAT\nPowered by CoinDesk (%s) %.8f\n","https://www.coindesk.com/price/",dstr(get_btcusd())); @@ -496,7 +496,7 @@ int32_t main(int32_t argc,char **argv) for (i=0; i Date: Tue, 11 Sep 2018 06:54:09 -1100 Subject: [PATCH 03/37] Test --- src/cc/dapps/oraclefeed.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index fae9773a7..3a5dbed6b 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -345,7 +345,7 @@ void komodobroadcast(char *acname,cJSON *hexjson) int32_t get_KMDheight() { - cJSON *retjson; char *retstr; int32_t height; + cJSON *retjson; char *retstr; int32_t height=0; if ( (retjson= get_komodocli(&retstr,"","getinfo","","","")) != 0 ) { height = jint(retjson,"blocks"); @@ -357,7 +357,7 @@ int32_t get_KMDheight() fprintf(stderr,"get_KMDheight error.(%s)\n",retstr); free(retstr); } - return(0); + return(height); } bits256 get_KMDblockhash(int32_t height) From ca2a3a69f46613a10a5423f6e309312e6178da2c Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 06:56:15 -1100 Subject: [PATCH 04/37] Test --- src/cc/dapps/oraclefeed.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 3a5dbed6b..a0bcfed1c 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -364,6 +364,7 @@ bits256 get_KMDblockhash(int32_t height) { cJSON *retjson; char *retstr,heightstr[32]; bits256 hash; memset(hash.bytes,0,sizeof(hash)); + sprintf(heightstr,"%d",height); if ( (retjson= get_komodocli(&retstr,"","getblockhash",heightstr,"","")) != 0 ) { fprintf(stderr,"unexpected blockhash json.(%s)\n",jprint(retjson,0)); From 0c3c6589fc858a622941a2b6b96bd91acb36b389 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 07:00:46 -1100 Subject: [PATCH 05/37] Test --- src/cc/dapps/oraclefeed.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index a0bcfed1c..98bb8ffa4 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -312,12 +312,14 @@ uint64_t get_btcusd() cJSON *get_komodocli(char **retstrp,char *acname,char *method,char *arg0,char *arg1,char *arg2) { long fsize; cJSON *retjson = 0; char cmdstr[32768],*jsonstr,*fname = "/tmp/komodocli"; - sprintf(cmdstr,"./komodo-cli -ac_name=%s %s %s %s %s > %s\n",acname,method,arg0,arg1,arg2,fname); + if ( acname[0] != 0 ) + sprintf(cmdstr,"./komodo-cli -ac_name=%s %s %s %s %s > %s\n",acname,method,arg0,arg1,arg2,fname); + else sprintf(cmdstr,"./komodo-cli %s %s %s %s > %s\n",method,arg0,arg1,arg2,fname); system(cmdstr); *retstrp = 0; if ( (jsonstr= filestr(&fsize,fname)) != 0 ) { - //fprintf(stderr,"%s -> jsonstr.(%s)\n",cmdstr,jsonstr); + fprintf(stderr,"%s -> jsonstr.(%s)\n",cmdstr,jsonstr); if ( (retjson= cJSON_Parse(jsonstr)) == 0 ) *retstrp = jsonstr; else free(jsonstr); From e3e41fcfc44c76c7da58e199e7d54cc9f4f3e335 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 07:05:49 -1100 Subject: [PATCH 06/37] Test --- src/cc/dapps/oraclefeed.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 98bb8ffa4..935c3c59c 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -320,7 +320,7 @@ cJSON *get_komodocli(char **retstrp,char *acname,char *method,char *arg0,char *a if ( (jsonstr= filestr(&fsize,fname)) != 0 ) { fprintf(stderr,"%s -> jsonstr.(%s)\n",cmdstr,jsonstr); - if ( (retjson= cJSON_Parse(jsonstr)) == 0 ) + if ( jsonstr[0] != '{' && jsonstr[0] != '[' && (retjson= cJSON_Parse(jsonstr)) == 0 ) *retstrp = jsonstr; else free(jsonstr); } From 804fd5cdaecc493accfeb5c6ac8b1752506d3263 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 07:07:57 -1100 Subject: [PATCH 07/37] Test --- src/cc/dapps/oraclefeed.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 935c3c59c..37e6320fc 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -320,7 +320,7 @@ cJSON *get_komodocli(char **retstrp,char *acname,char *method,char *arg0,char *a if ( (jsonstr= filestr(&fsize,fname)) != 0 ) { fprintf(stderr,"%s -> jsonstr.(%s)\n",cmdstr,jsonstr); - if ( jsonstr[0] != '{' && jsonstr[0] != '[' && (retjson= cJSON_Parse(jsonstr)) == 0 ) + if ( (jsonstr[0] == '{' || jsonstr[0] == '[') && (retjson= cJSON_Parse(jsonstr)) == 0 ) *retstrp = jsonstr; else free(jsonstr); } From 4aa9ec468fc3bba22339e52d6cd3a7477b59b858 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 07:13:22 -1100 Subject: [PATCH 08/37] Test --- src/rpcblockchain.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index aac0c0f21..a799a5efc 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -107,6 +107,11 @@ static UniValue ValuePoolDesc( UniValue blockheaderToJSON(const CBlockIndex* blockindex) { UniValue result(UniValue::VOBJ); + if ( blockindex == 0 ) + { + result.push_back(Pair("error", "null blockhash")); + return(result); + } result.push_back(Pair("hash", blockindex->GetBlockHash().GetHex())); int confirmations = -1; // Only report confirmations if the block is on the main chain From 1801dc41e756e56d14c3fc993306decb77d1390d Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 07:17:02 -1100 Subject: [PATCH 09/37] Test --- src/cc/dapps/oraclefeed.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 37e6320fc..729ad8ab5 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -320,7 +320,7 @@ cJSON *get_komodocli(char **retstrp,char *acname,char *method,char *arg0,char *a if ( (jsonstr= filestr(&fsize,fname)) != 0 ) { fprintf(stderr,"%s -> jsonstr.(%s)\n",cmdstr,jsonstr); - if ( (jsonstr[0] == '{' || jsonstr[0] == '[') && (retjson= cJSON_Parse(jsonstr)) == 0 ) + if ( (jsonstr[0] != '{' && jsonstr[0] != '[') || (retjson= cJSON_Parse(jsonstr)) == 0 ) *retstrp = jsonstr; else free(jsonstr); } From f0b9742f41e6cd15fc1ac09cab37e7b50ea10761 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 07:20:22 -1100 Subject: [PATCH 10/37] Test --- src/cc/dapps/oraclefeed.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 729ad8ab5..cbef4b8ee 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -374,8 +374,8 @@ bits256 get_KMDblockhash(int32_t height) } else if ( retstr != 0 ) { - fprintf(stderr,"get_KMDblockhash.(%s)\n",retstr); - if ( strlen(retstr) == 64 ) + fprintf(stderr,"get_KMDblockhash.(%s) %d\n",retstr,(int32_t)strlen(retjson)); + if ( strlen(retstr) >= 64 ) decode_hex(hash.bytes,32,retstr); free(retstr); } @@ -409,9 +409,15 @@ int32_t get_KMDheader(bits256 *blockhashp,bits256 *merklerootp,int32_t prevheigh if ( height > 0 ) { *blockhashp = get_KMDblockhash(height); - *merklerootp = get_KMDmerkleroot(*blockhashp); - return(height); + if ( bits256_nonz(*blockhashp) != 0 ) + { + *merklerootp = get_KMDmerkleroot(*blockhashp); + if ( bits256_nonz(*merklerootp) != 0 ) + return(height); + } } + memset(blockhashp,0,sizeof(*blockhashp)); + memset(merklerootp,0,sizeof(*merklerootp)); return(0); } From 910d72499955f7ea1831136cb4ee77c20028cc03 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 07:20:58 -1100 Subject: [PATCH 11/37] Test --- src/cc/dapps/oraclefeed.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index cbef4b8ee..bf8f3ac50 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -374,7 +374,7 @@ bits256 get_KMDblockhash(int32_t height) } else if ( retstr != 0 ) { - fprintf(stderr,"get_KMDblockhash.(%s) %d\n",retstr,(int32_t)strlen(retjson)); + fprintf(stderr,"get_KMDblockhash.(%s) %d\n",retstr,(int32_t)strlen(retstr)); if ( strlen(retstr) >= 64 ) decode_hex(hash.bytes,32,retstr); free(retstr); From 1760539bbe22959ad414e5b7bfc73f22272f3399 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 07:21:47 -1100 Subject: [PATCH 12/37] Test --- src/cc/dapps/oraclefeed.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index bf8f3ac50..7adc2e6e6 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -376,7 +376,10 @@ bits256 get_KMDblockhash(int32_t height) { fprintf(stderr,"get_KMDblockhash.(%s) %d\n",retstr,(int32_t)strlen(retstr)); if ( strlen(retstr) >= 64 ) + { + retstr[64] = 0; decode_hex(hash.bytes,32,retstr); + } free(retstr); } return(hash); From 509029e2980517d3b2c53fde31e60f1aa6f1b883 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 07:22:44 -1100 Subject: [PATCH 13/37] Test --- src/cc/dapps/oraclefeed.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 7adc2e6e6..0c9212f60 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -319,7 +319,7 @@ cJSON *get_komodocli(char **retstrp,char *acname,char *method,char *arg0,char *a *retstrp = 0; if ( (jsonstr= filestr(&fsize,fname)) != 0 ) { - fprintf(stderr,"%s -> jsonstr.(%s)\n",cmdstr,jsonstr); + //fprintf(stderr,"%s -> jsonstr.(%s)\n",cmdstr,jsonstr); if ( (jsonstr[0] != '{' && jsonstr[0] != '[') || (retjson= cJSON_Parse(jsonstr)) == 0 ) *retstrp = jsonstr; else free(jsonstr); @@ -374,7 +374,7 @@ bits256 get_KMDblockhash(int32_t height) } else if ( retstr != 0 ) { - fprintf(stderr,"get_KMDblockhash.(%s) %d\n",retstr,(int32_t)strlen(retstr)); + //fprintf(stderr,"get_KMDblockhash.(%s) %d\n",retstr,(int32_t)strlen(retstr)); if ( strlen(retstr) >= 64 ) { retstr[64] = 0; @@ -392,7 +392,7 @@ bits256 get_KMDmerkleroot(bits256 blockhash) if ( (retjson= get_komodocli(&retstr,"","getblockheader",bits256_str(str,blockhash),"","")) != 0 ) { merkleroot = jbits256(retjson,"merkleroot"); - fprintf(stderr,"got merkleroot.(%s)\n",bits256_str(str,merkleroot)); + //fprintf(stderr,"got merkleroot.(%s)\n",bits256_str(str,merkleroot)); free_json(retjson); } else if ( retstr != 0 ) From 656e082ae5664044d23647689ea0ef0d9575a799 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 07:24:53 -1100 Subject: [PATCH 14/37] Test --- src/cc/dapps/oraclefeed.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 0c9212f60..f62c49a52 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -407,7 +407,7 @@ int32_t get_KMDheader(bits256 *blockhashp,bits256 *merklerootp,int32_t prevheigh { int32_t height = 0; char str[65]; if ( prevheight == 0 ) - height = get_KMDheight(); + height = get_KMDheight() - 20; else height = prevheight + 1; if ( height > 0 ) { @@ -537,7 +537,7 @@ int32_t main(int32_t argc,char **argv) printf("got json parse error.(%s)\n",retstr); free(retstr); } - sleep(10); + sleep(60); } return(0); } From bcb5cd958f5c431f01c968f84ba3174a378a6f42 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 07:33:17 -1100 Subject: [PATCH 15/37] Test --- src/cc/dapps/oraclefeed.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index f62c49a52..2355e46a2 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -329,7 +329,8 @@ cJSON *get_komodocli(char **retstrp,char *acname,char *method,char *arg0,char *a void komodobroadcast(char *acname,cJSON *hexjson) { - char *hexstr,*retstr; cJSON *retjson; + char *hexstr,*retstr,str[65]; cJSON *retjson; bits256 txid; + memset(txid.bytes,0,sizeof(txid)); if ( (hexstr= jstr(hexjson,"hex")) != 0 ) { if ( (retjson= get_komodocli(&retstr,acname,"sendrawtransaction",hexstr,"","")) != 0 ) @@ -339,10 +340,16 @@ void komodobroadcast(char *acname,cJSON *hexjson) } else if ( retstr != 0 ) { - fprintf(stderr,"txid.(%s)\n",retstr); + if ( strlen(retstr) >= 64 ) + { + retstr[64] = 0; + decode_hex(txid.bytes,32,retstr); + } + fprintf(stderr,"txid.(%s)\n",bits256_str(str,txid)); free(retstr); } } + return(txid); } int32_t get_KMDheight() @@ -537,7 +544,7 @@ int32_t main(int32_t argc,char **argv) printf("got json parse error.(%s)\n",retstr); free(retstr); } - sleep(60); + sleep(50); } return(0); } From f84fdb0c76fc8b40de42209eaa9943acc7d064c9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 07:34:43 -1100 Subject: [PATCH 16/37] Test --- src/cc/dapps/oraclefeed.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 2355e46a2..199d3d5e4 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -327,7 +327,7 @@ cJSON *get_komodocli(char **retstrp,char *acname,char *method,char *arg0,char *a return(retjson); } -void komodobroadcast(char *acname,cJSON *hexjson) +bits256 komodobroadcast(char *acname,cJSON *hexjson) { char *hexstr,*retstr,str[65]; cJSON *retjson; bits256 txid; memset(txid.bytes,0,sizeof(txid)); @@ -490,7 +490,7 @@ oraclesdata 17a841a919c284cea8a676f34e793da002e606f19a9258a3190bed12d5aaa3ff 034 int32_t main(int32_t argc,char **argv) { - cJSON *clijson,*clijson2,*regjson,*item; int32_t i,n,height,prevheight = 0; char *format,*acname,*oraclestr,*pkstr,*pubstr,*retstr,*retstr2,hexstr[4096]; uint64_t price; + cJSON *clijson,*clijson2,*regjson,*item; int32_t i,n,height,prevheight = 0; char *format,*acname,*oraclestr,*pkstr,*pubstr,*retstr,*retstr2,hexstr[4096]; uint64_t price; bits256 txid; if ( argc != 5 ) { printf("usage: oraclefeed $ACNAME $ORACLETXID $MYPUBKEY $FORMAT\nPowered by CoinDesk (%s) %.8f\n","https://www.coindesk.com/price/",dstr(get_btcusd())); @@ -522,10 +522,13 @@ int32_t main(int32_t argc,char **argv) if ( (clijson2= get_komodocli(&retstr2,acname,"oraclesdata",oraclestr,hexstr,"")) != 0 ) { //printf("data.(%s)\n",jprint(clijson2,0)); - komodobroadcast(acname,clijson2); + txid = komodobroadcast(acname,clijson2); + if ( bits256_nonz(txid) != 0 ) + { + prevheight = height; + printf("ht.%d <- %s\n",height,hexstr); + } free_json(clijson2); - prevheight = height; - printf("ht.%d <- %s\n",height,hexstr); } else if ( retstr2 != 0 ) { From f176fbbe505b7b5dc72f552f7e96c48f11bf2f4b Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 07:40:11 -1100 Subject: [PATCH 17/37] Test --- src/cc/dapps/oraclefeed.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 199d3d5e4..2dfe5e1c8 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -352,10 +352,10 @@ bits256 komodobroadcast(char *acname,cJSON *hexjson) return(txid); } -int32_t get_KMDheight() +int32_t get_KMDheight(char *acname) { cJSON *retjson; char *retstr; int32_t height=0; - if ( (retjson= get_komodocli(&retstr,"","getinfo","","","")) != 0 ) + if ( (retjson= get_komodocli(&retstr,acname,"getinfo","","","")) != 0 ) { height = jint(retjson,"blocks"); fprintf(stderr,"KMDheight.%d\n",height); @@ -363,7 +363,7 @@ int32_t get_KMDheight() } else if ( retstr != 0 ) { - fprintf(stderr,"get_KMDheight error.(%s)\n",retstr); + fprintf(stderr,"get_KMDheight.(%s) error.(%s)\n",acname,retstr); free(retstr); } return(height); @@ -414,7 +414,7 @@ int32_t get_KMDheader(bits256 *blockhashp,bits256 *merklerootp,int32_t prevheigh { int32_t height = 0; char str[65]; if ( prevheight == 0 ) - height = get_KMDheight() - 20; + height = get_KMDheight("") - 20; else height = prevheight + 1; if ( height > 0 ) { @@ -490,7 +490,7 @@ oraclesdata 17a841a919c284cea8a676f34e793da002e606f19a9258a3190bed12d5aaa3ff 034 int32_t main(int32_t argc,char **argv) { - cJSON *clijson,*clijson2,*regjson,*item; int32_t i,n,height,prevheight = 0; char *format,*acname,*oraclestr,*pkstr,*pubstr,*retstr,*retstr2,hexstr[4096]; uint64_t price; bits256 txid; + cJSON *clijson,*clijson2,*regjson,*item; int32_t acheight,i,n,height,prevheight = 0; char *format,*acname,*oraclestr,*pkstr,*pubstr,*retstr,*retstr2,hexstr[4096]; uint64_t price; bits256 txid; if ( argc != 5 ) { printf("usage: oraclefeed $ACNAME $ORACLETXID $MYPUBKEY $FORMAT\nPowered by CoinDesk (%s) %.8f\n","https://www.coindesk.com/price/",dstr(get_btcusd())); @@ -505,10 +505,11 @@ int32_t main(int32_t argc,char **argv) printf("only formats of L and Ihh are supported now\n"); return(-1); } + acheight = 0; while ( 1 ) { retstr = 0; - if ( (clijson= get_komodocli(&retstr,acname,"oraclesinfo",oraclestr,"","")) != 0 ) + if ( acheight != get_KMDheight(acname) && (clijson= get_komodocli(&retstr,acname,"oraclesinfo",oraclestr,"","")) != 0 ) { if ( (regjson= jarray(&n,clijson,"registered")) != 0 ) { @@ -526,6 +527,7 @@ int32_t main(int32_t argc,char **argv) if ( bits256_nonz(txid) != 0 ) { prevheight = height; + acheight = get_KMDheight(acname); printf("ht.%d <- %s\n",height,hexstr); } free_json(clijson2); @@ -547,7 +549,7 @@ int32_t main(int32_t argc,char **argv) printf("got json parse error.(%s)\n",retstr); free(retstr); } - sleep(50); + sleep(10); } return(0); } From 58173d2df018b6fe2619198a4c57f3ea94c7af5c Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 07:41:13 -1100 Subject: [PATCH 18/37] Test --- src/cc/dapps/oraclefeed.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 2dfe5e1c8..ba8da8a35 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -358,7 +358,7 @@ int32_t get_KMDheight(char *acname) if ( (retjson= get_komodocli(&retstr,acname,"getinfo","","","")) != 0 ) { height = jint(retjson,"blocks"); - fprintf(stderr,"KMDheight.%d\n",height); + fprintf(stderr,"%s height.%d\n",acname[0]!=0?acname:"KMD",height); free_json(retjson); } else if ( retstr != 0 ) From a69ea70d47f94cddb5f1083eade1e09f46f27582 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 07:42:21 -1100 Subject: [PATCH 19/37] Test --- src/cc/dapps/oraclefeed.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index ba8da8a35..49fc06ec6 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -509,8 +509,9 @@ int32_t main(int32_t argc,char **argv) while ( 1 ) { retstr = 0; - if ( acheight != get_KMDheight(acname) && (clijson= get_komodocli(&retstr,acname,"oraclesinfo",oraclestr,"","")) != 0 ) + if ( acheight != (height= get_KMDheight(acname)) && (clijson= get_komodocli(&retstr,acname,"oraclesinfo",oraclestr,"","")) != 0 ) { + acheight = height; if ( (regjson= jarray(&n,clijson,"registered")) != 0 ) { for (i=0; i Date: Tue, 11 Sep 2018 07:45:40 -1100 Subject: [PATCH 20/37] Test --- src/cc/dapps/oraclefeed.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 49fc06ec6..521905e18 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -358,7 +358,7 @@ int32_t get_KMDheight(char *acname) if ( (retjson= get_komodocli(&retstr,acname,"getinfo","","","")) != 0 ) { height = jint(retjson,"blocks"); - fprintf(stderr,"%s height.%d\n",acname[0]!=0?acname:"KMD",height); + //fprintf(stderr,"%s height.%d\n",acname[0]!=0?acname:"KMD",height); free_json(retjson); } else if ( retstr != 0 ) @@ -551,6 +551,7 @@ int32_t main(int32_t argc,char **argv) free(retstr); } sleep(10); + // best check is for txid to not be in mempool, ie confirmed } return(0); } From 019206ff84d7594d29808484016c94a6f7b53073 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 22:14:18 -1100 Subject: [PATCH 21/37] Filter addassetinputs with signable addresses --- src/cc/CCassetstx.cpp | 6 +++++- src/cc/CCutils.cpp | 1 + src/cc/gateways.cpp | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/cc/CCassetstx.cpp b/src/cc/CCassetstx.cpp index 82623d4b9..a0f80dbc3 100644 --- a/src/cc/CCassetstx.cpp +++ b/src/cc/CCassetstx.cpp @@ -17,10 +17,11 @@ int64_t AddAssetInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPubKey pk,uint256 assetid,int64_t total,int32_t maxinputs) { - char coinaddr[64]; int64_t nValue,price,totalinputs = 0; uint256 txid,hashBlock; std::vector origpubkey; CTransaction vintx; int32_t j,vout,n = 0; + char coinaddr[64],destaddr[64]; int64_t nValue,price,totalinputs = 0; uint256 txid,hashBlock; std::vector origpubkey; CTransaction vintx; int32_t j,vout,n = 0; std::vector > unspentOutputs; GetCCaddress(cp,coinaddr,pk); SetCCunspents(unspentOutputs,coinaddr); + for (std::vector >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++) { txid = it->first.txhash; @@ -32,6 +33,9 @@ int64_t AddAssetInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPubK continue; if ( GetTransaction(txid,vintx,hashBlock,false) != 0 ) { + Getscriptaddress(destaddr,vintx.vout[vout].scriptPubKey); + if ( strcmp(destaddr,coinaddr) != 0 && strcmp(destaddr,cp->unspendableCCaddr) != 0 && strmp(destaddr,cp->unspendableaddr2) != 0 ) + continue; if ( (nValue= IsAssetvout(price,origpubkey,vintx,vout,assetid)) > 0 && myIsutxo_spentinmempool(txid,vout) == 0 ) { if ( total != 0 && maxinputs != 0 ) diff --git a/src/cc/CCutils.cpp b/src/cc/CCutils.cpp index 3a448a92c..396b3211d 100644 --- a/src/cc/CCutils.cpp +++ b/src/cc/CCutils.cpp @@ -339,6 +339,7 @@ bool ProcessCC(struct CCcontract_info *cp,Eval* eval, std::vector param //if ( txid == cp->prevtxid ) // return(true); //fprintf(stderr,"process CC %02x\n",cp->evalcode); + cp->unspendableaddr2[0] = 0; if ( paramsNull.size() != 0 ) // Don't expect params return eval->Invalid("Cannot have params"); else if ( ctx.vout.size() == 0 ) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index b98b95111..5b1201eae 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -17,10 +17,10 @@ /* prevent duplicate bindtxid and cointxid via mempool scan + baton from mempool for oracle assets vin selector needs to filter by signable vins -loop on merkle oracle string oracles */ From 32bf34f0ca8f586248be14e1e702a73977ab2f0d Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 22:16:12 -1100 Subject: [PATCH 22/37] Test --- src/cc/CCassetstx.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/CCassetstx.cpp b/src/cc/CCassetstx.cpp index a0f80dbc3..7d89c0216 100644 --- a/src/cc/CCassetstx.cpp +++ b/src/cc/CCassetstx.cpp @@ -34,7 +34,7 @@ int64_t AddAssetInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPubK if ( GetTransaction(txid,vintx,hashBlock,false) != 0 ) { Getscriptaddress(destaddr,vintx.vout[vout].scriptPubKey); - if ( strcmp(destaddr,coinaddr) != 0 && strcmp(destaddr,cp->unspendableCCaddr) != 0 && strmp(destaddr,cp->unspendableaddr2) != 0 ) + if ( strcmp(destaddr,coinaddr) != 0 && strcmp(destaddr,cp->unspendableCCaddr) != 0 && strcmp(destaddr,cp->unspendableaddr2) != 0 ) continue; if ( (nValue= IsAssetvout(price,origpubkey,vintx,vout,assetid)) > 0 && myIsutxo_spentinmempool(txid,vout) == 0 ) { From 79d79ead57f0d69825341a971846795d38fe5adf Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 22:43:49 -1100 Subject: [PATCH 23/37] Test --- src/cc/CCassetstx.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/cc/CCassetstx.cpp b/src/cc/CCassetstx.cpp index 7d89c0216..cbf40d603 100644 --- a/src/cc/CCassetstx.cpp +++ b/src/cc/CCassetstx.cpp @@ -36,6 +36,7 @@ int64_t AddAssetInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPubK Getscriptaddress(destaddr,vintx.vout[vout].scriptPubKey); if ( strcmp(destaddr,coinaddr) != 0 && strcmp(destaddr,cp->unspendableCCaddr) != 0 && strcmp(destaddr,cp->unspendableaddr2) != 0 ) continue; + fprintf(stderr,"check %s %.8f\n",destaddr,(double)vintx.vout[vout].nValue/COIN); if ( (nValue= IsAssetvout(price,origpubkey,vintx,vout,assetid)) > 0 && myIsutxo_spentinmempool(txid,vout) == 0 ) { if ( total != 0 && maxinputs != 0 ) From b1b5aa7a6f2ea348c9dc502b776b76c137db4c3c Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 22:59:37 -1100 Subject: [PATCH 24/37] Test --- src/cc/gateways.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 5b1201eae..d4e755c8a 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -656,7 +656,7 @@ std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,ui //fprintf(stderr,"depositaddr.(%s) vs %s\n",depositaddr,cp->unspendableaddr2); if ( AddNormalinputs(mtx,mypk,txfee,1) > 0 ) { - if ( (inputs= AddAssetInputs(assetscp,mtx,gatewayspk,assetid,amount,60)) > 0 ) + if ( (inputs= AddAssetInputs(cp,mtx,gatewayspk,assetid,amount,60)) > 0 ) { if ( inputs > amount ) CCchange = (inputs - amount); @@ -664,7 +664,7 @@ std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,ui mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,amount,mypk)); if ( CCchange != 0 ) mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,CCchange,gatewayspk)); - return(FinalizeCCTx(0,assetscp,mtx,mypk,txfee,EncodeAssetOpRet('t',assetid,zeroid,0,Mypubkey()))); + return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeAssetOpRet('t',assetid,zeroid,0,Mypubkey()))); } } fprintf(stderr,"cant find enough inputs or mismatched total\n"); From 23e0b80b6d5b64721645753a39e10835c613fec7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 23:17:13 -1100 Subject: [PATCH 25/37] Test --- src/cc/CCinclude.h | 10 ++++++---- src/cc/CCtx.cpp | 14 +++++++++++++- src/cc/CCutils.cpp | 19 ++++++++++++++++++- src/cc/gateways.cpp | 17 +++++++---------- 4 files changed, 44 insertions(+), 16 deletions(-) diff --git a/src/cc/CCinclude.h b/src/cc/CCinclude.h index afc113083..4beb722a1 100644 --- a/src/cc/CCinclude.h +++ b/src/cc/CCinclude.h @@ -67,12 +67,12 @@ struct CC_utxo struct CCcontract_info { uint256 prevtxid; - char unspendableCCaddr[64],CChexstr[72],normaladdr[64],unspendableaddr2[64]; - uint8_t CCpriv[32],unspendablepriv2[32]; - CPubKey unspendablepk2; + char unspendableCCaddr[64],CChexstr[72],normaladdr[64],unspendableaddr2[64],unspendableaddr3[64]; + uint8_t CCpriv[32],unspendablepriv2[32],unspendablepriv3[32]; + CPubKey unspendablepk2,unspendablepk3; bool (*validate)(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx); bool (*ismyvin)(CScript const& scriptSig); - uint8_t evalcode,evalcode2,didinit; + uint8_t evalcode,evalcode2,evalcode3,didinit; }; struct CCcontract_info *CCinit(struct CCcontract_info *cp,uint8_t evalcode); @@ -126,6 +126,8 @@ CTxOut MakeCC1vout(uint8_t evalcode,CAmount nValue,CPubKey pk); CTxOut MakeCC1of2vout(uint8_t evalcode,CAmount nValue,CPubKey pk,CPubKey pk2); CC *MakeCCcond1(uint8_t evalcode,CPubKey pk); CC* GetCryptoCondition(CScript const& scriptSig); +void CCaddr2set(struct CCcontract_info *cp,uint8_t evalcode,CPubKey pk,uint8_t *priv,char *coinaddr); +void CCaddr3set(struct CCcontract_info *cp,uint8_t evalcode,CPubKey pk,uint8_t *priv,char *coinaddr); bool IsCCInput(CScript const& scriptSig); int32_t unstringbits(char *buf,uint64_t bits); uint64_t stringbits(char *str); diff --git a/src/cc/CCtx.cpp b/src/cc/CCtx.cpp index c9196e951..b92879359 100644 --- a/src/cc/CCtx.cpp +++ b/src/cc/CCtx.cpp @@ -41,7 +41,7 @@ bool SignTx(CMutableTransaction &mtx,int32_t vini,int64_t utxovalue,const CScrip std::string FinalizeCCTx(uint64_t CCmask,struct CCcontract_info *cp,CMutableTransaction &mtx,CPubKey mypk,uint64_t txfee,CScript opret) { auto consensusBranchId = CurrentEpochBranchId(chainActive.Height() + 1, Params().GetConsensus()); - CTransaction vintx; std::string hex; uint256 hashBlock; uint64_t mask=0,nmask=0,vinimask=0; int64_t utxovalues[64],change,normalinputs=0,totaloutputs=0,normaloutputs=0,totalinputs=0; int32_t i,utxovout,n,err = 0; char myaddr[64],destaddr[64],unspendable[64]; uint8_t *privkey,myprivkey[32],unspendablepriv[32],*msg32 = 0; CC *mycond=0,*othercond=0,*othercond2=0,*cond; CPubKey unspendablepk; + CTransaction vintx; std::string hex; uint256 hashBlock; uint64_t mask=0,nmask=0,vinimask=0; int64_t utxovalues[64],change,normalinputs=0,totaloutputs=0,normaloutputs=0,totalinputs=0; int32_t i,utxovout,n,err = 0; char myaddr[64],destaddr[64],unspendable[64]; uint8_t *privkey,myprivkey[32],unspendablepriv[32],*msg32 = 0; CC *mycond=0,*othercond=0,*othercond2=0,*othercond3=0,*cond; CPubKey unspendablepk; n = mtx.vout.size(); for (i=0; ievalcode2,cp->unspendablepk2); cond = othercond2; } + else if ( strcmp(destaddr,cp->unspendableaddr3) == 0 ) + { + //fprintf(stderr,"matched %s unspendable3!\n",cp->unspendableaddr3); + privkey = cp->unspendablepriv3; + if ( othercond3 == 0 ) + othercond3 = MakeCCcond1(cp->evalcode3,cp->unspendablepk3); + cond = othercond3; + } else { fprintf(stderr,"vini.%d has unknown CC address.(%s)\n",i,destaddr); @@ -155,6 +163,10 @@ std::string FinalizeCCTx(uint64_t CCmask,struct CCcontract_info *cp,CMutableTran cc_free(mycond); if ( othercond != 0 ) cc_free(othercond); + if ( othercond2 != 0 ) + cc_free(othercond2); + if ( othercond3 != 0 ) + cc_free(othercond3); std::string strHex = EncodeHexTx(mtx); if ( strHex.size() > 0 ) return(strHex); diff --git a/src/cc/CCutils.cpp b/src/cc/CCutils.cpp index 396b3211d..a91d6ffdd 100644 --- a/src/cc/CCutils.cpp +++ b/src/cc/CCutils.cpp @@ -169,6 +169,22 @@ CPubKey pubkey2pk(std::vector pubkey) return(pk); } +void CCaddr2set(struct CCcontract_info *cp,uint8_t evalcode,CPubKey pk,uint8_t *priv,char *coinaddr) +{ + cp->evalcode2 = evalcode; + cp->unspendablepk2 = pk; + memcpy(cp->unspendablepriv2,priv,32); + strcpy(cp->unspendableaddr2,coinaddr); +} + +void CCaddr3set(struct CCcontract_info *cp,uint8_t evalcode,CPubKey pk,uint8_t *priv,char *coinaddr) +{ + cp->evalcode3 = evalcode; + cp->unspendablepk3 = pk; + memcpy(cp->unspendablepriv3,priv,32); + strcpy(cp->unspendableaddr3,coinaddr); +} + bool Getscriptaddress(char *destaddr,const CScript &scriptPubKey) { CTxDestination address; txnouttype whichType; @@ -339,7 +355,8 @@ bool ProcessCC(struct CCcontract_info *cp,Eval* eval, std::vector param //if ( txid == cp->prevtxid ) // return(true); //fprintf(stderr,"process CC %02x\n",cp->evalcode); - cp->unspendableaddr2[0] = 0; + cp->evalcode2 = cp->evalcode3 = 0; + cp->unspendableaddr2[0] = cp->unspendableaddr3[0] = 0; if ( paramsNull.size() != 0 ) // Don't expect params return eval->Invalid("Cannot have params"); else if ( ctx.vout.size() == 0 ) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index d4e755c8a..53abb345e 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -619,20 +619,17 @@ std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,int32_t height,std:: std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,uint256 deposittxid,CPubKey destpub,int64_t amount) { - CMutableTransaction mtx; CTransaction tx; CPubKey mypk,gatewayspk; struct CCcontract_info *cp,C,*assetscp,C2; uint8_t M,N,taddr,prefix,prefix2; std::string coin; std::vector msigpubkeys; int64_t totalsupply,depositamount,inputs,CCchange=0; int32_t numvouts; uint256 hashBlock,assetid,oracletxid; char str[65],depositaddr[64]; + CMutableTransaction mtx; CTransaction tx; CPubKey mypk,gatewayspk; struct CCcontract_info *cp,C,*assetscp,C2; uint8_t M,N,taddr,prefix,prefix2,mypriv[32]; std::string coin; std::vector msigpubkeys; int64_t totalsupply,depositamount,inputs,CCchange=0; int32_t numvouts; uint256 hashBlock,assetid,oracletxid; char str[65],depositaddr[64],coinaddr[64]; cp = CCinit(&C,EVAL_GATEWAYS); assetscp = CCinit(&C2,EVAL_ASSETS); if ( txfee == 0 ) txfee = 10000; mypk = pubkey2pk(Mypubkey()); gatewayspk = GetUnspendable(cp,0); - _GetCCaddress(cp->unspendableaddr2,EVAL_ASSETS,gatewayspk); - memcpy(cp->unspendablepriv2,cp->CCpriv,32); - assetscp->evalcode2 = cp->evalcode2 = EVAL_ASSETS; - assetscp->unspendablepk2 = gatewayspk; - cp->unspendablepk2 = gatewayspk; - memcpy(assetscp->unspendablepriv2,cp->CCpriv,32); - strcpy(assetscp->unspendableaddr2,cp->unspendableaddr2); + CCaddr2set(assetscp,EVAL_ASSETS,gatewayspk,cp->CCpriv,cp->unspendableCCaddr); + Myprivkey(mypriv); + _GetCCaddress(coinaddr,EVAL_GATEWAYS,mypk); + CCaddr3set(assetscp,EVAL_GATEWAYS,mypk,mypriv,coinaddr); if ( GetTransaction(bindtxid,tx,hashBlock,false) == 0 || (numvouts= tx.vout.size()) <= 0 ) { fprintf(stderr,"cant find bindtxid %s\n",uint256_str(str,bindtxid)); @@ -656,7 +653,7 @@ std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,ui //fprintf(stderr,"depositaddr.(%s) vs %s\n",depositaddr,cp->unspendableaddr2); if ( AddNormalinputs(mtx,mypk,txfee,1) > 0 ) { - if ( (inputs= AddAssetInputs(cp,mtx,gatewayspk,assetid,amount,60)) > 0 ) + if ( (inputs= AddAssetInputs(assetscp,mtx,gatewayspk,assetid,amount,60)) > 0 ) { if ( inputs > amount ) CCchange = (inputs - amount); @@ -664,7 +661,7 @@ std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,ui mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,amount,mypk)); if ( CCchange != 0 ) mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,CCchange,gatewayspk)); - return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeAssetOpRet('t',assetid,zeroid,0,Mypubkey()))); + return(FinalizeCCTx(0,assetscp,mtx,mypk,txfee,EncodeAssetOpRet('t',assetid,zeroid,0,Mypubkey()))); } } fprintf(stderr,"cant find enough inputs or mismatched total\n"); From dfac32e4e193101267b784bbacf52271e843a995 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 23:22:11 -1100 Subject: [PATCH 26/37] Test --- src/cc/gateways.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 53abb345e..990fd3815 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -626,7 +626,8 @@ std::string GatewaysClaim(uint64_t txfee,uint256 bindtxid,std::string refcoin,ui txfee = 10000; mypk = pubkey2pk(Mypubkey()); gatewayspk = GetUnspendable(cp,0); - CCaddr2set(assetscp,EVAL_ASSETS,gatewayspk,cp->CCpriv,cp->unspendableCCaddr); + _GetCCaddress(coinaddr,EVAL_ASSETS,gatewayspk); + CCaddr2set(assetscp,EVAL_ASSETS,gatewayspk,cp->CCpriv,coinaddr); Myprivkey(mypriv); _GetCCaddress(coinaddr,EVAL_GATEWAYS,mypk); CCaddr3set(assetscp,EVAL_GATEWAYS,mypk,mypriv,coinaddr); From b4df8470f3925ecf92854b781a1ce2e73c0b09c4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 23:39:10 -1100 Subject: [PATCH 27/37] Test --- src/cc/gateways.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 990fd3815..ed4b7118a 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -19,8 +19,6 @@ prevent duplicate bindtxid and cointxid via mempool scan baton from mempool for oracle -assets vin selector needs to filter by signable vins - string oracles */ @@ -466,6 +464,7 @@ uint256 GatewaysReverseScan(uint256 &txid,int32_t height,uint256 reforacletxid,u txid = zeroid; while ( GetTransaction(batontxid,tx,hashBlock,false) != 0 && (numvouts= tx.vout.size()) > 0 ) { + fprintf(stderr,"reverse scan %s\n",uint256_str(str,batontxid)); if ( DecodeOraclesData(tx.vout[numvouts-1].scriptPubKey,oracletxid,hash,pk,data) == 'D' && oracletxid == reforacletxid ) { if ( oracle_format(&hash,&merkleht,0,'I',(uint8_t *)data.data(),0,(int32_t)data.size()) == sizeof(int32_t) && merkleht == height ) @@ -596,11 +595,11 @@ std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,int32_t height,std:: } if ( merkleroot == zeroid || m < n/2 ) { - uint256 tmp; - decode_hex((uint8_t *)&tmp,32,(char *)"90aedc2f19200afc9aca2e351438d011ebae8264a58469bf225883045f61917f"); - merkleroot = revuint256(tmp); + //uint256 tmp; + //decode_hex((uint8_t *)&tmp,32,(char *)"90aedc2f19200afc9aca2e351438d011ebae8264a58469bf225883045f61917f"); + //merkleroot = revuint256(tmp); fprintf(stderr,"couldnt find merkleroot for ht.%d %s oracle.%s m.%d vs n.%d\n",height,coin.c_str(),uint256_str(str,oracletxid),m,n); - //return(""); + return(""); } if ( GatewaysVerify(depositaddr,oracletxid,claimvout,coin,cointxid,deposithex,proof,merkleroot,destpub) != amount ) { From 3a4fdc168949a6cbb1e17831873ac5ef1cc59dd6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 23:39:48 -1100 Subject: [PATCH 28/37] Test --- src/cc/gateways.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index ed4b7118a..1c6593520 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -464,7 +464,7 @@ uint256 GatewaysReverseScan(uint256 &txid,int32_t height,uint256 reforacletxid,u txid = zeroid; while ( GetTransaction(batontxid,tx,hashBlock,false) != 0 && (numvouts= tx.vout.size()) > 0 ) { - fprintf(stderr,"reverse scan %s\n",uint256_str(str,batontxid)); + char str[65]; fprintf(stderr,"reverse scan %s\n",uint256_str(str,batontxid)); if ( DecodeOraclesData(tx.vout[numvouts-1].scriptPubKey,oracletxid,hash,pk,data) == 'D' && oracletxid == reforacletxid ) { if ( oracle_format(&hash,&merkleht,0,'I',(uint8_t *)data.data(),0,(int32_t)data.size()) == sizeof(int32_t) && merkleht == height ) From 87904dc9ad9afdcfe51bb7af1360537003e71a2e Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 11 Sep 2018 23:41:40 -1100 Subject: [PATCH 29/37] Test --- src/cc/gateways.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 1c6593520..37f8f84ba 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -574,11 +574,6 @@ std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,int32_t height,std:: fprintf(stderr,"invalid bindtxid %s coin.%s\n",uint256_str(str,bindtxid),coin.c_str()); return(""); } - if ( GatewaysCointxidExists(cp,cointxid) != 0 ) - { - fprintf(stderr,"cointxid.%s already exists\n",uint256_str(str,cointxid)); - return(""); - } n = (int32_t)pubkeys.size(); merkleroot = zeroid; for (i=m=0; i Date: Tue, 11 Sep 2018 23:44:22 -1100 Subject: [PATCH 30/37] Test --- src/cc/gateways.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index 37f8f84ba..f4d67ef54 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -462,9 +462,10 @@ uint256 GatewaysReverseScan(uint256 &txid,int32_t height,uint256 reforacletxid,u { CTransaction tx; uint256 hash,mhash,hashBlock,oracletxid; int64_t val; int32_t numvouts; int64_t merkleht; CPubKey pk; std::vectordata; txid = zeroid; + char str[65]; fprintf(stderr,"reverse scan %s\n",uint256_str(str,batontxid)); while ( GetTransaction(batontxid,tx,hashBlock,false) != 0 && (numvouts= tx.vout.size()) > 0 ) { - char str[65]; fprintf(stderr,"reverse scan %s\n",uint256_str(str,batontxid)); + fprintf(stderr,"reverse scan %s\n",uint256_str(str,batontxid)); if ( DecodeOraclesData(tx.vout[numvouts-1].scriptPubKey,oracletxid,hash,pk,data) == 'D' && oracletxid == reforacletxid ) { if ( oracle_format(&hash,&merkleht,0,'I',(uint8_t *)data.data(),0,(int32_t)data.size()) == sizeof(int32_t) && merkleht == height ) @@ -557,7 +558,7 @@ int64_t GatewaysDepositval(CTransaction tx) std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,int32_t height,std::string refcoin,uint256 cointxid,int32_t claimvout,std::string deposithex,std::vectorproof,CPubKey destpub,int64_t amount) { - CMutableTransaction mtx; CTransaction bindtx; CPubKey mypk,gatewayspk; uint256 oracletxid,merkleroot,mhash,hashBlock,tokenid,txid; int64_t totalsupply; int32_t i,m,n,numvouts; uint8_t M,N,taddr,prefix,prefix2; std::string coin; struct CCcontract_info *cp,C; std::vector pubkeys,publishers; std::vectortxids; char str[65],depositaddr[64],txidaddr[64]; + CMutableTransaction mtx; CTransaction bindtx; CPubKey mypk,gatewayspk; uint256 oracletxid,merkleroot,mhash,hashBlock,tokenid,txid; int64_t totalsupply; int32_t i,m,n,numvouts; uint8_t M,N,taddr,prefix,prefix2; std::string coin; struct CCcontract_info *cp,C; std::vector pubkeys,publishers; std::vectortxids; char str[67],depositaddr[64],txidaddr[64]; cp = CCinit(&C,EVAL_GATEWAYS); if ( txfee == 0 ) txfee = 10000; @@ -578,6 +579,7 @@ std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,int32_t height,std:: merkleroot = zeroid; for (i=m=0; i Date: Tue, 11 Sep 2018 23:45:22 -1100 Subject: [PATCH 31/37] Test --- src/cc/gateways.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index f4d67ef54..e711c0997 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -579,7 +579,7 @@ std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,int32_t height,std:: merkleroot = zeroid; for (i=m=0; i Date: Tue, 11 Sep 2018 23:46:24 -1100 Subject: [PATCH 32/37] Test --- src/cc/gateways.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/gateways.cpp b/src/cc/gateways.cpp index e711c0997..cabb2e2c0 100644 --- a/src/cc/gateways.cpp +++ b/src/cc/gateways.cpp @@ -579,7 +579,7 @@ std::string GatewaysDeposit(uint64_t txfee,uint256 bindtxid,int32_t height,std:: merkleroot = zeroid; for (i=m=0; i Date: Tue, 11 Sep 2018 23:54:31 -1100 Subject: [PATCH 33/37] Test --- src/cc/oracles.cpp | 51 ++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 27 deletions(-) diff --git a/src/cc/oracles.cpp b/src/cc/oracles.cpp index 82e1d4ab0..a8f6bd13a 100644 --- a/src/cc/oracles.cpp +++ b/src/cc/oracles.cpp @@ -276,6 +276,30 @@ uint256 OracleBatonUtxo(uint64_t txfee,struct CCcontract_info *cp,uint256 refora return(batontxid); } +uint256 OraclesBatontxid(uint256 reforacletxid,CPubKey refpk) +{ + std::vector > unspentOutputs; + CTransaction tx; uint256 hash,txid,rettxid,oracletxid; CPubKey pk; int32_t numvouts,height,maxheight=0; int64_t datafee,ht; char markeraddr[64]; std::vector data; struct CCcontract_info *cp,C; + rettxid = zeroid; + cp = CCinit(&C,EVAL_ORACLES); + CCtxidaddr(markeraddr,reforacletxid); + SetCCunspents(unspentOutputs,markeraddr); + for (std::vector >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++) + { + txid = it->first.txhash; + height = (int32_t)it->second.blockHeight; + if ( myGetTransaction(txid,tx,hash) != 0 && (numvouts= tx.vout.size()) > 0 ) + { + if ( DecodeOraclesData(tx.vout[numvouts-1].scriptPubKey,oracletxid,hash,pk,data) == 'D' && oracletxid == reforacletxid && pk == refpk && height > maxheight ) + { + maxheight = height; + rettxid = txid; + } + } + } + return(rettxid); +} + int32_t oracle_format(uint256 *hashp,int64_t *valp,char *str,uint8_t fmt,uint8_t *data,int32_t offset,int32_t datalen) { char _str[65]; int32_t sflag = 0,i,val32,len = 0,slen = 0,dlen = 0; uint32_t uval32; uint16_t uval16; int16_t val16; int64_t val = 0; uint64_t uval = 0; @@ -477,33 +501,6 @@ int64_t OraclePrice(int32_t height,uint256 reforacletxid,char *markeraddr,char * return(0); } -uint256 OraclesBatontxid(uint256 reforacletxid,CPubKey refpk) -{ - std::vector > unspentOutputs; - CTransaction tx; uint256 hash,txid,rettxid,oracletxid; CPubKey pk; int32_t numvouts,maxheight=0; int64_t datafee,ht; char markeraddr[64]; std::vector data; struct CCcontract_info *cp,C; - rettxid = zeroid; - cp = CCinit(&C,EVAL_ORACLES); - CCtxidaddr(markeraddr,reforacletxid); - SetCCunspents(unspentOutputs,markeraddr); - for (std::vector >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++) - { - txid = it->first.txhash; - //ht = (int32_t)it->second.blockHeight; - if ( myGetTransaction(txid,tx,hash) != 0 && (numvouts= tx.vout.size()) > 0 ) - { - if ( DecodeOraclesData(tx.vout[numvouts-1].scriptPubKey,oracletxid,hash,pk,data) == 'D' && oracletxid == reforacletxid && pk == refpk ) - { - if ( oracle_format(&hash,&ht,0,'I',(uint8_t *)data.data(),0,(int32_t)data.size()) == sizeof(int32_t) && ht > maxheight ) - { - maxheight = ht; - rettxid = txid; - } - } - } - } - return(rettxid); -} - int64_t IsOraclesvout(struct CCcontract_info *cp,const CTransaction& tx,int32_t v) { char destaddr[64]; From 1410c4c8bdf3769dfd91bed273280986a431c644 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 00:04:04 -1100 Subject: [PATCH 34/37] Test --- src/cc/oracles.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/cc/oracles.cpp b/src/cc/oracles.cpp index a8f6bd13a..8a6fef624 100644 --- a/src/cc/oracles.cpp +++ b/src/cc/oracles.cpp @@ -279,25 +279,25 @@ uint256 OracleBatonUtxo(uint64_t txfee,struct CCcontract_info *cp,uint256 refora uint256 OraclesBatontxid(uint256 reforacletxid,CPubKey refpk) { std::vector > unspentOutputs; - CTransaction tx; uint256 hash,txid,rettxid,oracletxid; CPubKey pk; int32_t numvouts,height,maxheight=0; int64_t datafee,ht; char markeraddr[64]; std::vector data; struct CCcontract_info *cp,C; - rettxid = zeroid; + CTransaction regtx; uint256 hash,txid,batontxid,oracletxid; CPubKey pk; int32_t numvouts,height,maxheight=0; int64_t datafee; char markeraddr[64]; std::vector data; struct CCcontract_info *cp,C; + batontxid = zeroid; cp = CCinit(&C,EVAL_ORACLES); - CCtxidaddr(markeraddr,reforacletxid); SetCCunspents(unspentOutputs,markeraddr); for (std::vector >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++) { txid = it->first.txhash; height = (int32_t)it->second.blockHeight; - if ( myGetTransaction(txid,tx,hash) != 0 && (numvouts= tx.vout.size()) > 0 ) + if ( myGetTransaction(txid,regtx,hash) != 0 ) { - if ( DecodeOraclesData(tx.vout[numvouts-1].scriptPubKey,oracletxid,hash,pk,data) == 'D' && oracletxid == reforacletxid && pk == refpk && height > maxheight ) + if ( regtx.vout.size() > 0 && DecodeOraclesOpRet(regtx.vout[regtx.vout.size()-1].scriptPubKey,oracletxid,pk,datafee) == 'R' && oracletxid == reforacletxid && pk == refpk ) { - maxheight = height; - rettxid = txid; + Getscriptaddress(batonaddr,regtx.vout[1].scriptPubKey); + batontxid = OracleBatonUtxo(10000,cp,oracletxid,batonaddr,pk,data); + break; } } } - return(rettxid); + return(batontxid); } int32_t oracle_format(uint256 *hashp,int64_t *valp,char *str,uint8_t fmt,uint8_t *data,int32_t offset,int32_t datalen) From ccf003ff1c568c862d400abd58400fa251f808ed Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 00:05:06 -1100 Subject: [PATCH 35/37] Test --- src/cc/oracles.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/oracles.cpp b/src/cc/oracles.cpp index 8a6fef624..c6fb58759 100644 --- a/src/cc/oracles.cpp +++ b/src/cc/oracles.cpp @@ -279,7 +279,7 @@ uint256 OracleBatonUtxo(uint64_t txfee,struct CCcontract_info *cp,uint256 refora uint256 OraclesBatontxid(uint256 reforacletxid,CPubKey refpk) { std::vector > unspentOutputs; - CTransaction regtx; uint256 hash,txid,batontxid,oracletxid; CPubKey pk; int32_t numvouts,height,maxheight=0; int64_t datafee; char markeraddr[64]; std::vector data; struct CCcontract_info *cp,C; + CTransaction regtx; uint256 hash,txid,batontxid,oracletxid; CPubKey pk; int32_t numvouts,height,maxheight=0; int64_t datafee; char markeraddr[64],batonaddr[64]; std::vector data; struct CCcontract_info *cp,C; batontxid = zeroid; cp = CCinit(&C,EVAL_ORACLES); SetCCunspents(unspentOutputs,markeraddr); From d91c603c7592e32e146741188ccdf53a723e0bda Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 00:12:25 -1100 Subject: [PATCH 36/37] Test --- src/cc/dapps/oraclefeed.c | 5 ++--- src/cc/oracles.cpp | 2 ++ 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/cc/dapps/oraclefeed.c b/src/cc/dapps/oraclefeed.c index 521905e18..46c2a305b 100644 --- a/src/cc/dapps/oraclefeed.c +++ b/src/cc/dapps/oraclefeed.c @@ -19,7 +19,6 @@ #include #include "cJSON.c" - char hexbyte(int32_t c) { c &= 0xf; @@ -452,9 +451,9 @@ int32_t get_oracledata(int32_t prevheight,char *hexstr,int32_t maxsize,char *for for (i=0; i<4; i++) sprintf(&hexstr[i*2],"%02x",(uint8_t)((height >> (i*8)) & 0xff)); for (i=0; i<32; i++) - sprintf(&hexstr[8 + i*2],"%02x",blockhash.bytes[i]); + sprintf(&hexstr[8 + (31-i)*2],"%02x",blockhash.bytes[i]); for (i=0; i<32; i++) - sprintf(&hexstr[8 + 64 + i*2],"%02x",merkleroot.bytes[i]); + sprintf(&hexstr[8 + 64 + (31-i)*2],"%02x",merkleroot.bytes[i]); hexstr[8 + 64*2] = 0; return(height); } diff --git a/src/cc/oracles.cpp b/src/cc/oracles.cpp index c6fb58759..ba1b148c3 100644 --- a/src/cc/oracles.cpp +++ b/src/cc/oracles.cpp @@ -283,9 +283,11 @@ uint256 OraclesBatontxid(uint256 reforacletxid,CPubKey refpk) batontxid = zeroid; cp = CCinit(&C,EVAL_ORACLES); SetCCunspents(unspentOutputs,markeraddr); + char str[67]; fprintf(stderr,"markeraddr.(%s) %s\n",markeraddr,pubkey33_str(str,(uint8_t *)&refpk)); for (std::vector >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++) { txid = it->first.txhash; + fprintf(stderr,"check %s\n",uint256_str(str,txid)); height = (int32_t)it->second.blockHeight; if ( myGetTransaction(txid,regtx,hash) != 0 ) { From e06ad50dda6fc56ba54283bc2560ca89ab0758a8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Sep 2018 00:15:30 -1100 Subject: [PATCH 37/37] Test --- src/cc/oracles.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/cc/oracles.cpp b/src/cc/oracles.cpp index ba1b148c3..506605248 100644 --- a/src/cc/oracles.cpp +++ b/src/cc/oracles.cpp @@ -282,6 +282,7 @@ uint256 OraclesBatontxid(uint256 reforacletxid,CPubKey refpk) CTransaction regtx; uint256 hash,txid,batontxid,oracletxid; CPubKey pk; int32_t numvouts,height,maxheight=0; int64_t datafee; char markeraddr[64],batonaddr[64]; std::vector data; struct CCcontract_info *cp,C; batontxid = zeroid; cp = CCinit(&C,EVAL_ORACLES); + CCtxidaddr(markeraddr,reforacletxid); SetCCunspents(unspentOutputs,markeraddr); char str[67]; fprintf(stderr,"markeraddr.(%s) %s\n",markeraddr,pubkey33_str(str,(uint8_t *)&refpk)); for (std::vector >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++)