From 368da363c407e6b879abfab509278add978b2489 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 20 Jan 2017 21:26:46 +0200 Subject: [PATCH] test --- src/komodo_gateway.h | 10 +++++++--- src/komodo_structs.h | 2 +- src/rpcblockchain.cpp | 11 +++++++---- src/wallet/rpcwallet.cpp | 12 +++++++----- 4 files changed, 22 insertions(+), 13 deletions(-) diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index a26efaab2..5f4fb5302 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -671,13 +671,15 @@ int32_t komodo_check_deposit(int32_t height,const CBlock& block) // verify above return(0); } -int32_t komodo_kvsearch(uint8_t value[IGUANA_MAXSCRIPTSIZE],uint8_t *key,int32_t keylen) +int32_t komodo_kvsearch(int32_t *heightp,uint8_t value[IGUANA_MAXSCRIPTSIZE],uint8_t *key,int32_t keylen) { struct komodo_kv *ptr; int32_t retval = -1; + *heightp = -1; portable_mutex_lock(&KOMODO_KV_mutex); HASH_FIND(hh,KOMODO_KV,key,keylen,ptr); if ( ptr != 0 ) { + *heightp = ptr->height; if ( (retval= ptr->valuesize) != 0 ) memcpy(value,ptr->value,retval); } @@ -708,9 +710,10 @@ const char *komodo_opreturn(int32_t height,uint64_t value,uint8_t *opretbuf,int3 uint16_t keylen,valuesize; uint8_t *key,*value; struct komodo_kv *ptr; iguana_rwnum(0,&opretbuf[1],sizeof(keylen),&keylen); iguana_rwnum(0,&opretbuf[3],sizeof(valuesize),&valuesize); - key = &opretbuf[5]; + iguana_rwnum(0,&opretbuf[5],sizeof(kmdheight),&kmdheight); + key = &opretbuf[9]; value = &key[keylen]; - if ( sizeof(keylen)+sizeof(valuesize)+keylen+valuesize+1 == opretlen ) + if ( sizeof(kmdheight)+sizeof(keylen)+sizeof(valuesize)+keylen+valuesize+1 == opretlen ) { portable_mutex_lock(&KOMODO_KV_mutex); HASH_FIND(hh,KOMODO_KV,key,keylen,ptr); @@ -729,6 +732,7 @@ const char *komodo_opreturn(int32_t height,uint64_t value,uint8_t *opretbuf,int3 ptr->value = (uint8_t *)calloc(1,valuesize); memcpy(ptr->value,value,valuesize); } + ptr->height = kmdheight; portable_mutex_unlock(&KOMODO_KV_mutex); } else printf("opretlen.%d mismatch keylen.%d valuesize.%d\n",opretlen,keylen,valuesize); } diff --git a/src/komodo_structs.h b/src/komodo_structs.h index 2bb827849..73c325de2 100644 --- a/src/komodo_structs.h +++ b/src/komodo_structs.h @@ -37,7 +37,7 @@ #define KOMODO_OPRETURN_WITHDRAW 'W' // assetchain #define KOMODO_OPRETURN_REDEEMED 'X' -struct komodo_kv { UT_hash_handle hh; uint8_t *key,*value; uint16_t keylen,valuesize; }; +struct komodo_kv { UT_hash_handle hh; uint8_t *key,*value; int32_t height; uint16_t keylen,valuesize; }; struct komodo_event_notarized { uint256 blockhash,desttxid; int32_t notarizedheight; char dest[16]; }; struct komodo_event_pubkeys { uint8_t num; uint8_t pubkeys[64][33]; }; diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index 8d3253b45..50b17e171 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -406,29 +406,32 @@ int32_t komodo_notaries(uint8_t pubkeys[64][33],int32_t height); char *bitcoin_address(char *coinaddr,uint8_t addrtype,uint8_t *pubkey_or_rmd160,int32_t len); uint32_t komodo_interest_args(int32_t *txheightp,uint32_t *tiptimep,uint64_t *valuep,uint256 hash,int32_t n); int32_t komodo_minerids(uint8_t *minerids,int32_t height); -int32_t komodo_kvsearch(uint8_t value[IGUANA_MAXSCRIPTSIZE],uint8_t *key,int32_t keylen); +int32_t komodo_kvsearch(int32_t *heightp,uint8_t value[IGUANA_MAXSCRIPTSIZE],uint8_t *key,int32_t keylen); Value kvsearch(const Array& params, bool fHelp) { - Object ret; uint8_t value[IGUANA_MAXSCRIPTSIZE],key[IGUANA_MAXSCRIPTSIZE]; int32_t j,valuesize,keylen; + Object ret; uint8_t value[IGUANA_MAXSCRIPTSIZE],key[IGUANA_MAXSCRIPTSIZE]; int32_t j,height,valuesize,keylen; if (fHelp || params.size() != 1 ) throw runtime_error("kvsearch key"); LOCK(cs_main); if ( (keylen= (int32_t)strlen(params[0].get_str().c_str())) > 0 ) { ret.push_back(Pair("coin",(char *)(ASSETCHAINS_SYMBOL[0] == 0 ? "KMD" : ASSETCHAINS_SYMBOL))); - ret.push_back(Pair("height", (int64_t)chainActive.Tip()->nHeight)); + ret.push_back(Pair("currentheight", (int64_t)chainActive.Tip()->nHeight)); ret.push_back(Pair("key",params[0].get_str())); + ret.push_back(Pair("keylen",keylen)); if ( keylen < sizeof(key) ) { memcpy(key,params[0].get_str().c_str(),keylen); - if ( (valuesize= komodo_kvsearch(value,key,keylen)) >= 0 ) + if ( (valuesize= komodo_kvsearch(&height,value,key,keylen)) >= 0 ) { std::string val; char *valuestr; val.resize(valuesize); valuestr = (char *)val.data(); memcpy(valuestr,value,valuesize); + ret.push_back(Pair("height",height)); ret.push_back(Pair("value",val)); + ret.push_back(Pair("valuesize",valuesize)); } else ret.push_back(Pair("error",(char *)"cant find key")); } else ret.push_back(Pair("error",(char *)"key too big")); } else ret.push_back(Pair("error",(char *)"null key")); diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index d203e63e2..6e1f2ed7b 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -560,7 +560,7 @@ Value paxwithdraw(const Array& params, bool fHelp) Value kvupdate(const Array& params, bool fHelp) { - CWalletTx wtx; Object ret; uint8_t keyvalue[IGUANA_MAXSCRIPTSIZE],opretbuf[IGUANA_MAXSCRIPTSIZE]; int32_t opretlen,i; + CWalletTx wtx; Object ret; uint8_t keyvalue[IGUANA_MAXSCRIPTSIZE],opretbuf[IGUANA_MAXSCRIPTSIZE]; int32_t opretlen,i,height; uint16_t keylen,valuesize=0; uint8_t *key,*value=0; struct komodo_kv *ptr; uint64_t fee; if (fHelp || params.size() != 2 ) throw runtime_error("kvupdate key value"); @@ -571,7 +571,8 @@ Value kvupdate(const Array& params, bool fHelp) { key = (uint8_t *)params[0].get_str().c_str(); ret.push_back(Pair("coin",(char *)(ASSETCHAINS_SYMBOL[0] == 0 ? "KMD" : ASSETCHAINS_SYMBOL))); - ret.push_back(Pair("height", (int64_t)chainActive.Tip()->nHeight)); + height = chainActive.Tip()->nHeight; + ret.push_back(Pair("height", (int64_t)height)); ret.push_back(Pair("key",params[0].get_str())); ret.push_back(Pair("keylen",keylen)); if ( params.size() == 2 && params[1].get_str().c_str() != 0 ) @@ -583,10 +584,11 @@ Value kvupdate(const Array& params, bool fHelp) } iguana_rwnum(1,&keyvalue[0],sizeof(keylen),&keylen); iguana_rwnum(1,&keyvalue[2],sizeof(valuesize),&valuesize); - memcpy(&keyvalue[4],key,keylen); + iguana_rwnum(1,&keyvalue[4],sizeof(height),&height); + memcpy(&keyvalue[8],key,keylen); if ( value != 0 ) - memcpy(&keyvalue[4 + keylen],value,valuesize); - opretlen = komodo_opreturnscript(opretbuf,'K',keyvalue,sizeof(uint16_t)*2+keylen+valuesize); + memcpy(&keyvalue[8 + keylen],value,valuesize); + opretlen = komodo_opreturnscript(opretbuf,'K',keyvalue,sizeof(height)+sizeof(uint16_t)*2+keylen+valuesize); for (i=0; i