From 3b8a1ece30d696400662f2630f1e459c77a73054 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 21 Jan 2017 12:09:03 +0200 Subject: [PATCH] dexkvsearch and dexkvupdate --- iguana/dPoW.h | 9 +++++-- iguana/dpow/dpow_network.c | 44 +++++++++++++++++++++++++++++++++++ iguana/dpow/dpow_rpc.c | 35 ++++++++++++++++++++++++++++ iguana/iguana_notary.c | 10 ++++++++ includes/iguana_apideclares.h | 2 ++ 5 files changed, 98 insertions(+), 2 deletions(-) diff --git a/iguana/dPoW.h b/iguana/dPoW.h index 09adc2903..fbb9f006d 100755 --- a/iguana/dPoW.h +++ b/iguana/dPoW.h @@ -22,7 +22,7 @@ #define DPOW_MINSIGS 17 //#define DPOW_M(bp) ((bp)->minsigs) // (((bp)->numnotaries >> 1) + 1) #define DPOW_MODIND(bp,offset) (((((bp)->height / DPOW_CHECKPOINTFREQ) % (bp)->numnotaries) + (offset)) % (bp)->numnotaries) -#define DPOW_VERSION 0x0780 +#define DPOW_VERSION 0x0781 #define DPOW_UTXOSIZE 10000 #define DPOW_MINOUTPUT 6000 #define DPOW_DURATION 600 @@ -45,7 +45,7 @@ #define DPOW_MAXRELAYS 64 #define DPOW_MAXSIGLEN 128 -#define DEX_VERSION 0x0104 +#define DEX_VERSION 0x0105 #define DPOW_SOCK 7775 #define DEX_SOCK 7774 #define PUB_SOCK 7773 @@ -164,6 +164,8 @@ char *dpow_validateaddress(struct supernet_info *myinfo,struct iguana_info *coin cJSON *dpow_listunspent(struct supernet_info *myinfo,struct iguana_info *coin,char *coinaddr); cJSON *dpow_listtransactions(struct supernet_info *myinfo,struct iguana_info *coin,char *coinaddr,int32_t count,int32_t skip); char *dpow_alladdresses(struct supernet_info *myinfo,struct iguana_info *coin); +cJSON *dpow_kvupdate(struct supernet_info *myinfo,struct iguana_info *coin,char *key,char *value,int32_t flags); +cJSON *dpow_kvsearch(struct supernet_info *myinfo,struct iguana_info *coin,char *key); void init_alladdresses(struct supernet_info *myinfo,struct iguana_info *coin); char *_dex_getinfo(struct supernet_info *myinfo,char *symbol); @@ -180,6 +182,9 @@ char *_dex_listtransactions(struct supernet_info *myinfo,char *symbol,char *coin char *_dex_alladdresses(struct supernet_info *myinfo,char *symbol); int32_t _dex_getheight(struct supernet_info *myinfo,char *symbol); char *_dex_getnotaries(struct supernet_info *myinfo,char *symbol); +char *_dex_kvupdate(struct supernet_info *myinfo,char *symbol,char *key,char *value,int32_t flags); +char *_dex_kvsearch(struct supernet_info *myinfo,char *symbol,char *key); + int32_t komodo_notaries(char *symbol,uint8_t pubkeys[64][33],int32_t height); cJSON *dpow_checkaddress(struct supernet_info *myinfo,struct iguana_info *coin,char *address); diff --git a/iguana/dpow/dpow_network.c b/iguana/dpow/dpow_network.c index 5a762be78..5d49799c6 100755 --- a/iguana/dpow/dpow_network.c +++ b/iguana/dpow/dpow_network.c @@ -498,6 +498,26 @@ char *dex_response(int32_t *broadcastflagp,struct supernet_info *myinfo,struct d retstr = jprint(retjson,1); } } + else if ( dexreq.func == 'k' ) + { + if ( strcmp(coin->symbol,"BTC") == 0 || strcmp(coin->symbol,"ZEC") == 0 || coin->chain->zcash == 0 ) + retstr = clonestr("{\"error\":\"only komodod chains support KV\"}"); + else if ( (retjson= dpow_kvsearch(myinfo,coin,(char *)&dexp->packet[datalen])) != 0 ) + { + dpow_randipbits(myinfo,coin,retjson); + retstr = jprint(retjson,1); + } + } + else if ( dexreq.func == 'K' ) + { + if ( strcmp(coin->symbol,"BTC") == 0 || strcmp(coin->symbol,"ZEC") == 0 || coin->chain->zcash == 0 ) + retstr = clonestr("{\"error\":\"only komodod chains support KV\"}"); + else if ( (retjson= dpow_kvupdate(myinfo,coin,(char *)&dexp->packet[datalen],(char *)&dexp->packet[datalen+dexreq.shortarg],dexreq.intarg)) != 0 ) + { + dpow_randipbits(myinfo,coin,retjson); + retstr = jprint(retjson,1); + } + } else if ( dexreq.func == 'U' ) { if ( (retjson= dpow_listunspent(myinfo,coin,(char *)&dexp->packet[datalen])) != 0 ) @@ -741,6 +761,30 @@ char *_dex_gettxout(struct supernet_info *myinfo,char *symbol,bits256 txid,int32 return(_dex_sendrequest(myinfo,&dexreq,3,"value")); } +char *_dex_kvupdate(struct supernet_info *myinfo,char *symbol,char *key,char *value,int32_t flags) +{ + struct dex_request dexreq; char keyvalue[IGUANA_MAXSCRIPTSIZE]; int32_t keylen,valuesize; + memset(&dexreq,0,sizeof(dexreq)); + safecopy(dexreq.name,symbol,sizeof(dexreq.name)); + dexreq.func = 'K'; + dexreq.intarg = flags; + keylen = (int32_t)strlen(key); + memcpy(keyvalue,key,keylen+1); + valuesize = (int32_t)strlen(value); + dexreq.shortarg = keylen+1; + memcpy(&keyvalue[dexreq.shortarg],value,valuesize+1); + return(_dex_sendrequeststr(myinfo,&dexreq,keyvalue,1,"")); +} + +char *_dex_kvsearch(struct supernet_info *myinfo,char *symbol,char *key) +{ + struct dex_request dexreq; + memset(&dexreq,0,sizeof(dexreq)); + safecopy(dexreq.name,symbol,sizeof(dexreq.name)); + dexreq.func = 'k'; + return(_dex_sendrequeststr(myinfo,&dexreq,key,1,"")); +} + char *_dex_getinfo(struct supernet_info *myinfo,char *symbol) { struct dex_request dexreq; diff --git a/iguana/dpow/dpow_rpc.c b/iguana/dpow/dpow_rpc.c index 525d38441..953c2d388 100755 --- a/iguana/dpow/dpow_rpc.c +++ b/iguana/dpow/dpow_rpc.c @@ -410,6 +410,41 @@ char *dpow_signrawtransaction(struct supernet_info *myinfo,struct iguana_info *c } } +cJSON *dpow_kvupdate(struct supernet_info *myinfo,struct iguana_info *coin,char *key,char *value,int32_t flags) +{ + char params[IGUANA_MAXSCRIPTSIZE+256],*retstr; cJSON *retjson; + if ( coin->FULLNODE < 0 ) + { + sprintf(params,"[\"%s\", \"%s\", \"%d\"]",key,value,flags); + retstr = bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"kvupdate",params); + if ( (retjson= cJSON_Parse(retstr)) == 0 ) + { + free(retstr); + return(cJSON_Parse("{\"error\":\"couldnt parse kvupdate return\"}")); + } + free(retstr); + return(retjson); + } else return(cJSON_Parse("{\"error\":\"only native komodod supports KV\"}")); +} + +cJSON *dpow_kvsearch(struct supernet_info *myinfo,struct iguana_info *coin,char *key) +{ + char params[IGUANA_MAXSCRIPTSIZE+256],*retstr; cJSON *retjson; + if ( coin->FULLNODE < 0 ) + { + sprintf(params,"[\"%s\"]",key); + retstr = bitcoind_passthru(coin->symbol,coin->chain->serverport,coin->chain->userpass,"kvsearch",params); + if ( (retjson= cJSON_Parse(retstr)) == 0 ) + { + free(retstr); + return(cJSON_Parse("{\"error\":\"couldnt parse kvupdate return\"}")); + } + free(retstr); + return(retjson); + } else return(cJSON_Parse("{\"error\":\"only native komodod supports KV\"}")); +} + + char *dpow_sendrawtransaction(struct supernet_info *myinfo,struct iguana_info *coin,char *signedtx) { bits256 txid; cJSON *json,*array; char *paramstr,*retstr; diff --git a/iguana/iguana_notary.c b/iguana/iguana_notary.c index c4f984539..cdf4fd669 100755 --- a/iguana/iguana_notary.c +++ b/iguana/iguana_notary.c @@ -669,6 +669,16 @@ STRING_ARG(dex,getnotaries,symbol) return(_dex_getnotaries(myinfo,symbol)); } +TWO_STRINGS(dex,kvsearch,symbol,key) +{ + return(_dex_kvsearch(myinfo,symbol,key)); +} + +THREE_STRINGS_AND_THREE_INTS(dex,kvupdate,symbol,key,value,flags,unused,unusedb) +{ + return(_dex_kvupdate(myinfo,symbol,key,value,flags)); +} + #include "../includes/iguana_apiundefs.h" diff --git a/includes/iguana_apideclares.h b/includes/iguana_apideclares.h index 1449b0ff8..cd70955cb 100755 --- a/includes/iguana_apideclares.h +++ b/includes/iguana_apideclares.h @@ -39,6 +39,8 @@ TWO_STRINGS(dex,importaddress,symbol,address); TWO_STRINGS(dex,validateaddress,symbol,address); TWO_STRINGS(dex,listunspent,symbol,address); TWO_STRINGS_AND_TWO_DOUBLES(dex,listtransactions,symbol,address,count,skip); +TWO_STRINGS(dex,kvsearch,symbol,key); +THREE_STRINGS_AND_THREE_INTS(dex,kvupdate,symbol,key,value,flags,unused,unusedb); TWO_STRINGS(zcash,passthru,function,hex); TWO_STRINGS(komodo,passthru,function,hex);