From eeaaf55488177613802618e7797c298f0aa483a3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Jul 2017 12:15:20 +0200 Subject: [PATCH 01/58] Jumblr --- src/komodo.h | 1 + src/komodo_gateway.h | 3 + src/komodo_jumblr.h | 525 +++++++++++++++++++++++++++++++++++++++++++ src/rpcmisc.cpp | 38 +++- src/rpcserver.cpp | 2 + src/rpcserver.h | 3 + 6 files changed, 571 insertions(+), 1 deletion(-) create mode 100755 src/komodo_jumblr.h diff --git a/src/komodo.h b/src/komodo.h index 663edb1e2..e81522eb5 100644 --- a/src/komodo.h +++ b/src/komodo.h @@ -46,6 +46,7 @@ void komodo_connectblock(CBlockIndex *pindex,CBlock& block); int32_t komodo_parsestatefile(struct komodo_state *sp,FILE *fp,char *symbol,char *dest); #include "komodo_kv.h" +#include "komodo_jumblr.h" #include "komodo_gateway.h" #include "komodo_events.h" diff --git a/src/komodo_gateway.h b/src/komodo_gateway.h index ffd46c24d..088e8d415 100644 --- a/src/komodo_gateway.h +++ b/src/komodo_gateway.h @@ -1363,7 +1363,10 @@ void komodo_passport_iteration() } refsp = komodo_stateptr(symbol,dest); if ( ASSETCHAINS_SYMBOL[0] == 0 ) + { refid = 33; + jumblr_iteration(); + } else { refid = komodo_baseid(ASSETCHAINS_SYMBOL)+1; // illegal base -> baseid.-1 -> 0 diff --git a/src/komodo_jumblr.h b/src/komodo_jumblr.h new file mode 100755 index 000000000..cb9809972 --- /dev/null +++ b/src/komodo_jumblr.h @@ -0,0 +1,525 @@ +/****************************************************************************** + * Copyright © 2014-2017 The SuperNET Developers. * + * * + * See the AUTHORS, DEVELOPER-AGREEMENT and LICENSE files at * + * the top-level directory of this distribution for the individual copyright * + * holder information and the developer policies on copyright and licensing. * + * * + * Unless otherwise agreed in a custom licensing agreement, no part of the * + * SuperNET software, including this file may be copied, modified, propagated * + * or distributed except according to the terms contained in the LICENSE file * + * * + * Removal or modification of this copyright notice is prohibited. * + * * + ******************************************************************************/ + +/* + z_exportkey "zaddr" + z_exportwallet "filename" + z_getoperationstatus (["operationid", ... ]) + z_gettotalbalance ( minconf ) + z_importkey "zkey" ( rescan ) + z_importwallet "filename" + z_listaddresses + z_sendmany "fromaddress" [{"address":... ,"amount":..., "memo":""},...] ( minconf ) ( fee ) + */ + +#define JUMBLR_ADDR "RGhxXpXSSBTBm9EvNsXnTQczthMCxHX91t" +#define JUMBLR_BTCADDR "18RmTJe9qMech8siuhYfMtHo8RtcN1obC6" +#define JUMBLR_MAXSECRETADDRS 777 +#define JUMBLR_SYNCHRONIZED_BLOCKS 2 // 60 +#define JUMBLR_INCR (99.65 / 100) +#define JUMBLR_FEE 0.001 +#define JUMBLR_TXFEE 0.01 + +struct jumblr_item +{ + UT_hash_handle hh; + int64_t amount,fee,txfee; + uint32_t spent,pad; + char opid[64],src[128],dest[128],status; +} *Jumblrs; + +char Jumblr_secretaddrs[JUMBLR_MAXSECRETADDRS][64],Jumblr_deposit[64]; +int32_t Jumblr_numsecretaddrs; // if 0 -> run silent mode + +char *jumblr_importaddress(char *addr) +{ + char params[1024]; + sprintf(params,"[\"%s\", \"%s\", false]",address,address); + return(komodo_issuemethod(KMDUSERPASS,(char *)"importaddress",params,7771)); +} + +int32_t Jumblr_secretaddrfind(char *searchaddr) +{ + int32_t i; + for (i=0; i 0 ) + { + OS_randombytes((void *)&r,sizeof(r)); + r %= Jumblr_numsecretaddrs; + safecopy(secretaddr,Jumblr_secretaddrs[r],64); + } + return(r); +} + +int32_t jumblr_addresstype(char *addr) +{ + if ( addr[0] == 'z' && addr[1] == 'c' && strlen(addr) >= 40 ) + return('z'); + else if ( strlen(addr) < 40 ) + return('t'); + else return(-1); +} + +struct jumblr_item *jumblr_opidfind(char *opid) +{ + struct jumblr_item *ptr; + HASH_FIND(hh,Jumblrs,opid,(int32_t)strlen(opid),ptr); + return(ptr); +} + +struct jumblr_item *jumblr_opidadd(char *opid) +{ + struct jumblr_item *ptr; + if ( (ptr= jumblr_opidfind(opid)) == 0 ) + { + ptr = calloc(1,sizeof(*ptr)); + safecopy(ptr->opid,opid,sizeof(ptr->opid)); + HASH_ADD_KEYPTR(hh,Jumblrs,ptr->opid,(int32_t)strlen(ptr->opid),ptr); + if ( ptr != jumblr_opidfind(opid) ) + printf("jumblr_opidadd.(%s) ERROR, couldnt find after add\n",opid); + } + return(ptr); +} + +char *jumblr_validateaddress(char *addr) +{ + char params[1024]; + sprintf(params,"[\"%s\"]",addr); + return(komodo_issuemethod(KMDUSERPASS,(char *)"validateaddress",params,7771)); +} + +char *jumblr_zgetnewaddress() +{ + char params[1024]; + sprintf(params,"[]",); + return(komodo_issuemethod(KMDUSERPASS,(char *)"z_getnewaddress",params,7771)); +} + +char *jumblr_zlistoperationids() +{ + char params[1024]; + sprintf(params,"[]",); + return(komodo_issuemethod(KMDUSERPASS,(char *)"z_listoperationids",params,7771)); +} + +char *jumblr_zgetoperationresult(char *opid) +{ + char params[1024]; + sprintf(params,"[[\"%s\"]]",opid); + return(komodo_issuemethod(KMDUSERPASS,(char *)"z_getoperationresult",params,7771)); +} + +char *jumblr_zgetoperationstatus(char *opid) +{ + char params[1024]; + sprintf(params,"[[\"%s\"]]",opid); + return(komodo_issuemethod(KMDUSERPASS,(char *)"z_getoperationstatus",params,7771)); +} + +char *jumblr_sendt_to_z(char *taddr,char *zaddr,double amount) +{ + char params[1024]; double fee = (amount-3*JUMBLR_TXFEE) * JUMBLR_FEE; + if ( jumblr_addresstype(zaddr) != 'z' || jumblr_addresstype(taddr) != 't' ) + return(clonestr("{\"error\":\"illegal address in t to z\"}")); + sprintf(params,"[\"%s\", [{\"address\":\"%s\",\"amount\":%.8f}, {\"address\":\"%s\",\"amount\":%.8f}], 1, %.8f]",taddr,zaddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); + return(komodo_issuemethod(KMDUSERPASS,(char *)"z_sendmany",params,7771)); +} + +char *jumblr_sendz_to_z(char *zaddrS,char *zaddrD,double amount) +{ + char params[1024]; double fee = (amount-2*JUMBLR_TXFEE) * JUMBLR_FEE; + if ( jumblr_addresstype(zaddrS) != 'z' || jumblr_addresstype(zaddrD) != 'z' ) + return(clonestr("{\"error\":\"illegal address in z to z\"}")); + sprintf(params,"[\"%s\", [{\"address\":\"%s\",\"amount\":%.8f}, {\"address\":\"%s\",\"amount\":%.8f}], 1, %.8f]",zaddrS,zaddrD,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); + return(komodo_issuemethod(KMDUSERPASS,(char *)"z_sendmany",params,7771)); +} + +char *jumblr_sendz_to_t(char *zaddr,char *taddr,double amount) +{ + char params[1024]; double fee = (amount-JUMBLR_TXFEE) * JUMBLR_FEE; + if ( jumblr_addresstype(zaddr) != 'z' || jumblr_addresstype(taddr) != 't' ) + return(clonestr("{\"error\":\"illegal address in z to t\"}")); + sprintf(params,"[\"%s\", [{\"address\":\"%s\",\"amount\":%.8f}, {\"address\":\"%s\",\"amount\":%.8f}], 1, %.8f]",zaddr,taddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); + return(komodo_issuemethod(KMDUSERPASS,(char *)"z_sendmany",params,7771)); +} + +char *jumblr_zlistreceivedbyaddress(char *addr) +{ + char params[1024]; + sprintf(params,"[\"%s\", 1]",addr); + return(komodo_issuemethod(KMDUSERPASS,(char *)"z_listreceivedbyaddress",params,7771)); +} + +char *jumblr_getreceivedbyaddress(char *addr) +{ + char params[1024]; + sprintf(params,"[\"%s\", 1]",addr); + return(komodo_issuemethod(KMDUSERPASS,(char *)"getreceivedbyaddress",params,7771)); +} + +char *jumblr_importprivkey(char *wifstr) +{ + char params[1024]; + sprintf(params,"[\"%s\", \"\", false]",wifstr); + return(komodo_issuemethod(KMDUSERPASS,(char *)"importprivkey",params,7771)); +} + +char *jumblr_zgetbalance(char *addr) +{ + char params[1024]; + sprintf(params,"[\"%s\", 1]",addr); + return(komodo_issuemethod(KMDUSERPASS,(char *)"z_getbalance",params,7771)); +} + +char *jumblr_listunspent(char *coinaddr) +{ + char params[1024]; + sprintf(params,"[1, 99999999, [\"%s\"]]",coinaddr); + return(komodo_issuemethod(KMDUSERPASS,(char *)"listunspent",params,7771)); +} + +int64_t jumblr_receivedby(char *addr) +{ + char *retstr; int64_t total = 0; + if ( (retstr= jumblr_getreceivedbyaddress(addr)) != 0 ) + { + total = atof(retstr) * SATOSHIDEN; + free(retstr); + } + return(total); +} + +int64_t jumblr_balance(char *addr) +{ + char *retstr; double val; cJSON *retjson; int32_t i,n; int64_t balance = 0; + if ( jumblr_addresstype(addr) == 't' ) + { + if ( (retstr= jumblr_listunspent(addr)) != 0 ) + { + printf("jumblr.[%s].(%s)\n","KMD",retstr); + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + if ( (n= cJSON_GetArraySize(retjson)) > 0 ) + for (i=0; i SMALLVAL ) + balance = val * SATOSHIDEN; + free(retstr); + } + return(balance); +} + +int32_t jumblr_itemset(struct jumblr_item *ptr,cJSON *item,char *status) +{ + cJSON *params,*amounts,*dest; char *from,*addr; int32_t i,n; int64_t amount; + /*"params" : { + "fromaddress" : "RDhEGYScNQYetCyG75Kf8Fg61UWPdwc1C5", + "amounts" : [ + { + "address" : "zc9s3UdkDFTnnwHrMCr1vYy2WmkjhmTxXNiqC42s7BjeKBVUwk766TTSsrRPKfnX31Bbu8wbrTqnjDqskYGwx48FZMPHvft", + "amount" : 3.00000000 + } + ], + "minconf" : 1, + "fee" : 0.00010000 + }*/ + if ( (params= jobj(item,"params")) != 0 ) + { + //printf("params.(%s)\n",jprint(params,0)); + if ( (from= jstr(params,"fromaddress")) != 0 ) + { + safecopy(ptr->src,from,sizeof(ptr->src)); + } + if ( (amounts= jarray(&n,params,"amounts")) != 0 ) + { + for (i=0; i 0 ) + { + if ( strcmp(addr,JUMBLR_ADDR) == 0 ) + ptr->fee = amount; + else + { + ptr->amount = amount; + safecopy(ptr->dest,addr,sizeof(ptr->dest)); + } + } + } + } + ptr->txfee = jdouble(params,"fee") * SATOSHIDEN; + } + return(1); +} + +void jumblr_opidupdate(struct jumblr_item *ptr) +{ + char *retstr,*status; cJSON *retjson,*item; + if ( ptr->status == 0 ) + { + if ( (retstr= jumblr_zgetoperationstatus(ptr->opid)) != 0 ) + { + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + if ( cJSON_GetArraySize(retjson) == 1 ) + { + item = jitem(retjson,0); + //printf("%s\n",jprint(item,0)); + if ( (status= jstr(item,"status")) != 0 ) + { + if ( strcmp(status,"success") == 0 ) + { + ptr->status = jumblr_itemset(ptr,item,status); + if ( (jumblr_addresstype(ptr->src) == 't' && jumblr_addresstype(ptr->src) == 'z' && strcmp(ptr->src,Jumblr_deposit) != 0) || (jumblr_addresstype(ptr->src) == 'z' && jumblr_addresstype(ptr->src) == 't' && Jumblr_secretaddrfind(ptr->dest) < 0) ) + { + printf("a non-jumblr t->z pruned\n"); + free(jumblr_zgetoperationresult(ptr->opid)); + ptr->status = -1; + } + + } + else if ( strcmp(status,"failed") == 0 ) + { + printf("jumblr_opidupdate %s failed\n",ptr->opid); + free(jumblr_zgetoperationresult(ptr->opid)); + ptr->status = -1; + } + } + } + free_json(retjson); + } + free(retstr); + } + } +} + +void jumblr_prune(struct jumblr_item *ptr) +{ + struct jumblr_item *tmp; char oldsrc[128]; int32_t flag = 1; + printf("jumblr_prune %s\n",ptr->opid); + strcpy(oldsrc,ptr->src); + free(jumblr_zgetoperationresult(ptr->opid)); + while ( flag != 0 ) + { + flag = 0; + HASH_ITER(hh,Jumblrs,ptr,tmp) + { + if ( strcmp(oldsrc,ptr->dest) == 0 ) + { + printf("jumblr_prune %s (%s -> %s) matched oldsrc\n",ptr->opid,ptr->src,ptr->dest); + free(jumblr_zgetoperationresult(ptr->opid)); + strcpy(oldsrc,ptr->src); + flag = 1; + break; + } + } + } +} + +void jumblr_opidsupdate() +{ + char *retstr; cJSON *array; int32_t i,n; struct jumblr_item *ptr; + if ( (retstr= jumblr_zlistoperationids()) != 0 ) + { + if ( (array= cJSON_Parse(retstr)) != 0 ) + { + if ( (n= cJSON_GetArraySize(array)) > 0 ) + { + for (i=0; istatus == 0 ) + jumblr_opidupdate(ptr); + //printf("%d: %s -> %s %.8f\n",ptr->status,ptr->src,ptr->dest,dstr(ptr->amount)); + if ( jumblr_addresstype(ptr->src) == 'z' && jumblr_addresstype(ptr->dest) == 't' ) + jumblr_prune(ptr); + } + } + } + free_json(array); + } + free(retstr); + } +} + +void jumblr_iteration() +{ + static int32_t lastheight; + char *zaddr,*retstr; int32_t iter,height,counter,chosen_one,n; uint64_t amount=0,total=0; double fee; struct jumblr_item *ptr,*tmp; uint8_t r,s; + height = (int32_t)chainActive.Tip()->nHeight; + if ( lastheight == height ) + return; + if ( (height % JUMBLR_SYNCHRONIZED_BLOCKS) != 0 ) + return; + fee = JUMBLR_INCR * JUMBLR_FEE; + OS_randombytes(&r,sizeof(r)); + s = ((r >> 2) % 3); + switch ( s ) + { + case 0: // public -> z, need to importprivkey + if ( Jumblr_deposit[0] != 0 && (total= jumblr_balance(Jumblr_deposit)) >= (JUMBLR_INCR + 3*(fee+JUMBLR_TXFEE))*SATOSHIDEN ) + { + if ( (zaddr= jumblr_zgetnewaddress()) != 0 ) + { + amount = 0; + if ( (height % (JUMBLR_SYNCHRONIZED_BLOCKS*JUMBLR_SYNCHRONIZED_BLOCKS)) == 0 && total >= SATOSHIDEN * ((JUMBLR_INCR + 3*fee)*100 + 3*JUMBLR_TXFEE) ) + amount = SATOSHIDEN * ((JUMBLR_INCR + 3*fee)*100 + 3*JUMBLR_TXFEE); + else if ( (r & 3) == 0 && total >= SATOSHIDEN * ((JUMBLR_INCR + 3*fee)*10 + 3*JUMBLR_TXFEE) ) + amount = SATOSHIDEN * ((JUMBLR_INCR + 3*fee)*10 + 3*JUMBLR_TXFEE); + else amount = SATOSHIDEN * ((JUMBLR_INCR + 3*fee) + 3*JUMBLR_TXFEE); + if ( amount > 0 && (retstr= jumblr_sendt_to_z(Jumblr_deposit,zaddr,dstr(amount))) != 0 ) + { + printf("sendt_to_z.(%s)\n",retstr); + free(retstr); + } + free(zaddr); + } else printf("no zaddr from jumblr_zgetnewaddress\n"); + } + else if ( Jumblr_deposit[0] != 0 ) + printf("%s total %.8f vs %.8f\n",Jumblr_deposit,dstr(total),(JUMBLR_INCR + 3*(fee+JUMBLR_TXFEE))); + break; + case 1: // z -> z + jumblr_opidsupdate(); + chosen_one = -1; + for (iter=counter=0; iter<2; iter++) + { + counter = n = 0; + HASH_ITER(hh,Jumblrs,ptr,tmp) + { + if ( jumblr_addresstype(ptr->src) == 't' && jumblr_addresstype(ptr->dest) == 'z' ) + { + if ( ptr->spent == 0 && (total= jumblr_balance(ptr->dest)) >= (fee + JUMBLR_FEE)*SATOSHIDEN ) + { + if ( iter == 1 && counter == chosen_one ) + { + if ( (zaddr= jumblr_zgetnewaddress()) != 0 ) + { + if ( (retstr= jumblr_sendz_to_z(ptr->dest,zaddr,dstr(total))) != 0 ) + { + printf("n.%d counter.%d chosen_one.%d sendz_to_z.(%s)\n",n,counter,chosen_one,retstr); + free(retstr); + } + ptr->spent = (uint32_t)time(NULL); + free(zaddr); + break; + } + } + counter++; + } + } + n++; + } + if ( counter == 0 ) + break; + if ( iter == 0 ) + { + OS_randombytes((uint8_t *)&chosen_one,sizeof(chosen_one)); + if ( chosen_one < 0 ) + chosen_one = -chosen_one; + chosen_one %= counter; + printf("jumblr z->z chosen_one.%d of %d, from %d\n",chosen_one,counter,n); + } + } + break; + case 2: // z -> public + if ( Jumblr_numsecretaddrs > 0 ) + { + jumblr_opidsupdate(); + chosen_one = -1; + for (iter=0; iter<2; iter++) + { + counter = n = 0; + HASH_ITER(hh,Jumblrs,ptr,tmp) + { + if ( jumblr_addresstype(ptr->src) == 'z' && jumblr_addresstype(ptr->dest) == 'z' ) + { + if ( ptr->spent == 0 && (total= jumblr_balance(ptr->dest)) >= (fee + JUMBLR_FEE)*SATOSHIDEN ) + { + if ( iter == 1 && n == chosen_one ) + { + Jumblr_secretaddr(secretaddr); + if ( (retstr= jumblr_sendz_to_t(ptr->dest,secretaddr,dstr(total))) != 0 ) + { + printf("sendz_to_t.(%s)\n",retstr); + free(retstr); + } + ptr->spent = (uint32_t)time(NULL); + break; + } + counter++; + } + } + n++; + } + if ( counter == 0 ) + break; + if ( iter == 0 ) + { + OS_randombytes((uint8_t *)&chosen_one,sizeof(chosen_one)); + if ( chosen_one < 0 ) + chosen_one = -chosen_one; + chosen_one %= counter; + printf("jumblr z->t chosen_one.%d of %d, from %d\n",chosen_one,counter,n); + } + } + } + break; + } +} + diff --git a/src/rpcmisc.cpp b/src/rpcmisc.cpp index f6a78ce3d..b421375ba 100644 --- a/src/rpcmisc.cpp +++ b/src/rpcmisc.cpp @@ -41,6 +41,8 @@ using namespace std; * Or alternatively, create a specific query method for the information. **/ +char *Jumblr_depositaddradd(char *depositaddr); +int32_t Jumblr_secretaddradd(char *secretaddr); uint64_t komodo_interestsum(); int32_t komodo_longestchain(); int32_t komodo_notarized_height(uint256 *hashp,uint256 *txidp); @@ -48,7 +50,7 @@ int32_t komodo_whoami(char *pubkeystr,int32_t height); extern int32_t KOMODO_LASTMINED; extern char ASSETCHAINS_SYMBOL[]; int32_t notarizedtxid_height(char *dest,char *txidstr,int32_t *kmdnotarized_heightp); -#define KOMODO_VERSION "0.1.0" +#define KOMODO_VERSION "0.1.1" UniValue getinfo(const UniValue& params, bool fHelp) { @@ -188,6 +190,40 @@ public: }; #endif +UniValue jumblr_deposit(const UniValue& params, bool fHelp) +{ + char *retstr; UniValue result(UniValue::VOBJ); + if (fHelp || params.size() != 1) + throw runtime_error("jumblr_deposit \"depositaddress\"\n"); + CBitcoinAddress address(params[0].get_str()); + bool isValid = address.IsValid(); + if ( isValid != 0 ) + { + string addr = params[0].get_str(); + if ( (retstr= Jumblr_depositaddradd(addr.c_str())) == 0 ) + result.push_back(Pair("result", (char *)"null return from Jumblr_depositaddradd")); + else result.push_back(Pair("result", retstr)); + } else result.push_back(Pair("error", "invalid address")); + return(result); +} + +UniValue jumblr_secret(const UniValue& params, bool fHelp) +{ + int32_t retval; UniValue result(UniValue::VOBJ); + if (fHelp || params.size() != 1) + throw runtime_error("jumblr_secret \"secretaddress\"\n"); + CBitcoinAddress address(params[0].get_str()); + bool isValid = address.IsValid(); + if ( isValid != 0 ) + { + string addr = params[0].get_str(); + retval = Jumblr_secretaddradd(addr.c_str()); + result.push_back(Pair("result", "success")); + result.push_back(Pair("num", retval)); + } else result.push_back(Pair("error", "invalid address")); + return(result); +} + UniValue validateaddress(const UniValue& params, bool fHelp) { if (fHelp || params.size() != 1) diff --git a/src/rpcserver.cpp b/src/rpcserver.cpp index 4749cfdc4..03597f708 100644 --- a/src/rpcserver.cpp +++ b/src/rpcserver.cpp @@ -336,6 +336,8 @@ static const CRPCCommand vRPCCommands[] = { "util", "estimatefee", &estimatefee, true }, { "util", "estimatepriority", &estimatepriority, true }, { "util", "z_validateaddress", &z_validateaddress, true }, /* uses wallet if enabled */ + { "util", "jumblr_deposit", &jumblr_depositaddr, true }, + { "util", "jumblr_secret", &jumblr_secretaddr, true }, /* Not shown in help */ { "hidden", "invalidateblock", &invalidateblock, true }, diff --git a/src/rpcserver.h b/src/rpcserver.h index f1eacb7bb..ecf7b0573 100644 --- a/src/rpcserver.h +++ b/src/rpcserver.h @@ -246,6 +246,9 @@ extern UniValue zc_raw_joinsplit(const UniValue& params, bool fHelp); extern UniValue zc_raw_receive(const UniValue& params, bool fHelp); extern UniValue zc_sample_joinsplit(const UniValue& params, bool fHelp); +extern UniValue jumblr_deposit(const UniValue& params, bool fHelp); +extern UniValue jumblr_secret(const UniValue& params, bool fHelp); + extern UniValue getrawtransaction(const UniValue& params, bool fHelp); // in rcprawtransaction.cpp extern UniValue listunspent(const UniValue& params, bool fHelp); extern UniValue lockunspent(const UniValue& params, bool fHelp); From 19acd959f988be7e926adc885863111cf320fed6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Jul 2017 12:19:58 +0200 Subject: [PATCH 02/58] Test --- src/komodo_jumblr.h | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/src/komodo_jumblr.h b/src/komodo_jumblr.h index cb9809972..d299ceb65 100755 --- a/src/komodo_jumblr.h +++ b/src/komodo_jumblr.h @@ -43,7 +43,7 @@ struct jumblr_item char Jumblr_secretaddrs[JUMBLR_MAXSECRETADDRS][64],Jumblr_deposit[64]; int32_t Jumblr_numsecretaddrs; // if 0 -> run silent mode -char *jumblr_importaddress(char *addr) +char *jumblr_importaddress(char *address) { char params[1024]; sprintf(params,"[\"%s\", \"%s\", false]",address,address); @@ -78,12 +78,12 @@ int32_t Jumblr_secretaddradd(char *secretaddr) // external char *Jumblr_depositaddradd(char *depositaddr) // external { if ( depositaddr == 0 ) - depositaddr = ""; + depositaddr = (char *)""; if ( (ind= Jumblr_secretaddrfind(secretaddr)) < 0 ) { safecopy(Jumblr_deposit,depositaddr,sizeof(Jumblr_deposit)); return(jumblr_importaddress(depositaddr)); - } else return(clonestr("{\"error\":\"cant make a secret address a depositaddress\"}")); + } else return(clonestr((char *)"{\"error\":\"cant make a secret address a depositaddress\"}")); } int32_t Jumblr_secretaddr(char *secretaddr) @@ -91,7 +91,7 @@ int32_t Jumblr_secretaddr(char *secretaddr) uint32_t r; if ( Jumblr_numsecretaddrs > 0 ) { - OS_randombytes((void *)&r,sizeof(r)); + OS_randombytes((uint8_t *)&r,sizeof(r)); r %= Jumblr_numsecretaddrs; safecopy(secretaddr,Jumblr_secretaddrs[r],64); } @@ -119,7 +119,7 @@ struct jumblr_item *jumblr_opidadd(char *opid) struct jumblr_item *ptr; if ( (ptr= jumblr_opidfind(opid)) == 0 ) { - ptr = calloc(1,sizeof(*ptr)); + ptr = (struct jumblr_item *)calloc(1,sizeof(*ptr)); safecopy(ptr->opid,opid,sizeof(ptr->opid)); HASH_ADD_KEYPTR(hh,Jumblrs,ptr->opid,(int32_t)strlen(ptr->opid),ptr); if ( ptr != jumblr_opidfind(opid) ) @@ -138,14 +138,14 @@ char *jumblr_validateaddress(char *addr) char *jumblr_zgetnewaddress() { char params[1024]; - sprintf(params,"[]",); + sprintf(params,"[]"); return(komodo_issuemethod(KMDUSERPASS,(char *)"z_getnewaddress",params,7771)); } char *jumblr_zlistoperationids() { char params[1024]; - sprintf(params,"[]",); + sprintf(params,"[]"); return(komodo_issuemethod(KMDUSERPASS,(char *)"z_listoperationids",params,7771)); } @@ -167,7 +167,7 @@ char *jumblr_sendt_to_z(char *taddr,char *zaddr,double amount) { char params[1024]; double fee = (amount-3*JUMBLR_TXFEE) * JUMBLR_FEE; if ( jumblr_addresstype(zaddr) != 'z' || jumblr_addresstype(taddr) != 't' ) - return(clonestr("{\"error\":\"illegal address in t to z\"}")); + return(clonestr((char *)"{\"error\":\"illegal address in t to z\"}")); sprintf(params,"[\"%s\", [{\"address\":\"%s\",\"amount\":%.8f}, {\"address\":\"%s\",\"amount\":%.8f}], 1, %.8f]",taddr,zaddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); return(komodo_issuemethod(KMDUSERPASS,(char *)"z_sendmany",params,7771)); } @@ -176,7 +176,7 @@ char *jumblr_sendz_to_z(char *zaddrS,char *zaddrD,double amount) { char params[1024]; double fee = (amount-2*JUMBLR_TXFEE) * JUMBLR_FEE; if ( jumblr_addresstype(zaddrS) != 'z' || jumblr_addresstype(zaddrD) != 'z' ) - return(clonestr("{\"error\":\"illegal address in z to z\"}")); + return(clonestr((char *)"{\"error\":\"illegal address in z to z\"}")); sprintf(params,"[\"%s\", [{\"address\":\"%s\",\"amount\":%.8f}, {\"address\":\"%s\",\"amount\":%.8f}], 1, %.8f]",zaddrS,zaddrD,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); return(komodo_issuemethod(KMDUSERPASS,(char *)"z_sendmany",params,7771)); } @@ -185,7 +185,7 @@ char *jumblr_sendz_to_t(char *zaddr,char *taddr,double amount) { char params[1024]; double fee = (amount-JUMBLR_TXFEE) * JUMBLR_FEE; if ( jumblr_addresstype(zaddr) != 'z' || jumblr_addresstype(taddr) != 't' ) - return(clonestr("{\"error\":\"illegal address in z to t\"}")); + return(clonestr((char *)"{\"error\":\"illegal address in z to t\"}")); sprintf(params,"[\"%s\", [{\"address\":\"%s\",\"amount\":%.8f}, {\"address\":\"%s\",\"amount\":%.8f}], 1, %.8f]",zaddr,taddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); return(komodo_issuemethod(KMDUSERPASS,(char *)"z_sendmany",params,7771)); } @@ -248,7 +248,7 @@ int64_t jumblr_balance(char *addr) { if ( (n= cJSON_GetArraySize(retjson)) > 0 ) for (i=0; isrc,from,sizeof(ptr->src)); } - if ( (amounts= jarray(&n,params,"amounts")) != 0 ) + if ( (amounts= jarray(&n,params,(char *)"amounts")) != 0 ) { for (i=0; i 0 ) + if ( (addr= jstr(dest,(char *)"address")) != 0 && (amount= jdouble(dest,(char *)"amount")*SATOSHIDEN) > 0 ) { if ( strcmp(addr,JUMBLR_ADDR) == 0 ) ptr->fee = amount; @@ -302,7 +302,7 @@ int32_t jumblr_itemset(struct jumblr_item *ptr,cJSON *item,char *status) } } } - ptr->txfee = jdouble(params,"fee") * SATOSHIDEN; + ptr->txfee = jdouble(params,(char *)"fee") * SATOSHIDEN; } return(1); } @@ -320,9 +320,9 @@ void jumblr_opidupdate(struct jumblr_item *ptr) { item = jitem(retjson,0); //printf("%s\n",jprint(item,0)); - if ( (status= jstr(item,"status")) != 0 ) + if ( (status= jstr(item,(char *)"status")) != 0 ) { - if ( strcmp(status,"success") == 0 ) + if ( strcmp(status,(char *)"success") == 0 ) { ptr->status = jumblr_itemset(ptr,item,status); if ( (jumblr_addresstype(ptr->src) == 't' && jumblr_addresstype(ptr->src) == 'z' && strcmp(ptr->src,Jumblr_deposit) != 0) || (jumblr_addresstype(ptr->src) == 'z' && jumblr_addresstype(ptr->src) == 't' && Jumblr_secretaddrfind(ptr->dest) < 0) ) @@ -333,7 +333,7 @@ void jumblr_opidupdate(struct jumblr_item *ptr) } } - else if ( strcmp(status,"failed") == 0 ) + else if ( strcmp(status,(char *)"failed") == 0 ) { printf("jumblr_opidupdate %s failed\n",ptr->opid); free(jumblr_zgetoperationresult(ptr->opid)); From 9bbeff91885d4beddde35850bd4b3ca1e306ac94 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Jul 2017 12:22:13 +0200 Subject: [PATCH 03/58] Test --- src/komodo_jumblr.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/komodo_jumblr.h b/src/komodo_jumblr.h index d299ceb65..c1bd24d00 100755 --- a/src/komodo_jumblr.h +++ b/src/komodo_jumblr.h @@ -31,6 +31,7 @@ #define JUMBLR_INCR (99.65 / 100) #define JUMBLR_FEE 0.001 #define JUMBLR_TXFEE 0.01 +#define SMALLVAL 0.000000000000001 struct jumblr_item { @@ -77,9 +78,10 @@ int32_t Jumblr_secretaddradd(char *secretaddr) // external char *Jumblr_depositaddradd(char *depositaddr) // external { + int32_t ind; if ( depositaddr == 0 ) depositaddr = (char *)""; - if ( (ind= Jumblr_secretaddrfind(secretaddr)) < 0 ) + if ( (ind= Jumblr_secretaddrfind(depositaddr)) < 0 ) { safecopy(Jumblr_deposit,depositaddr,sizeof(Jumblr_deposit)); return(jumblr_importaddress(depositaddr)); @@ -401,7 +403,7 @@ void jumblr_opidsupdate() void jumblr_iteration() { static int32_t lastheight; - char *zaddr,*retstr; int32_t iter,height,counter,chosen_one,n; uint64_t amount=0,total=0; double fee; struct jumblr_item *ptr,*tmp; uint8_t r,s; + char *zaddr,*retstr,secretaddr[64]; int32_t iter,height,counter,chosen_one,n; uint64_t amount=0,total=0; double fee; struct jumblr_item *ptr,*tmp; uint8_t r,s; height = (int32_t)chainActive.Tip()->nHeight; if ( lastheight == height ) return; From bc035879e91a866fd3a276911e7bec8974637d98 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Jul 2017 12:25:00 +0200 Subject: [PATCH 04/58] Test --- src/rpcmisc.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/rpcmisc.cpp b/src/rpcmisc.cpp index b421375ba..98f3d1bf2 100644 --- a/src/rpcmisc.cpp +++ b/src/rpcmisc.cpp @@ -200,7 +200,7 @@ UniValue jumblr_deposit(const UniValue& params, bool fHelp) if ( isValid != 0 ) { string addr = params[0].get_str(); - if ( (retstr= Jumblr_depositaddradd(addr.c_str())) == 0 ) + if ( (retstr= Jumblr_depositaddradd((char *)addr.c_str())) == 0 ) result.push_back(Pair("result", (char *)"null return from Jumblr_depositaddradd")); else result.push_back(Pair("result", retstr)); } else result.push_back(Pair("error", "invalid address")); @@ -217,7 +217,7 @@ UniValue jumblr_secret(const UniValue& params, bool fHelp) if ( isValid != 0 ) { string addr = params[0].get_str(); - retval = Jumblr_secretaddradd(addr.c_str()); + retval = Jumblr_secretaddradd((char *)addr.c_str()); result.push_back(Pair("result", "success")); result.push_back(Pair("num", retval)); } else result.push_back(Pair("error", "invalid address")); From 5539178c7f588b726e7185849976b909895c6fd9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Jul 2017 12:26:38 +0200 Subject: [PATCH 05/58] Test --- src/rpcserver.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/rpcserver.cpp b/src/rpcserver.cpp index 03597f708..518ba4693 100644 --- a/src/rpcserver.cpp +++ b/src/rpcserver.cpp @@ -336,8 +336,8 @@ static const CRPCCommand vRPCCommands[] = { "util", "estimatefee", &estimatefee, true }, { "util", "estimatepriority", &estimatepriority, true }, { "util", "z_validateaddress", &z_validateaddress, true }, /* uses wallet if enabled */ - { "util", "jumblr_deposit", &jumblr_depositaddr, true }, - { "util", "jumblr_secret", &jumblr_secretaddr, true }, + { "util", "jumblr_deposit", &jumblr_deposit, true }, + { "util", "jumblr_secret", &jumblr_secret, true }, /* Not shown in help */ { "hidden", "invalidateblock", &invalidateblock, true }, From 8ac542730009832e9a90ffc66ae1c8081de78f3b Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Jul 2017 12:38:22 +0200 Subject: [PATCH 06/58] Test --- src/komodo_jumblr.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/komodo_jumblr.h b/src/komodo_jumblr.h index c1bd24d00..c8870b64f 100755 --- a/src/komodo_jumblr.h +++ b/src/komodo_jumblr.h @@ -118,8 +118,8 @@ struct jumblr_item *jumblr_opidfind(char *opid) struct jumblr_item *jumblr_opidadd(char *opid) { - struct jumblr_item *ptr; - if ( (ptr= jumblr_opidfind(opid)) == 0 ) + struct jumblr_item *ptr = 0; + if ( opid != 0 && (ptr= jumblr_opidfind(opid)) == 0 ) { ptr = (struct jumblr_item *)calloc(1,sizeof(*ptr)); safecopy(ptr->opid,opid,sizeof(ptr->opid)); @@ -382,6 +382,7 @@ void jumblr_opidsupdate() { if ( (n= cJSON_GetArraySize(array)) > 0 ) { + printf("%s -> n%d\n",retstr,n); for (i=0; i Date: Wed, 12 Jul 2017 12:50:07 +0200 Subject: [PATCH 07/58] Test --- src/komodo_jumblr.h | 75 ++++++++++++++++++++++++++++++++------------- src/rpcmisc.cpp | 10 +++--- 2 files changed, 59 insertions(+), 26 deletions(-) diff --git a/src/komodo_jumblr.h b/src/komodo_jumblr.h index c8870b64f..15088cbf9 100755 --- a/src/komodo_jumblr.h +++ b/src/komodo_jumblr.h @@ -44,11 +44,36 @@ struct jumblr_item char Jumblr_secretaddrs[JUMBLR_MAXSECRETADDRS][64],Jumblr_deposit[64]; int32_t Jumblr_numsecretaddrs; // if 0 -> run silent mode +char *jumblr_issuemethod(char *usepass,char *method,char *params,uint16_t port) +{ + cJSON *retjson,*resjson = 0; char *retstr; + if ( (retstr= komodo_issuemethod(userpass,method,params,port)) != 0 ) + { + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + if ( jobj(retjson,"result") != 0 ) + resjson = jduplicate(jobj(retjson,"result")); + else if ( jobj(retjson,"error") != 0 ) + resjson = jduplicate(jobj(retjson,"error")); + else + { + resjson = cJSON_CreateObject(); + jaddstr(resjson,"error","cant parse return"); + } + free_json(retjson); + } + free(retstr); + } + if ( resjson != 0 ) + return(jprint(resjson,1)); + else return(clonestr("{\"error\":\"unknown error\"}")); +} + char *jumblr_importaddress(char *address) { char params[1024]; sprintf(params,"[\"%s\", \"%s\", false]",address,address); - return(komodo_issuemethod(KMDUSERPASS,(char *)"importaddress",params,7771)); + return(jumblr_issuemethod(KMDUSERPASS,(char *)"importaddress",params,7771)); } int32_t Jumblr_secretaddrfind(char *searchaddr) @@ -76,16 +101,24 @@ int32_t Jumblr_secretaddradd(char *secretaddr) // external return(Jumblr_numsecretaddrs); } -char *Jumblr_depositaddradd(char *depositaddr) // external +int32_t Jumblr_depositaddradd(char *depositaddr) // external { - int32_t ind; + int32_t ind,retal = -1; char *retstr; cJSON *retjson; if ( depositaddr == 0 ) depositaddr = (char *)""; if ( (ind= Jumblr_secretaddrfind(depositaddr)) < 0 ) { safecopy(Jumblr_deposit,depositaddr,sizeof(Jumblr_deposit)); - return(jumblr_importaddress(depositaddr)); - } else return(clonestr((char *)"{\"error\":\"cant make a secret address a depositaddress\"}")); + if ( (retstr= jumblr_importaddress(depositaddr)) != 0 ) + { + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + free_json(retjson); + } + free(retstr); + } + } + return(retval); } int32_t Jumblr_secretaddr(char *secretaddr) @@ -134,35 +167,35 @@ char *jumblr_validateaddress(char *addr) { char params[1024]; sprintf(params,"[\"%s\"]",addr); - return(komodo_issuemethod(KMDUSERPASS,(char *)"validateaddress",params,7771)); + return(jumblr_issuemethod(KMDUSERPASS,(char *)"validateaddress",params,7771)); } char *jumblr_zgetnewaddress() { char params[1024]; sprintf(params,"[]"); - return(komodo_issuemethod(KMDUSERPASS,(char *)"z_getnewaddress",params,7771)); + return(jumblr_issuemethod(KMDUSERPASS,(char *)"z_getnewaddress",params,7771)); } char *jumblr_zlistoperationids() { char params[1024]; sprintf(params,"[]"); - return(komodo_issuemethod(KMDUSERPASS,(char *)"z_listoperationids",params,7771)); + return(jumblr_issuemethod(KMDUSERPASS,(char *)"z_listoperationids",params,7771)); } char *jumblr_zgetoperationresult(char *opid) { char params[1024]; sprintf(params,"[[\"%s\"]]",opid); - return(komodo_issuemethod(KMDUSERPASS,(char *)"z_getoperationresult",params,7771)); + return(jumblr_issuemethod(KMDUSERPASS,(char *)"z_getoperationresult",params,7771)); } char *jumblr_zgetoperationstatus(char *opid) { char params[1024]; sprintf(params,"[[\"%s\"]]",opid); - return(komodo_issuemethod(KMDUSERPASS,(char *)"z_getoperationstatus",params,7771)); + return(jumblr_issuemethod(KMDUSERPASS,(char *)"z_getoperationstatus",params,7771)); } char *jumblr_sendt_to_z(char *taddr,char *zaddr,double amount) @@ -171,7 +204,7 @@ char *jumblr_sendt_to_z(char *taddr,char *zaddr,double amount) if ( jumblr_addresstype(zaddr) != 'z' || jumblr_addresstype(taddr) != 't' ) return(clonestr((char *)"{\"error\":\"illegal address in t to z\"}")); sprintf(params,"[\"%s\", [{\"address\":\"%s\",\"amount\":%.8f}, {\"address\":\"%s\",\"amount\":%.8f}], 1, %.8f]",taddr,zaddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); - return(komodo_issuemethod(KMDUSERPASS,(char *)"z_sendmany",params,7771)); + return(jumblr_issuemethod(KMDUSERPASS,(char *)"z_sendmany",params,7771)); } char *jumblr_sendz_to_z(char *zaddrS,char *zaddrD,double amount) @@ -180,7 +213,7 @@ char *jumblr_sendz_to_z(char *zaddrS,char *zaddrD,double amount) if ( jumblr_addresstype(zaddrS) != 'z' || jumblr_addresstype(zaddrD) != 'z' ) return(clonestr((char *)"{\"error\":\"illegal address in z to z\"}")); sprintf(params,"[\"%s\", [{\"address\":\"%s\",\"amount\":%.8f}, {\"address\":\"%s\",\"amount\":%.8f}], 1, %.8f]",zaddrS,zaddrD,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); - return(komodo_issuemethod(KMDUSERPASS,(char *)"z_sendmany",params,7771)); + return(jumblr_issuemethod(KMDUSERPASS,(char *)"z_sendmany",params,7771)); } char *jumblr_sendz_to_t(char *zaddr,char *taddr,double amount) @@ -189,42 +222,42 @@ char *jumblr_sendz_to_t(char *zaddr,char *taddr,double amount) if ( jumblr_addresstype(zaddr) != 'z' || jumblr_addresstype(taddr) != 't' ) return(clonestr((char *)"{\"error\":\"illegal address in z to t\"}")); sprintf(params,"[\"%s\", [{\"address\":\"%s\",\"amount\":%.8f}, {\"address\":\"%s\",\"amount\":%.8f}], 1, %.8f]",zaddr,taddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); - return(komodo_issuemethod(KMDUSERPASS,(char *)"z_sendmany",params,7771)); + return(jumblr_issuemethod(KMDUSERPASS,(char *)"z_sendmany",params,7771)); } char *jumblr_zlistreceivedbyaddress(char *addr) { char params[1024]; sprintf(params,"[\"%s\", 1]",addr); - return(komodo_issuemethod(KMDUSERPASS,(char *)"z_listreceivedbyaddress",params,7771)); + return(jumblr_issuemethod(KMDUSERPASS,(char *)"z_listreceivedbyaddress",params,7771)); } char *jumblr_getreceivedbyaddress(char *addr) { char params[1024]; sprintf(params,"[\"%s\", 1]",addr); - return(komodo_issuemethod(KMDUSERPASS,(char *)"getreceivedbyaddress",params,7771)); + return(jumblr_issuemethod(KMDUSERPASS,(char *)"getreceivedbyaddress",params,7771)); } char *jumblr_importprivkey(char *wifstr) { char params[1024]; sprintf(params,"[\"%s\", \"\", false]",wifstr); - return(komodo_issuemethod(KMDUSERPASS,(char *)"importprivkey",params,7771)); + return(jumblr_issuemethod(KMDUSERPASS,(char *)"importprivkey",params,7771)); } char *jumblr_zgetbalance(char *addr) { char params[1024]; sprintf(params,"[\"%s\", 1]",addr); - return(komodo_issuemethod(KMDUSERPASS,(char *)"z_getbalance",params,7771)); + return(jumblr_issuemethod(KMDUSERPASS,(char *)"z_getbalance",params,7771)); } char *jumblr_listunspent(char *coinaddr) { char params[1024]; sprintf(params,"[1, 99999999, [\"%s\"]]",coinaddr); - return(komodo_issuemethod(KMDUSERPASS,(char *)"listunspent",params,7771)); + return(jumblr_issuemethod(KMDUSERPASS,(char *)"listunspent",params,7771)); } int64_t jumblr_receivedby(char *addr) @@ -248,7 +281,7 @@ int64_t jumblr_balance(char *addr) printf("jumblr.[%s].(%s)\n","KMD",retstr); if ( (retjson= cJSON_Parse(retstr)) != 0 ) { - if ( (n= cJSON_GetArraySize(retjson)) > 0 ) + if ( (n= cJSON_GetArraySize(retjson)) > 0 && is_cJSON_Array(retjson) != 0 ) for (i=0; i 0 ) + if ( (n= cJSON_GetArraySize(array)) > 0 && is_cJSON_Array(array) != 0 ) { printf("%s -> n%d\n",retstr,n); for (i=0; i= 0 ) + result.push_back(Pair("result", retval); + else result.push_back(Pair("error", retval)); } else result.push_back(Pair("error", "invalid address")); return(result); } From eb416c9c261681d4fc40f8946d8450411d632365 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Jul 2017 12:53:40 +0200 Subject: [PATCH 08/58] Test --- src/komodo_jumblr.h | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/komodo_jumblr.h b/src/komodo_jumblr.h index 15088cbf9..4f8814479 100755 --- a/src/komodo_jumblr.h +++ b/src/komodo_jumblr.h @@ -51,14 +51,14 @@ char *jumblr_issuemethod(char *usepass,char *method,char *params,uint16_t port) { if ( (retjson= cJSON_Parse(retstr)) != 0 ) { - if ( jobj(retjson,"result") != 0 ) - resjson = jduplicate(jobj(retjson,"result")); - else if ( jobj(retjson,"error") != 0 ) - resjson = jduplicate(jobj(retjson,"error")); + if ( jobj(retjson,(char *)"result") != 0 ) + resjson = jduplicate(jobj(retjson,(char *)"result")); + else if ( jobj(retjson,(char *)"error") != 0 ) + resjson = jduplicate(jobj(retjson,(char *)"error")); else { resjson = cJSON_CreateObject(); - jaddstr(resjson,"error","cant parse return"); + jaddstr(resjson,(char *)"error",(char *)"cant parse return"); } free_json(retjson); } @@ -66,7 +66,7 @@ char *jumblr_issuemethod(char *usepass,char *method,char *params,uint16_t port) } if ( resjson != 0 ) return(jprint(resjson,1)); - else return(clonestr("{\"error\":\"unknown error\"}")); + else return(clonestr((char *)"{\"error\":\"unknown error\"}")); } char *jumblr_importaddress(char *address) @@ -351,7 +351,7 @@ void jumblr_opidupdate(struct jumblr_item *ptr) { if ( (retjson= cJSON_Parse(retstr)) != 0 ) { - if ( cJSON_GetArraySize(retjson) == 1 && is_cJSON_array(retjson) != 0 ) + if ( cJSON_GetArraySize(retjson) == 1 && is_cJSON_Array(retjson) != 0 ) { item = jitem(retjson,0); //printf("%s\n",jprint(item,0)); From a8ec5e86616859792199ecddd67f085d52a35acc Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Jul 2017 12:55:29 +0200 Subject: [PATCH 09/58] Test --- src/komodo_jumblr.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/komodo_jumblr.h b/src/komodo_jumblr.h index 4f8814479..284c1c5e6 100755 --- a/src/komodo_jumblr.h +++ b/src/komodo_jumblr.h @@ -44,7 +44,7 @@ struct jumblr_item char Jumblr_secretaddrs[JUMBLR_MAXSECRETADDRS][64],Jumblr_deposit[64]; int32_t Jumblr_numsecretaddrs; // if 0 -> run silent mode -char *jumblr_issuemethod(char *usepass,char *method,char *params,uint16_t port) +char *jumblr_issuemethod(char *userpass,char *method,char *params,uint16_t port) { cJSON *retjson,*resjson = 0; char *retstr; if ( (retstr= komodo_issuemethod(userpass,method,params,port)) != 0 ) @@ -103,7 +103,7 @@ int32_t Jumblr_secretaddradd(char *secretaddr) // external int32_t Jumblr_depositaddradd(char *depositaddr) // external { - int32_t ind,retal = -1; char *retstr; cJSON *retjson; + int32_t ind,retval = -1; char *retstr; cJSON *retjson; if ( depositaddr == 0 ) depositaddr = (char *)""; if ( (ind= Jumblr_secretaddrfind(depositaddr)) < 0 ) @@ -113,6 +113,8 @@ int32_t Jumblr_depositaddradd(char *depositaddr) // external { if ( (retjson= cJSON_Parse(retstr)) != 0 ) { + if ( jobj(retjson,(char *)"error") == 0 || is_cJSON_Null(jobj(retjson,(char *)"error")) != 0 ) + retval = 0; free_json(retjson); } free(retstr); From 190dbe6d436aee0fb1761561561229c696a78aab Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Jul 2017 12:56:43 +0200 Subject: [PATCH 10/58] Test --- src/rpcmisc.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/rpcmisc.cpp b/src/rpcmisc.cpp index dae1127d5..42307470f 100644 --- a/src/rpcmisc.cpp +++ b/src/rpcmisc.cpp @@ -201,7 +201,7 @@ UniValue jumblr_deposit(const UniValue& params, bool fHelp) { string addr = params[0].get_str(); if ( (retval= Jumblr_depositaddradd((char *)addr.c_str())) >= 0 ) - result.push_back(Pair("result", retval); + result.push_back(Pair("result", retval)); else result.push_back(Pair("error", retval)); } else result.push_back(Pair("error", "invalid address")); return(result); From 3f318aa449c1654e6e0170d6acdb8e6f52a93ac9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Jul 2017 13:07:36 +0200 Subject: [PATCH 11/58] Test --- src/komodo_jumblr.h | 29 +++++++++++++++++++++++------ 1 file changed, 23 insertions(+), 6 deletions(-) diff --git a/src/komodo_jumblr.h b/src/komodo_jumblr.h index 284c1c5e6..619f4e782 100755 --- a/src/komodo_jumblr.h +++ b/src/komodo_jumblr.h @@ -33,6 +33,11 @@ #define JUMBLR_TXFEE 0.01 #define SMALLVAL 0.000000000000001 +#define JUMBLR_ERROR_DUPLICATEDEPOSIT -1 +#define JUMBLR_ERROR_SECRETCANTBEDEPOSIT -2 +#define JUMBLR_ERROR_TOOMANYSECRETS -3 +#define JUMBLR_ERROR_IMPORTADDRESS -4 + struct jumblr_item { UT_hash_handle hh; @@ -90,20 +95,31 @@ int32_t Jumblr_secretaddrfind(char *searchaddr) int32_t Jumblr_secretaddradd(char *secretaddr) // external { int32_t ind; - if ( secretaddr != 0 && secretaddr[0] != 0 && Jumblr_numsecretaddrs < JUMBLR_MAXSECRETADDRS ) + if ( secretaddr != 0 && secretaddr[0] != 0 ) { - if ( (ind= Jumblr_secretaddrfind(secretaddr)) < 0 ) + if ( Jumblr_numsecretaddrs < JUMBLR_MAXSECRETADDRS ) { - safecopy(Jumblr_secretaddrs[Jumblr_numsecretaddrs],secretaddr,64); - Jumblr_numsecretaddrs++; - } else return(ind); + if ( strcmp(Jumblr_deposit,secretaddr) != 0 ) + { + if ( (ind= Jumblr_secretaddrfind(secretaddr)) < 0 ) + { + safecopy(Jumblr_secretaddrs[Jumblr_numsecretaddrs],secretaddr,64); + Jumblr_numsecretaddrs++; + } else return(ind); + } else return(JUMBLR_ERROR_SECRETCANTBEDEPOSIT); + } else return(JUMBLR_ERROR_TOOMANYSECRETS); + } + else + { + memset(Jumblr_secretaddrs,0,sizeof(Jumblr_secretaddrs)); + Jumblr_numsecretaddrs = 0; } return(Jumblr_numsecretaddrs); } int32_t Jumblr_depositaddradd(char *depositaddr) // external { - int32_t ind,retval = -1; char *retstr; cJSON *retjson; + int32_t ind,retval = JUMBLR_ERROR_DUPLICATEDEPOSIT; char *retstr; cJSON *retjson; if ( depositaddr == 0 ) depositaddr = (char *)""; if ( (ind= Jumblr_secretaddrfind(depositaddr)) < 0 ) @@ -115,6 +131,7 @@ int32_t Jumblr_depositaddradd(char *depositaddr) // external { if ( jobj(retjson,(char *)"error") == 0 || is_cJSON_Null(jobj(retjson,(char *)"error")) != 0 ) retval = 0; + else retval = JUMBLR_ERROR_IMPORTADDRESS; free_json(retjson); } free(retstr); From 44165ded33c5dcd67e1d7693bf365aa9068cd9ff Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Jul 2017 13:19:59 +0200 Subject: [PATCH 12/58] Test --- src/komodo_jumblr.h | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/komodo_jumblr.h b/src/komodo_jumblr.h index 619f4e782..4c0d1b9e4 100755 --- a/src/komodo_jumblr.h +++ b/src/komodo_jumblr.h @@ -36,7 +36,7 @@ #define JUMBLR_ERROR_DUPLICATEDEPOSIT -1 #define JUMBLR_ERROR_SECRETCANTBEDEPOSIT -2 #define JUMBLR_ERROR_TOOMANYSECRETS -3 -#define JUMBLR_ERROR_IMPORTADDRESS -4 +#define JUMBLR_ERROR_NOTINWALLET -4 struct jumblr_item { @@ -81,6 +81,13 @@ char *jumblr_importaddress(char *address) return(jumblr_issuemethod(KMDUSERPASS,(char *)"importaddress",params,7771)); } +char *jumblr_validateaddress(char *addr) +{ + char params[1024]; + sprintf(params,"[\"%s\"]",addr); + return(jumblr_issuemethod(KMDUSERPASS,(char *)"validateaddress",params,7771)); +} + int32_t Jumblr_secretaddrfind(char *searchaddr) { int32_t i; @@ -119,19 +126,19 @@ int32_t Jumblr_secretaddradd(char *secretaddr) // external int32_t Jumblr_depositaddradd(char *depositaddr) // external { - int32_t ind,retval = JUMBLR_ERROR_DUPLICATEDEPOSIT; char *retstr; cJSON *retjson; + int32_t ind,retval = JUMBLR_ERROR_DUPLICATEDEPOSIT; char *retstr; cJSON *retjson,*ismine; if ( depositaddr == 0 ) depositaddr = (char *)""; if ( (ind= Jumblr_secretaddrfind(depositaddr)) < 0 ) { safecopy(Jumblr_deposit,depositaddr,sizeof(Jumblr_deposit)); - if ( (retstr= jumblr_importaddress(depositaddr)) != 0 ) + if ( (retstr= jumblr_validateaddress(depositaddr)) != 0 ) { if ( (retjson= cJSON_Parse(retstr)) != 0 ) { - if ( jobj(retjson,(char *)"error") == 0 || is_cJSON_Null(jobj(retjson,(char *)"error")) != 0 ) + if ( (ismine= jobj(retjson,(char *)"ismine")) != 0 && is_cJSON_True(ismine) != 0 ) retval = 0; - else retval = JUMBLR_ERROR_IMPORTADDRESS; + else retval = JUMBLR_ERROR_NOTINWALLET; free_json(retjson); } free(retstr); @@ -182,13 +189,6 @@ struct jumblr_item *jumblr_opidadd(char *opid) return(ptr); } -char *jumblr_validateaddress(char *addr) -{ - char params[1024]; - sprintf(params,"[\"%s\"]",addr); - return(jumblr_issuemethod(KMDUSERPASS,(char *)"validateaddress",params,7771)); -} - char *jumblr_zgetnewaddress() { char params[1024]; From c8e628684cae91fbe319ffc06dba72dfede194cd Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Jul 2017 13:28:56 +0200 Subject: [PATCH 13/58] Test --- src/komodo_jumblr.h | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/komodo_jumblr.h b/src/komodo_jumblr.h index 4c0d1b9e4..d779adf11 100755 --- a/src/komodo_jumblr.h +++ b/src/komodo_jumblr.h @@ -162,10 +162,17 @@ int32_t Jumblr_secretaddr(char *secretaddr) int32_t jumblr_addresstype(char *addr) { if ( addr[0] == 'z' && addr[1] == 'c' && strlen(addr) >= 40 ) + { + printf("zaddr.(%s)\n",addr); return('z'); + } else if ( strlen(addr) < 40 ) + { + printf("taddr.(%s)\n",addr); return('t'); - else return(-1); + } + printf("strange.(%s)\n",addr); + return(-1); } struct jumblr_item *jumblr_opidfind(char *opid) From aa3be97e79646105e0c4a7cabf30e74195127afe Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Jul 2017 13:33:58 +0200 Subject: [PATCH 14/58] Test --- src/komodo_jumblr.h | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/komodo_jumblr.h b/src/komodo_jumblr.h index d779adf11..2e239ba6b 100755 --- a/src/komodo_jumblr.h +++ b/src/komodo_jumblr.h @@ -161,16 +161,15 @@ int32_t Jumblr_secretaddr(char *secretaddr) int32_t jumblr_addresstype(char *addr) { + if ( addr[0] == '"' && addr[strlen(addr)-1] == '"' ) + { + addr[strlen(addr)-1] = 0; + addr++; + } if ( addr[0] == 'z' && addr[1] == 'c' && strlen(addr) >= 40 ) - { - printf("zaddr.(%s)\n",addr); return('z'); - } else if ( strlen(addr) < 40 ) - { - printf("taddr.(%s)\n",addr); return('t'); - } printf("strange.(%s)\n",addr); return(-1); } From 61a0f96b9ea60c6d623ee76767cced77cad3234c Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Jul 2017 13:40:38 +0200 Subject: [PATCH 15/58] Test --- src/komodo_jumblr.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/komodo_jumblr.h b/src/komodo_jumblr.h index 2e239ba6b..2a7ce0425 100755 --- a/src/komodo_jumblr.h +++ b/src/komodo_jumblr.h @@ -229,6 +229,7 @@ char *jumblr_sendt_to_z(char *taddr,char *zaddr,double amount) if ( jumblr_addresstype(zaddr) != 'z' || jumblr_addresstype(taddr) != 't' ) return(clonestr((char *)"{\"error\":\"illegal address in t to z\"}")); sprintf(params,"[\"%s\", [{\"address\":\"%s\",\"amount\":%.8f}, {\"address\":\"%s\",\"amount\":%.8f}], 1, %.8f]",taddr,zaddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); + printf("t -> z: %s\n",params); return(jumblr_issuemethod(KMDUSERPASS,(char *)"z_sendmany",params,7771)); } @@ -238,6 +239,7 @@ char *jumblr_sendz_to_z(char *zaddrS,char *zaddrD,double amount) if ( jumblr_addresstype(zaddrS) != 'z' || jumblr_addresstype(zaddrD) != 'z' ) return(clonestr((char *)"{\"error\":\"illegal address in z to z\"}")); sprintf(params,"[\"%s\", [{\"address\":\"%s\",\"amount\":%.8f}, {\"address\":\"%s\",\"amount\":%.8f}], 1, %.8f]",zaddrS,zaddrD,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); + printf("z -> z: %s\n",params); return(jumblr_issuemethod(KMDUSERPASS,(char *)"z_sendmany",params,7771)); } @@ -247,6 +249,7 @@ char *jumblr_sendz_to_t(char *zaddr,char *taddr,double amount) if ( jumblr_addresstype(zaddr) != 'z' || jumblr_addresstype(taddr) != 't' ) return(clonestr((char *)"{\"error\":\"illegal address in z to t\"}")); sprintf(params,"[\"%s\", [{\"address\":\"%s\",\"amount\":%.8f}, {\"address\":\"%s\",\"amount\":%.8f}], 1, %.8f]",zaddr,taddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); + printf("z -> t: %s\n",params); return(jumblr_issuemethod(KMDUSERPASS,(char *)"z_sendmany",params,7771)); } @@ -303,7 +306,7 @@ int64_t jumblr_balance(char *addr) { if ( (retstr= jumblr_listunspent(addr)) != 0 ) { - printf("jumblr.[%s].(%s)\n","KMD",retstr); + //printf("jumblr.[%s].(%s)\n","KMD",retstr); if ( (retjson= cJSON_Parse(retstr)) != 0 ) { if ( (n= cJSON_GetArraySize(retjson)) > 0 && is_cJSON_Array(retjson) != 0 ) From 20082066fd3acd6595b6b41f4a9c4f316742168c Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Jul 2017 13:47:15 +0200 Subject: [PATCH 16/58] Test --- src/komodo_jumblr.h | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/komodo_jumblr.h b/src/komodo_jumblr.h index 2a7ce0425..8db5dbd29 100755 --- a/src/komodo_jumblr.h +++ b/src/komodo_jumblr.h @@ -465,7 +465,7 @@ void jumblr_opidsupdate() void jumblr_iteration() { static int32_t lastheight; - char *zaddr,*retstr,secretaddr[64]; int32_t iter,height,counter,chosen_one,n; uint64_t amount=0,total=0; double fee; struct jumblr_item *ptr,*tmp; uint8_t r,s; + char *zaddr,*addr,*retstr,secretaddr[64]; int32_t iter,height,counter,chosen_one,n; uint64_t amount=0,total=0; double fee; struct jumblr_item *ptr,*tmp; uint8_t r,s; height = (int32_t)chainActive.Tip()->nHeight; if ( lastheight == height ) return; @@ -481,13 +481,18 @@ void jumblr_iteration() { if ( (zaddr= jumblr_zgetnewaddress()) != 0 ) { + if ( zaddr[0] == '"' && zaddr[strlen(zaddr)-1] == '"' ) + { + zaddr[strlen(zaddr)-1] = 0; + addr = zaddr+1; + } else addr = zaddr; amount = 0; if ( (height % (JUMBLR_SYNCHRONIZED_BLOCKS*JUMBLR_SYNCHRONIZED_BLOCKS)) == 0 && total >= SATOSHIDEN * ((JUMBLR_INCR + 3*fee)*100 + 3*JUMBLR_TXFEE) ) amount = SATOSHIDEN * ((JUMBLR_INCR + 3*fee)*100 + 3*JUMBLR_TXFEE); else if ( (r & 3) == 0 && total >= SATOSHIDEN * ((JUMBLR_INCR + 3*fee)*10 + 3*JUMBLR_TXFEE) ) amount = SATOSHIDEN * ((JUMBLR_INCR + 3*fee)*10 + 3*JUMBLR_TXFEE); else amount = SATOSHIDEN * ((JUMBLR_INCR + 3*fee) + 3*JUMBLR_TXFEE); - if ( amount > 0 && (retstr= jumblr_sendt_to_z(Jumblr_deposit,zaddr,dstr(amount))) != 0 ) + if ( amount > 0 && (retstr= jumblr_sendt_to_z(Jumblr_deposit,addr,dstr(amount))) != 0 ) { printf("sendt_to_z.(%s)\n",retstr); free(retstr); From dca9da6898d3adb3318c51be903a7f163828a3cb Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 12 Jul 2017 13:49:42 +0200 Subject: [PATCH 17/58] Test --- src/komodo_jumblr.h | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/komodo_jumblr.h b/src/komodo_jumblr.h index 8db5dbd29..d42bab110 100755 --- a/src/komodo_jumblr.h +++ b/src/komodo_jumblr.h @@ -464,11 +464,14 @@ void jumblr_opidsupdate() void jumblr_iteration() { - static int32_t lastheight; + static int32_t lastheight; static uint32_t lasttime; char *zaddr,*addr,*retstr,secretaddr[64]; int32_t iter,height,counter,chosen_one,n; uint64_t amount=0,total=0; double fee; struct jumblr_item *ptr,*tmp; uint8_t r,s; height = (int32_t)chainActive.Tip()->nHeight; if ( lastheight == height ) return; + if ( time(NULL) < lasttime+60 ) + return; + lasttime = (uint32_t)time(NULL); if ( (height % JUMBLR_SYNCHRONIZED_BLOCKS) != 0 ) return; fee = JUMBLR_INCR * JUMBLR_FEE; @@ -519,7 +522,12 @@ void jumblr_iteration() { if ( (zaddr= jumblr_zgetnewaddress()) != 0 ) { - if ( (retstr= jumblr_sendz_to_z(ptr->dest,zaddr,dstr(total))) != 0 ) + if ( zaddr[0] == '"' && zaddr[strlen(zaddr)-1] == '"' ) + { + zaddr[strlen(zaddr)-1] = 0; + addr = zaddr+1; + } else addr = zaddr; + if ( (retstr= jumblr_sendz_to_z(ptr->dest,addr,dstr(total))) != 0 ) { printf("n.%d counter.%d chosen_one.%d sendz_to_z.(%s)\n",n,counter,chosen_one,retstr); free(retstr); From d2d3c766296c007135c2fc41e872e614e9656730 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 13 Jul 2017 11:09:26 +0200 Subject: [PATCH 18/58] Test --- src/miner.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/miner.cpp b/src/miner.cpp index 1af9692a9..1b5722316 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -798,7 +798,9 @@ void static BitcoinMiner() if ( gpucount > j/2 ) { double delta; - i = ((Mining_height + notaryid) % 64); + if ( notaryid < 0 ) + i = (rand() % 64); + else i = ((Mining_height + notaryid) % 64); delta = sqrt((double)gpucount - j/2) / 2.; roundrobin_delay += ((delta * i) / 64) - delta; //fprintf(stderr,"delta.%f %f %f\n",delta,(double)(gpucount - j/3) / 2,(delta * i) / 64); @@ -869,7 +871,9 @@ void static BitcoinMiner() MilliSleep((rand() % 1700) + 1); } else if ( ASSETCHAINS_SYMBOL[0] != 0 ) - sleep(3); + { + sleep(rand() % 30); + } KOMODO_CHOSEN_ONE = 1; // Found a solution SetThreadPriority(THREAD_PRIORITY_NORMAL); From c89c562b09ece18b7fa2a2d7e42f43b9af1205c5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 13 Jul 2017 12:11:40 +0200 Subject: [PATCH 19/58] Test --- src/komodo_jumblr.h | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/src/komodo_jumblr.h b/src/komodo_jumblr.h index d42bab110..8484c1711 100755 --- a/src/komodo_jumblr.h +++ b/src/komodo_jumblr.h @@ -27,8 +27,8 @@ #define JUMBLR_ADDR "RGhxXpXSSBTBm9EvNsXnTQczthMCxHX91t" #define JUMBLR_BTCADDR "18RmTJe9qMech8siuhYfMtHo8RtcN1obC6" #define JUMBLR_MAXSECRETADDRS 777 -#define JUMBLR_SYNCHRONIZED_BLOCKS 2 // 60 -#define JUMBLR_INCR (99.65 / 100) +#define JUMBLR_SYNCHRONIZED_BLOCKS 2 //10 +#define JUMBLR_INCR 9.965 #define JUMBLR_FEE 0.001 #define JUMBLR_TXFEE 0.01 #define SMALLVAL 0.000000000000001 @@ -110,9 +110,10 @@ int32_t Jumblr_secretaddradd(char *secretaddr) // external { if ( (ind= Jumblr_secretaddrfind(secretaddr)) < 0 ) { - safecopy(Jumblr_secretaddrs[Jumblr_numsecretaddrs],secretaddr,64); - Jumblr_numsecretaddrs++; - } else return(ind); + ind = Jumblr_numsecretaddrs++; + safecopy(Jumblr_secretaddrs[ind],secretaddr,64); + } + return(ind); } else return(JUMBLR_ERROR_SECRETCANTBEDEPOSIT); } else return(JUMBLR_ERROR_TOOMANYSECRETS); } @@ -225,7 +226,7 @@ char *jumblr_zgetoperationstatus(char *opid) char *jumblr_sendt_to_z(char *taddr,char *zaddr,double amount) { - char params[1024]; double fee = (amount-3*JUMBLR_TXFEE) * JUMBLR_FEE; + char params[1024]; double fee = ((amount-3*JUMBLR_TXFEE) * JUMBLR_FEE) * 1.5; if ( jumblr_addresstype(zaddr) != 'z' || jumblr_addresstype(taddr) != 't' ) return(clonestr((char *)"{\"error\":\"illegal address in t to z\"}")); sprintf(params,"[\"%s\", [{\"address\":\"%s\",\"amount\":%.8f}, {\"address\":\"%s\",\"amount\":%.8f}], 1, %.8f]",taddr,zaddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); @@ -238,14 +239,15 @@ char *jumblr_sendz_to_z(char *zaddrS,char *zaddrD,double amount) char params[1024]; double fee = (amount-2*JUMBLR_TXFEE) * JUMBLR_FEE; if ( jumblr_addresstype(zaddrS) != 'z' || jumblr_addresstype(zaddrD) != 'z' ) return(clonestr((char *)"{\"error\":\"illegal address in z to z\"}")); - sprintf(params,"[\"%s\", [{\"address\":\"%s\",\"amount\":%.8f}, {\"address\":\"%s\",\"amount\":%.8f}], 1, %.8f]",zaddrS,zaddrD,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); + //sprintf(params,"[\"%s\", [{\"address\":\"%s\",\"amount\":%.8f}, {\"address\":\"%s\",\"amount\":%.8f}], 1, %.8f]",zaddrS,zaddrD,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); + sprintf(params,"[\"%s\", [{\"address\":\"%s\",\"amount\":%.8f}], 1, %.8f]",zaddrS,zaddrD,amount-fee-JUMBLR_TXFEE,JUMBLR_TXFEE); printf("z -> z: %s\n",params); return(jumblr_issuemethod(KMDUSERPASS,(char *)"z_sendmany",params,7771)); } char *jumblr_sendz_to_t(char *zaddr,char *taddr,double amount) { - char params[1024]; double fee = (amount-JUMBLR_TXFEE) * JUMBLR_FEE; + char params[1024]; double fee = ((amount-JUMBLR_TXFEE) * JUMBLR_FEE) * 1.5; if ( jumblr_addresstype(zaddr) != 'z' || jumblr_addresstype(taddr) != 't' ) return(clonestr((char *)"{\"error\":\"illegal address in z to t\"}")); sprintf(params,"[\"%s\", [{\"address\":\"%s\",\"amount\":%.8f}, {\"address\":\"%s\",\"amount\":%.8f}], 1, %.8f]",zaddr,taddr,amount-fee-JUMBLR_TXFEE,JUMBLR_ADDR,fee,JUMBLR_TXFEE); @@ -443,7 +445,7 @@ void jumblr_opidsupdate() { if ( (n= cJSON_GetArraySize(array)) > 0 && is_cJSON_Array(array) != 0 ) { - printf("%s -> n%d\n",retstr,n); + //printf("%s -> n%d\n",retstr,n); for (i=0; i> 2) % 3); + s = 2; switch ( s ) { case 0: // public -> z, need to importprivkey @@ -573,14 +576,14 @@ void jumblr_iteration() Jumblr_secretaddr(secretaddr); if ( (retstr= jumblr_sendz_to_t(ptr->dest,secretaddr,dstr(total))) != 0 ) { - printf("sendz_to_t.(%s)\n",retstr); + printf("%s sendz_to_t.(%s)\n",secretaddr,retstr); free(retstr); - } + } else printf("null return from jumblr_sendz_to_t\n"); ptr->spent = (uint32_t)time(NULL); break; } counter++; - } + } else printf("z->t spent.%u total %.8f error\n",ptr->spent,dstr(total)); } n++; } From 421d71a20700f2371ccd8fddb0b012dc3462432b Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 13 Jul 2017 12:30:51 +0200 Subject: [PATCH 20/58] Test --- src/komodo_jumblr.h | 43 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/src/komodo_jumblr.h b/src/komodo_jumblr.h index 8484c1711..06eb105e5 100755 --- a/src/komodo_jumblr.h +++ b/src/komodo_jumblr.h @@ -255,6 +255,13 @@ char *jumblr_sendz_to_t(char *zaddr,char *taddr,double amount) return(jumblr_issuemethod(KMDUSERPASS,(char *)"z_sendmany",params,7771)); } +char *jumblr_zlistaddresses(char *addr) +{ + char params[1024]; + sprintf(params,"[\"%s\", 1]",addr); + return(jumblr_issuemethod(KMDUSERPASS,(char *)"z_listaddresses",params,7771)); +} + char *jumblr_zlistreceivedbyaddress(char *addr) { char params[1024]; @@ -436,6 +443,20 @@ void jumblr_prune(struct jumblr_item *ptr) } } +void jumblr_zaddrinit(char *zaddr) +{ + char *retstr; cJSON *item; + if ( (retstr= jumblr_zlistreceivedbyaddress(zaddr)) != 0 ) + { + if ( (item= cJSON_Parse(retstr)) != 0 ) + { + printf("%s\n",jprint(item,0)); + free_json(item); + } + free(retstr); + } +} + void jumblr_opidsupdate() { char *retstr; cJSON *array; int32_t i,n; struct jumblr_item *ptr; @@ -467,13 +488,29 @@ void jumblr_opidsupdate() void jumblr_iteration() { static int32_t lastheight; static uint32_t lasttime; - char *zaddr,*addr,*retstr,secretaddr[64]; int32_t iter,height,counter,chosen_one,n; uint64_t amount=0,total=0; double fee; struct jumblr_item *ptr,*tmp; uint8_t r,s; + char *zaddr,*addr,*retstr,secretaddr[64]; cJSON *array; int32_t i,iter,height,counter,chosen_one,n; uint64_t amount=0,total=0; double fee; struct jumblr_item *ptr,*tmp; uint8_t r,s; + if ( lasttime == 0 ) + { + if ( (retstr= jumblr_zlistaddresses()) != 0 ) + { + if ( (array= cJSON_Parse(retstr)) != 0 ) + { + if ( (n= cJSON_GetArraySize(array)) > 0 && is_cJSON_Array(array) != 0 ) + { + for (i=0; inHeight; - if ( lastheight == height ) - return; if ( time(NULL) < lasttime+60 ) return; lasttime = (uint32_t)time(NULL); + if ( lastheight == height ) + return; if ( (height % JUMBLR_SYNCHRONIZED_BLOCKS) != 0 ) return; fee = JUMBLR_INCR * JUMBLR_FEE; From 007d1a865786a413c3cc518deeaf088177c618e0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 13 Jul 2017 12:32:02 +0200 Subject: [PATCH 21/58] Test --- src/komodo_jumblr.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/komodo_jumblr.h b/src/komodo_jumblr.h index 06eb105e5..7de1b3c1a 100755 --- a/src/komodo_jumblr.h +++ b/src/komodo_jumblr.h @@ -255,10 +255,10 @@ char *jumblr_sendz_to_t(char *zaddr,char *taddr,double amount) return(jumblr_issuemethod(KMDUSERPASS,(char *)"z_sendmany",params,7771)); } -char *jumblr_zlistaddresses(char *addr) +char *jumblr_zlistaddresses() { char params[1024]; - sprintf(params,"[\"%s\", 1]",addr); + sprintf(params,"[]"); return(jumblr_issuemethod(KMDUSERPASS,(char *)"z_listaddresses",params,7771)); } From c45ec669c16a279f4dfa7b72a65e357369358d37 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 13 Jul 2017 12:40:50 +0200 Subject: [PATCH 22/58] Test --- src/komodo_jumblr.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/komodo_jumblr.h b/src/komodo_jumblr.h index 7de1b3c1a..53736c402 100755 --- a/src/komodo_jumblr.h +++ b/src/komodo_jumblr.h @@ -445,12 +445,13 @@ void jumblr_prune(struct jumblr_item *ptr) void jumblr_zaddrinit(char *zaddr) { + //[{"txid":"8186f4e9868dc8525126a92f2fe93ea86272b091609fafdc418a76a7fda34ebd","amount":1.00749152,"memo":"f600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}] char *retstr; cJSON *item; if ( (retstr= jumblr_zlistreceivedbyaddress(zaddr)) != 0 ) { if ( (item= cJSON_Parse(retstr)) != 0 ) { - printf("%s\n",jprint(item,0)); + printf("%s %s %s\n",zaddr,jumblr_zgetbalance(zaddr),jprint(item,0)); free_json(item); } free(retstr); From f3f124e1abc53e0a07fb93d2cf63ca5f47425f55 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 13 Jul 2017 13:14:56 +0200 Subject: [PATCH 23/58] Test --- src/komodo_jumblr.h | 56 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 46 insertions(+), 10 deletions(-) diff --git a/src/komodo_jumblr.h b/src/komodo_jumblr.h index 53736c402..c002a6c80 100755 --- a/src/komodo_jumblr.h +++ b/src/komodo_jumblr.h @@ -41,9 +41,9 @@ struct jumblr_item { UT_hash_handle hh; - int64_t amount,fee,txfee; + int64_t amount,fee,txfee; // fee and txfee not really used (yet) uint32_t spent,pad; - char opid[64],src[128],dest[128],status; + char opid[66],src[128],dest[128],status; } *Jumblrs; char Jumblr_secretaddrs[JUMBLR_MAXSECRETADDRS][64],Jumblr_deposit[64]; @@ -446,15 +446,51 @@ void jumblr_prune(struct jumblr_item *ptr) void jumblr_zaddrinit(char *zaddr) { //[{"txid":"8186f4e9868dc8525126a92f2fe93ea86272b091609fafdc418a76a7fda34ebd","amount":1.00749152,"memo":"f600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}] - char *retstr; cJSON *item; - if ( (retstr= jumblr_zlistreceivedbyaddress(zaddr)) != 0 ) + char *retstr; cJSON *item; double total; bits256 txid; char txidstr[65],t_z,z_t; + if ( (totalstr= jumblr_zgetbalance(zaddr)) != 0 ) { - if ( (item= cJSON_Parse(retstr)) != 0 ) + if ( (total= atof(total)) > SMALLVAL ) { - printf("%s %s %s\n",zaddr,jumblr_zgetbalance(zaddr),jprint(item,0)); - free_json(item); + if ( (retstr= jumblr_zlistreceivedbyaddress(zaddr)) != 0 ) + { + if ( (array= cJSON_Parse(retstr)) != 0 ) + { + if ( cJSON_GetArraySize(array) == 1 && is_cJSON_Array(array) != 0 ) + { + item = jitem(array,0); + if ( (uint64_t)(total * SATOSHIDEN) == (uint64_t)(jdouble(item,"amount") * SATOSHIDEN) ) + { + txid = jbits256(item,"txid"); + bits256_str(txidstr,txid); + if ( (ptr= jumblr_opidadd(txidstr)) != 0 ) + { + ptr->amount = (total * SATOSHIDEN); + ptr->status = 1; + strcpy(ptr->dest,zaddr); + if ( jumblr_numvins(txid) == 0 ) + { + z_z = 1; + strcpy(ptr->src,"zcaddr"); + if ( jumblr_addresstype(ptr->src) != 'z' ) + printf("error setting address type to Z: %s\n",jprint(item,0)); + } + else + { + t_z = 1; + strcpy(ptr->src,"taddr"); + if ( jumblr_addresstype(ptr->src) != 't' ) + printf("error setting address type to T: %s\n",jprint(item,0)); + } + printf("%s %s %.8f t_z.%d z_z.%d\n",zaddr,txidstr,total,t_z,z_z); // cant be z->t from spend + } + } else printf("mismatched %s total %.8f vs %.8f\n",zaddr,total,jdouble(item,"amount")); + } + free_json(array); + } + free(retstr); + } } - free(retstr); + free(totalstr); } } @@ -555,7 +591,7 @@ void jumblr_iteration() counter = n = 0; HASH_ITER(hh,Jumblrs,ptr,tmp) { - if ( jumblr_addresstype(ptr->src) == 't' && jumblr_addresstype(ptr->dest) == 'z' ) + if ( ptr->status > 0 && jumblr_addresstype(ptr->src) == 't' && jumblr_addresstype(ptr->dest) == 'z' ) { if ( ptr->spent == 0 && (total= jumblr_balance(ptr->dest)) >= (fee + JUMBLR_FEE)*SATOSHIDEN ) { @@ -605,7 +641,7 @@ void jumblr_iteration() counter = n = 0; HASH_ITER(hh,Jumblrs,ptr,tmp) { - if ( jumblr_addresstype(ptr->src) == 'z' && jumblr_addresstype(ptr->dest) == 'z' ) + if ( ptr->status > 0 && jumblr_addresstype(ptr->src) == 'z' && jumblr_addresstype(ptr->dest) == 'z' ) { if ( ptr->spent == 0 && (total= jumblr_balance(ptr->dest)) >= (fee + JUMBLR_FEE)*SATOSHIDEN ) { From 61c2e3f5bf27b565a1212636435c60e7c2991fb8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 13 Jul 2017 13:16:01 +0200 Subject: [PATCH 24/58] Test --- src/komodo_jumblr.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/komodo_jumblr.h b/src/komodo_jumblr.h index c002a6c80..6a16f22b6 100755 --- a/src/komodo_jumblr.h +++ b/src/komodo_jumblr.h @@ -445,8 +445,7 @@ void jumblr_prune(struct jumblr_item *ptr) void jumblr_zaddrinit(char *zaddr) { - //[{"txid":"8186f4e9868dc8525126a92f2fe93ea86272b091609fafdc418a76a7fda34ebd","amount":1.00749152,"memo":"f600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"}] - char *retstr; cJSON *item; double total; bits256 txid; char txidstr[65],t_z,z_t; + char *retstr; cJSON *item,*array; double total; bits256 txid; char txidstr[65],t_z,z_z; if ( (totalstr= jumblr_zgetbalance(zaddr)) != 0 ) { if ( (total= atof(total)) > SMALLVAL ) From a78fe447982744ce439ff6b8b639ce145efd1a76 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 13 Jul 2017 13:19:25 +0200 Subject: [PATCH 25/58] Test --- src/komodo_jumblr.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_jumblr.h b/src/komodo_jumblr.h index 6a16f22b6..597dfe3f0 100755 --- a/src/komodo_jumblr.h +++ b/src/komodo_jumblr.h @@ -445,7 +445,7 @@ void jumblr_prune(struct jumblr_item *ptr) void jumblr_zaddrinit(char *zaddr) { - char *retstr; cJSON *item,*array; double total; bits256 txid; char txidstr[65],t_z,z_z; + struct jumblr_item *ptr; char *retstr; cJSON *item,*array; double total; bits256 txid; char txidstr[65],t_z,z_z; if ( (totalstr= jumblr_zgetbalance(zaddr)) != 0 ) { if ( (total= atof(total)) > SMALLVAL ) From bbd64789fc7dd64a5623b176288b6411fb521865 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 13 Jul 2017 13:26:33 +0200 Subject: [PATCH 26/58] Test --- src/komodo_jumblr.h | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/src/komodo_jumblr.h b/src/komodo_jumblr.h index 597dfe3f0..318ef6a28 100755 --- a/src/komodo_jumblr.h +++ b/src/komodo_jumblr.h @@ -297,6 +297,30 @@ char *jumblr_listunspent(char *coinaddr) return(jumblr_issuemethod(KMDUSERPASS,(char *)"listunspent",params,7771)); } +char *jumblr_gettransaction(char *txidstr) +{ + char params[1024]; + sprintf(params,"[\"%s\", 1]",txidstr); + return(jumblr_issuemethod(KMDUSERPASS,(char *)"getrawtransaction",params,7771)); +} + +int32_t jumblr_numvins(bits256 txid) +{ + char txidstr[65],params[1024],*retstr; cJSON *retjson,*vins; int32_t numvins = -1; + bits256_str(txidstr,txid); + if ( (retstr= jumblr_gettransaction(txidstr)) != 0 ) + { + if ( (retjson= cJSON_Parse(retstr)) != 0 ) + { + if ( (vins= jarray(&n,retjson,"vin")) != 0 ) + numvins = n; + free_json(retjson); + } + free(retstr); + } + return(numvins); +} + int64_t jumblr_receivedby(char *addr) { char *retstr; int64_t total = 0; @@ -445,7 +469,7 @@ void jumblr_prune(struct jumblr_item *ptr) void jumblr_zaddrinit(char *zaddr) { - struct jumblr_item *ptr; char *retstr; cJSON *item,*array; double total; bits256 txid; char txidstr[65],t_z,z_z; + struct jumblr_item *ptr; char *retstr,*totalstr; cJSON *item,*array; double total; bits256 txid; char txidstr[65],t_z,z_z; if ( (totalstr= jumblr_zgetbalance(zaddr)) != 0 ) { if ( (total= atof(total)) > SMALLVAL ) @@ -457,9 +481,9 @@ void jumblr_zaddrinit(char *zaddr) if ( cJSON_GetArraySize(array) == 1 && is_cJSON_Array(array) != 0 ) { item = jitem(array,0); - if ( (uint64_t)(total * SATOSHIDEN) == (uint64_t)(jdouble(item,"amount") * SATOSHIDEN) ) + if ( (uint64_t)(total * SATOSHIDEN) == (uint64_t)(jdouble(item,(char *)"amount") * SATOSHIDEN) ) { - txid = jbits256(item,"txid"); + txid = jbits256(item,(char *)"txid"); bits256_str(txidstr,txid); if ( (ptr= jumblr_opidadd(txidstr)) != 0 ) { @@ -482,7 +506,7 @@ void jumblr_zaddrinit(char *zaddr) } printf("%s %s %.8f t_z.%d z_z.%d\n",zaddr,txidstr,total,t_z,z_z); // cant be z->t from spend } - } else printf("mismatched %s total %.8f vs %.8f\n",zaddr,total,jdouble(item,"amount")); + } else printf("mismatched %s total %.8f vs %.8f\n",zaddr,total,jdouble(item,(char *)"amount")); } free_json(array); } From d506468b2c39970c7021ca25e3e12096d1e10ce7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 13 Jul 2017 13:27:27 +0200 Subject: [PATCH 27/58] Test --- src/komodo_jumblr.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_jumblr.h b/src/komodo_jumblr.h index 318ef6a28..12b8799e3 100755 --- a/src/komodo_jumblr.h +++ b/src/komodo_jumblr.h @@ -306,7 +306,7 @@ char *jumblr_gettransaction(char *txidstr) int32_t jumblr_numvins(bits256 txid) { - char txidstr[65],params[1024],*retstr; cJSON *retjson,*vins; int32_t numvins = -1; + char txidstr[65],params[1024],*retstr; cJSON *retjson,*vins; int32_t n,numvins = -1; bits256_str(txidstr,txid); if ( (retstr= jumblr_gettransaction(txidstr)) != 0 ) { From e5dfb297da776441983abee9a5e6c7079b42217b Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 13 Jul 2017 13:28:42 +0200 Subject: [PATCH 28/58] Test --- src/komodo_jumblr.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/komodo_jumblr.h b/src/komodo_jumblr.h index 12b8799e3..cff1524d3 100755 --- a/src/komodo_jumblr.h +++ b/src/komodo_jumblr.h @@ -312,7 +312,7 @@ int32_t jumblr_numvins(bits256 txid) { if ( (retjson= cJSON_Parse(retstr)) != 0 ) { - if ( (vins= jarray(&n,retjson,"vin")) != 0 ) + if ( (vins= jarray(&n,retjson,(char *)"vin")) != 0 ) numvins = n; free_json(retjson); } @@ -472,7 +472,7 @@ void jumblr_zaddrinit(char *zaddr) struct jumblr_item *ptr; char *retstr,*totalstr; cJSON *item,*array; double total; bits256 txid; char txidstr[65],t_z,z_z; if ( (totalstr= jumblr_zgetbalance(zaddr)) != 0 ) { - if ( (total= atof(total)) > SMALLVAL ) + if ( (total= atof(totalstr)) > SMALLVAL ) { if ( (retstr= jumblr_zlistreceivedbyaddress(zaddr)) != 0 ) { From afae290a4257ac398975cd2740e61400c171a51e Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 13 Jul 2017 13:38:29 +0200 Subject: [PATCH 29/58] Test --- src/komodo_jumblr.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/komodo_jumblr.h b/src/komodo_jumblr.h index cff1524d3..c5348abf5 100755 --- a/src/komodo_jumblr.h +++ b/src/komodo_jumblr.h @@ -478,6 +478,7 @@ void jumblr_zaddrinit(char *zaddr) { if ( (array= cJSON_Parse(retstr)) != 0 ) { + t_z = z_z = 0; if ( cJSON_GetArraySize(array) == 1 && is_cJSON_Array(array) != 0 ) { item = jitem(array,0); @@ -659,11 +660,13 @@ void jumblr_iteration() { jumblr_opidsupdate(); chosen_one = -1; + printf("Jumblr_numsecretaddrs.%d\n",Jumblr_numsecretaddrs); for (iter=0; iter<2; iter++) { counter = n = 0; HASH_ITER(hh,Jumblrs,ptr,tmp) { + printf("status.%d %c %c %.8f\n",ptr->status,jumblr_addresstype(ptr->src),jumblr_addresstype(ptr->dest),dstr(ptr->amount)); if ( ptr->status > 0 && jumblr_addresstype(ptr->src) == 'z' && jumblr_addresstype(ptr->dest) == 'z' ) { if ( ptr->spent == 0 && (total= jumblr_balance(ptr->dest)) >= (fee + JUMBLR_FEE)*SATOSHIDEN ) From ad74c1a37eb6e9d6836a3445fe684a5123da144a Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 13 Jul 2017 13:45:34 +0200 Subject: [PATCH 30/58] Test --- src/komodo_jumblr.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/komodo_jumblr.h b/src/komodo_jumblr.h index c5348abf5..92cebf937 100755 --- a/src/komodo_jumblr.h +++ b/src/komodo_jumblr.h @@ -313,7 +313,10 @@ int32_t jumblr_numvins(bits256 txid) if ( (retjson= cJSON_Parse(retstr)) != 0 ) { if ( (vins= jarray(&n,retjson,(char *)"vin")) != 0 ) + { numvins = n; + printf("numvins.%d\n",n); + } else printf("no vin.(%s)\n",retstr); free_json(retjson); } free(retstr); From c4818fd41e91029edf6c1e328b4e94023ff07b85 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 13 Jul 2017 13:51:30 +0200 Subject: [PATCH 31/58] Test --- src/komodo_jumblr.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/komodo_jumblr.h b/src/komodo_jumblr.h index 92cebf937..8c8ee5775 100755 --- a/src/komodo_jumblr.h +++ b/src/komodo_jumblr.h @@ -312,11 +312,11 @@ int32_t jumblr_numvins(bits256 txid) { if ( (retjson= cJSON_Parse(retstr)) != 0 ) { - if ( (vins= jarray(&n,retjson,(char *)"vin")) != 0 ) + if ( jobj(retjson,(char *)"vin") != 0 && ((vins= jarray(&n,retjson,(char *)"vin")) == 0 || n == 0) ) { numvins = n; - printf("numvins.%d\n",n); - } else printf("no vin.(%s)\n",retstr); + //printf("numvins.%d\n",n); + } //else printf("no vin.(%s)\n",retstr); free_json(retjson); } free(retstr); From 231bcedcf1fdf72b52023ed50259cd5c6b1e47a1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 13 Jul 2017 13:58:12 +0200 Subject: [PATCH 32/58] Test --- src/komodo_jumblr.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/komodo_jumblr.h b/src/komodo_jumblr.h index 8c8ee5775..5022b2371 100755 --- a/src/komodo_jumblr.h +++ b/src/komodo_jumblr.h @@ -494,10 +494,12 @@ void jumblr_zaddrinit(char *zaddr) ptr->amount = (total * SATOSHIDEN); ptr->status = 1; strcpy(ptr->dest,zaddr); + if ( jumblr_addresstype(ptr->dest) != 'z' ) + printf("error setting dest type to Z: %s\n",jprint(item,0)); if ( jumblr_numvins(txid) == 0 ) { z_z = 1; - strcpy(ptr->src,"zcaddr"); + strcpy(ptr->src,zaddr); if ( jumblr_addresstype(ptr->src) != 'z' ) printf("error setting address type to Z: %s\n",jprint(item,0)); } From eb23a6422056fa8f4d425609d027278f73e5e20d Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 13 Jul 2017 14:09:52 +0200 Subject: [PATCH 33/58] Test --- src/komodo_jumblr.h | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/src/komodo_jumblr.h b/src/komodo_jumblr.h index 5022b2371..7789b5b81 100755 --- a/src/komodo_jumblr.h +++ b/src/komodo_jumblr.h @@ -450,6 +450,8 @@ void jumblr_opidupdate(struct jumblr_item *ptr) void jumblr_prune(struct jumblr_item *ptr) { struct jumblr_item *tmp; char oldsrc[128]; int32_t flag = 1; + if ( is_hexstr(ptr->opid,0) == 64 ) + return; printf("jumblr_prune %s\n",ptr->opid); strcpy(oldsrc,ptr->src); free(jumblr_zgetoperationresult(ptr->opid)); @@ -460,11 +462,14 @@ void jumblr_prune(struct jumblr_item *ptr) { if ( strcmp(oldsrc,ptr->dest) == 0 ) { - printf("jumblr_prune %s (%s -> %s) matched oldsrc\n",ptr->opid,ptr->src,ptr->dest); - free(jumblr_zgetoperationresult(ptr->opid)); - strcpy(oldsrc,ptr->src); - flag = 1; - break; + if ( is_hexstr(ptr->opid,0) != 64 ) + { + printf("jumblr_prune %s (%s -> %s) matched oldsrc\n",ptr->opid,ptr->src,ptr->dest); + free(jumblr_zgetoperationresult(ptr->opid)); + strcpy(oldsrc,ptr->src); + flag = 1; + break; + } } } } @@ -500,6 +505,9 @@ void jumblr_zaddrinit(char *zaddr) { z_z = 1; strcpy(ptr->src,zaddr); + ptr->src[3] = '0'; + ptr->src[4] = '0'; + ptr->src[5] = '0'; if ( jumblr_addresstype(ptr->src) != 'z' ) printf("error setting address type to Z: %s\n",jprint(item,0)); } @@ -585,7 +593,7 @@ void jumblr_iteration() s = 2; switch ( s ) { - case 0: // public -> z, need to importprivkey + case 0: // t -> z if ( Jumblr_deposit[0] != 0 && (total= jumblr_balance(Jumblr_deposit)) >= (JUMBLR_INCR + 3*(fee+JUMBLR_TXFEE))*SATOSHIDEN ) { if ( (zaddr= jumblr_zgetnewaddress()) != 0 ) @@ -635,7 +643,7 @@ void jumblr_iteration() } else addr = zaddr; if ( (retstr= jumblr_sendz_to_z(ptr->dest,addr,dstr(total))) != 0 ) { - printf("n.%d counter.%d chosen_one.%d sendz_to_z.(%s)\n",n,counter,chosen_one,retstr); + printf("n.%d counter.%d chosen_one.%d send z_to_z.(%s)\n",n,counter,chosen_one,retstr); free(retstr); } ptr->spent = (uint32_t)time(NULL); @@ -660,18 +668,17 @@ void jumblr_iteration() } } break; - case 2: // z -> public + case 2: // z -> t if ( Jumblr_numsecretaddrs > 0 ) { jumblr_opidsupdate(); chosen_one = -1; - printf("Jumblr_numsecretaddrs.%d\n",Jumblr_numsecretaddrs); for (iter=0; iter<2; iter++) { counter = n = 0; HASH_ITER(hh,Jumblrs,ptr,tmp) { - printf("status.%d %c %c %.8f\n",ptr->status,jumblr_addresstype(ptr->src),jumblr_addresstype(ptr->dest),dstr(ptr->amount)); + //printf("status.%d %c %c %.8f\n",ptr->status,jumblr_addresstype(ptr->src),jumblr_addresstype(ptr->dest),dstr(ptr->amount)); if ( ptr->status > 0 && jumblr_addresstype(ptr->src) == 'z' && jumblr_addresstype(ptr->dest) == 'z' ) { if ( ptr->spent == 0 && (total= jumblr_balance(ptr->dest)) >= (fee + JUMBLR_FEE)*SATOSHIDEN ) @@ -681,7 +688,7 @@ void jumblr_iteration() Jumblr_secretaddr(secretaddr); if ( (retstr= jumblr_sendz_to_t(ptr->dest,secretaddr,dstr(total))) != 0 ) { - printf("%s sendz_to_t.(%s)\n",secretaddr,retstr); + printf("%s send z_to_t.(%s)\n",secretaddr,retstr); free(retstr); } else printf("null return from jumblr_sendz_to_t\n"); ptr->spent = (uint32_t)time(NULL); From 1cacba6a844f580f1889272390a5d0c72deef69a Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 13 Jul 2017 14:21:52 +0200 Subject: [PATCH 34/58] Test --- README.md | 40 ++++++++++++++++++++++++++++++++++++++++ src/komodo_jumblr.h | 10 +++++----- 2 files changed, 45 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 8278748a8..ef3d637a6 100644 --- a/README.md +++ b/README.md @@ -180,4 +180,44 @@ mv ~/.komodo ~/.komodo.old && mkdir ~/.komodo && cp ~/.komodo.old/komodo.conf ~/ ./komodod -exchange -exportdir=/tmp & ./komodo-cli importwallet /tmp/example +############## JUMBLR + +komodod now has jumblr_deposit and jumblr_secret RPC calls. + +Jumblr works like described previously where all the nodes with jumblr active synchronize their tx activity during the same block to maximize the mixing effect. However, unlike all other mixers/tumblers, you never give up control of your coins to anybody else. JUMBLR uses a one to many allocation of funds, ie. one deposit address and many secret addresses. You can always run multiple komodod daemons to get multiple active deposit addresses. + +JUMBLR implements t -> z, z -> z and z -> t transactions to maximize privacy of the destination t (transparent) address. So while it is transparent, its first activity is funds coming from an untracable z address. + +Which of the three stages is done is randomly selected at each turn. Also when there are more than one possible transaction at the selected stage, a random one is selected. This randomization prevents analyzing incoming z ->t transactions by its size to correlate it to the originating address. + +jumblr_deposit designates the deposit address as the jumblr deposit address for that session. You can select an address that already has funds in it and it will immediately start jumblr process. If there are no funds, it will wait until you send funds to it. + +There are three sizes of a jumblr transaction: 10 KMD, 100 KMD and 1000 KMD. There is also a fixed interval of blocks where all jumblr nodes are active. Currently it is set to be 10, but this is subject to change. Only during every 10*10 blocks are the largest 1000 KMD transactions processed, so this concentrates all the large transactions every N*N blocks. + +jumblr_secret notifies JUMBLR where to send the final z -> t transactions. In order to allow larger accounts to obtain privacy, up to 777 secret addresses are supported. Whenever a z -> t stage is activated, a random secret address from the list of the then active secret addresses is selected. + +Practical Advice: +Obtaining privacy used to be very difficult. JUMBLR makes it as simple as issuing two command line calls. Higher level layers can be added to help manage the addresses, ie. linking them at the passphrase level. Such things are left to each implementation. + +Once obtained, it is very easy to lose all the privacy. With a single errant transaction that combines some previously used address and the secretaddress, well, the secretaddress is no longer so private. + +The advice is to setup a totally separate node! + +This might seem a bit drastic, but if you want to maintain privacy, it is best to make it look like all the transactions are coming from a different node. The easiest way for most people to do this is to actually have a different node. + +It can be a dedicated laptop (recommended) or a VPS (for not so big amounts) with a totally fresh komodod wallet. Generate an address on this wallet and use that as the jumblr_secret address on your main node. As the JUMBLR operates funds will teleport into your secret node's address. If you are careful and never use the same IP address for both your nodes, you will be able to maintain very good privacy. + +Of course, dont be sending emails that link the two accounts together! Dont use secret address funds for home delivery purchases!! Etc. There are many ways to lose the privacy, just think about what linkages can be dont at the IP and blockchain level and that should be a useful preparation. + +What if you have 100,000 KMD and you dont want others to know you are such a whale? + +Instead of generating 1 secret address, generate 100 and make a script file with: + +./komodo-cli jumblr_secret +./komodo-cli jumblr_secret +... +./komodo-cli jumblr_secret + +And make sure to delete all traces of this when the JUMBLR is finished. You will end up with 100 addresses that have an average of 1000 KMD each. So as long as you are careful and dont do a 10,000 KMD transaction (that will link 10 of your secret addresses together), you can appear as 100 different people each with 1000 KMD. + diff --git a/src/komodo_jumblr.h b/src/komodo_jumblr.h index 7789b5b81..abb1d66f2 100755 --- a/src/komodo_jumblr.h +++ b/src/komodo_jumblr.h @@ -628,9 +628,9 @@ void jumblr_iteration() counter = n = 0; HASH_ITER(hh,Jumblrs,ptr,tmp) { - if ( ptr->status > 0 && jumblr_addresstype(ptr->src) == 't' && jumblr_addresstype(ptr->dest) == 'z' ) + if ( ptr->spent == 0 && ptr->status > 0 && jumblr_addresstype(ptr->src) == 't' && jumblr_addresstype(ptr->dest) == 'z' ) { - if ( ptr->spent == 0 && (total= jumblr_balance(ptr->dest)) >= (fee + JUMBLR_FEE)*SATOSHIDEN ) + if ( (total= jumblr_balance(ptr->dest)) >= (fee + JUMBLR_FEE)*SATOSHIDEN ) { if ( iter == 1 && counter == chosen_one ) { @@ -679,9 +679,9 @@ void jumblr_iteration() HASH_ITER(hh,Jumblrs,ptr,tmp) { //printf("status.%d %c %c %.8f\n",ptr->status,jumblr_addresstype(ptr->src),jumblr_addresstype(ptr->dest),dstr(ptr->amount)); - if ( ptr->status > 0 && jumblr_addresstype(ptr->src) == 'z' && jumblr_addresstype(ptr->dest) == 'z' ) + if ( ptr->spent == 0 && ptr->status > 0 && jumblr_addresstype(ptr->src) == 'z' && jumblr_addresstype(ptr->dest) == 'z' ) { - if ( ptr->spent == 0 && (total= jumblr_balance(ptr->dest)) >= (fee + JUMBLR_FEE)*SATOSHIDEN ) + if ( (total= jumblr_balance(ptr->dest)) >= (fee + JUMBLR_FEE)*SATOSHIDEN ) { if ( iter == 1 && n == chosen_one ) { @@ -708,7 +708,7 @@ void jumblr_iteration() chosen_one = -chosen_one; chosen_one %= counter; printf("jumblr z->t chosen_one.%d of %d, from %d\n",chosen_one,counter,n); - } + } else printf("n.%d counter.%d chosen.%d\n",n,counter,chosen); } } break; From 4e45c04103c358b8371dfa9112589c60ff32ea8d Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 13 Jul 2017 14:24:22 +0200 Subject: [PATCH 35/58] Test --- src/komodo_jumblr.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_jumblr.h b/src/komodo_jumblr.h index abb1d66f2..9359f95ba 100755 --- a/src/komodo_jumblr.h +++ b/src/komodo_jumblr.h @@ -708,7 +708,7 @@ void jumblr_iteration() chosen_one = -chosen_one; chosen_one %= counter; printf("jumblr z->t chosen_one.%d of %d, from %d\n",chosen_one,counter,n); - } else printf("n.%d counter.%d chosen.%d\n",n,counter,chosen); + } else printf("n.%d counter.%d chosen.%d\n",n,counter,chosen_one); } } break; From 3db947b84e90b4db8a385142102004bd75f0289f Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 13 Jul 2017 14:33:26 +0200 Subject: [PATCH 36/58] Test --- src/komodo_jumblr.h | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/komodo_jumblr.h b/src/komodo_jumblr.h index 9359f95ba..bdb31a329 100755 --- a/src/komodo_jumblr.h +++ b/src/komodo_jumblr.h @@ -27,7 +27,7 @@ #define JUMBLR_ADDR "RGhxXpXSSBTBm9EvNsXnTQczthMCxHX91t" #define JUMBLR_BTCADDR "18RmTJe9qMech8siuhYfMtHo8RtcN1obC6" #define JUMBLR_MAXSECRETADDRS 777 -#define JUMBLR_SYNCHRONIZED_BLOCKS 2 //10 +#define JUMBLR_SYNCHRONIZED_BLOCKS 10 #define JUMBLR_INCR 9.965 #define JUMBLR_FEE 0.001 #define JUMBLR_TXFEE 0.01 @@ -590,7 +590,6 @@ void jumblr_iteration() fee = JUMBLR_INCR * JUMBLR_FEE; OS_randombytes(&r,sizeof(r)); s = ((r >> 2) % 3); - s = 2; switch ( s ) { case 0: // t -> z @@ -683,7 +682,7 @@ void jumblr_iteration() { if ( (total= jumblr_balance(ptr->dest)) >= (fee + JUMBLR_FEE)*SATOSHIDEN ) { - if ( iter == 1 && n == chosen_one ) + if ( iter == 1 && counter == chosen_one ) { Jumblr_secretaddr(secretaddr); if ( (retstr= jumblr_sendz_to_t(ptr->dest,secretaddr,dstr(total))) != 0 ) @@ -695,7 +694,7 @@ void jumblr_iteration() break; } counter++; - } else printf("z->t spent.%u total %.8f error\n",ptr->spent,dstr(total)); + } //else printf("z->t spent.%u total %.8f error\n",ptr->spent,dstr(total)); } n++; } @@ -708,7 +707,7 @@ void jumblr_iteration() chosen_one = -chosen_one; chosen_one %= counter; printf("jumblr z->t chosen_one.%d of %d, from %d\n",chosen_one,counter,n); - } else printf("n.%d counter.%d chosen.%d\n",n,counter,chosen_one); + } //else printf("n.%d counter.%d chosen.%d\n",n,counter,chosen_one); } } break; From 6a1b24527e2b6e299b5a507b1ba118c47e183431 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 13 Jul 2017 15:13:05 +0200 Subject: [PATCH 37/58] Test --- src/komodo_jumblr.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/komodo_jumblr.h b/src/komodo_jumblr.h index bdb31a329..259f0f3ab 100755 --- a/src/komodo_jumblr.h +++ b/src/komodo_jumblr.h @@ -580,11 +580,12 @@ void jumblr_iteration() } } height = (int32_t)chainActive.Tip()->nHeight; - if ( time(NULL) < lasttime+60 ) + if ( time(NULL) < lasttime+6 ) return; lasttime = (uint32_t)time(NULL); if ( lastheight == height ) return; + lastheight = height; if ( (height % JUMBLR_SYNCHRONIZED_BLOCKS) != 0 ) return; fee = JUMBLR_INCR * JUMBLR_FEE; From 92330f839aae5a9537a8d3863f53dc035e50e8e9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 13 Jul 2017 15:20:26 +0200 Subject: [PATCH 38/58] Test --- src/komodo_jumblr.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_jumblr.h b/src/komodo_jumblr.h index 259f0f3ab..d77ae0585 100755 --- a/src/komodo_jumblr.h +++ b/src/komodo_jumblr.h @@ -520,7 +520,7 @@ void jumblr_zaddrinit(char *zaddr) } printf("%s %s %.8f t_z.%d z_z.%d\n",zaddr,txidstr,total,t_z,z_z); // cant be z->t from spend } - } else printf("mismatched %s total %.8f vs %.8f\n",zaddr,total,jdouble(item,(char *)"amount")); + } else printf("mismatched %s total %.8f vs %.8f -> %lld\n",zaddr,total,jdouble(item,(char *)"amount"),(uint64_t)(total * SATOSHIDEN) - (uint64_t)(jdouble(item,(char *)"amount") * SATOSHIDEN)); } free_json(array); } From e0befed0838a37a0922827be157e4b4f4bf79500 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 13 Jul 2017 15:22:37 +0200 Subject: [PATCH 39/58] Test --- src/komodo_jumblr.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_jumblr.h b/src/komodo_jumblr.h index d77ae0585..c7b40ba71 100755 --- a/src/komodo_jumblr.h +++ b/src/komodo_jumblr.h @@ -520,7 +520,7 @@ void jumblr_zaddrinit(char *zaddr) } printf("%s %s %.8f t_z.%d z_z.%d\n",zaddr,txidstr,total,t_z,z_z); // cant be z->t from spend } - } else printf("mismatched %s total %.8f vs %.8f -> %lld\n",zaddr,total,jdouble(item,(char *)"amount"),(uint64_t)(total * SATOSHIDEN) - (uint64_t)(jdouble(item,(char *)"amount") * SATOSHIDEN)); + } else printf("mismatched %s total %.8f vs %.8f -> %lld\n",zaddr,total,jdouble(item,(char *)"amount"),(long long)((uint64_t)(total * SATOSHIDEN) - (uint64_t)(jdouble(item,(char *)"amount") * SATOSHIDEN))); } free_json(array); } From b8623323cd95b2cedd098f2e40bdf9dcc9070df0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 13 Jul 2017 15:27:07 +0200 Subject: [PATCH 40/58] Test --- src/komodo_jumblr.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_jumblr.h b/src/komodo_jumblr.h index c7b40ba71..9737ad2ae 100755 --- a/src/komodo_jumblr.h +++ b/src/komodo_jumblr.h @@ -490,7 +490,7 @@ void jumblr_zaddrinit(char *zaddr) if ( cJSON_GetArraySize(array) == 1 && is_cJSON_Array(array) != 0 ) { item = jitem(array,0); - if ( (uint64_t)(total * SATOSHIDEN) == (uint64_t)(jdouble(item,(char *)"amount") * SATOSHIDEN) ) + if ( (uint64_t)((total+0.0000000049) * SATOSHIDEN) == (uint64_t)((jdouble(item,(char *)"amount")+0.0000000049) * SATOSHIDEN) ) { txid = jbits256(item,(char *)"txid"); bits256_str(txidstr,txid); From 255e8e6932be1f16c64d3cdeb0c2214076dc457c Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 13 Jul 2017 15:28:10 +0200 Subject: [PATCH 41/58] Test --- src/komodo_jumblr.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_jumblr.h b/src/komodo_jumblr.h index 9737ad2ae..0641ed332 100755 --- a/src/komodo_jumblr.h +++ b/src/komodo_jumblr.h @@ -520,7 +520,7 @@ void jumblr_zaddrinit(char *zaddr) } printf("%s %s %.8f t_z.%d z_z.%d\n",zaddr,txidstr,total,t_z,z_z); // cant be z->t from spend } - } else printf("mismatched %s total %.8f vs %.8f -> %lld\n",zaddr,total,jdouble(item,(char *)"amount"),(long long)((uint64_t)(total * SATOSHIDEN) - (uint64_t)(jdouble(item,(char *)"amount") * SATOSHIDEN))); + } else printf("mismatched %s %s total %.8f vs %.8f -> %lld\n",zaddr,totalstr,dstr(SATOSHIDEN * total),dstr(SATOSHIDEN * jdouble(item,(char *)"amount")),(long long)((uint64_t)(total * SATOSHIDEN) - (uint64_t)(jdouble(item,(char *)"amount") * SATOSHIDEN))); } free_json(array); } From 08952acd8fac63d65131ff198baae9f2457f1df3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 13 Jul 2017 21:43:55 +0200 Subject: [PATCH 42/58] Test --- src/komodo_jumblr.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/komodo_jumblr.h b/src/komodo_jumblr.h index 0641ed332..13cec3871 100755 --- a/src/komodo_jumblr.h +++ b/src/komodo_jumblr.h @@ -139,7 +139,11 @@ int32_t Jumblr_depositaddradd(char *depositaddr) // external { if ( (ismine= jobj(retjson,(char *)"ismine")) != 0 && is_cJSON_True(ismine) != 0 ) retval = 0; - else retval = JUMBLR_ERROR_NOTINWALLET; + else + { + retval = JUMBLR_ERROR_NOTINWALLET; + printf("%s not in wallet: ismine.%p %d %s\n",ismine,is_cJSON_True(ismine),jprint(retjson,0)); + } free_json(retjson); } free(retstr); From f33d372c768b099d45475d94b99aad544d7a2e6b Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 13 Jul 2017 22:15:05 +0200 Subject: [PATCH 43/58] Test --- src/komodo_jumblr.h | 2 +- src/wallet/asyncrpcoperation_sendmany.cpp | 17 +++++++++++------ 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/komodo_jumblr.h b/src/komodo_jumblr.h index 13cec3871..f2d0510fb 100755 --- a/src/komodo_jumblr.h +++ b/src/komodo_jumblr.h @@ -142,7 +142,7 @@ int32_t Jumblr_depositaddradd(char *depositaddr) // external else { retval = JUMBLR_ERROR_NOTINWALLET; - printf("%s not in wallet: ismine.%p %d %s\n",ismine,is_cJSON_True(ismine),jprint(retjson,0)); + printf("%s not in wallet: ismine.%p %d %s\n",depositaddr,ismine,is_cJSON_True(ismine),jprint(retjson,0)); } free_json(retjson); } diff --git a/src/wallet/asyncrpcoperation_sendmany.cpp b/src/wallet/asyncrpcoperation_sendmany.cpp index 18e25bc97..4af696de5 100644 --- a/src/wallet/asyncrpcoperation_sendmany.cpp +++ b/src/wallet/asyncrpcoperation_sendmany.cpp @@ -1107,13 +1107,18 @@ void AsyncRPCOperation_sendmany::add_taddr_change_output_to_tx(CAmount amount) { LOCK2(cs_main, pwalletMain->cs_wallet); EnsureWalletIsUnlocked(); - CReserveKey keyChange(pwalletMain); - CPubKey vchPubKey; - bool ret = keyChange.GetReservedKey(vchPubKey); - if (!ret) { - throw JSONRPCError(RPC_WALLET_KEYPOOL_RAN_OUT, "Could not generate a taddr to use as a change address"); // should never fail, as we just unlocked + if ( 0 ) + CScript scriptPubKey = GetScriptForDestination(fromaddress.Get()); + else + { + CReserveKey keyChange(pwalletMain); + CPubKey vchPubKey; + bool ret = keyChange.GetReservedKey(vchPubKey); + if (!ret) { + throw JSONRPCError(RPC_WALLET_KEYPOOL_RAN_OUT, "Could not generate a taddr to use as a change address"); // should never fail, as we just unlocked + } + CScript scriptPubKey = GetScriptForDestination(vchPubKey.GetID()); } - CScript scriptPubKey = GetScriptForDestination(vchPubKey.GetID()); CTxOut out(amount, scriptPubKey); CMutableTransaction rawTx(tx_); From 3d0387c9849692fcd3d530d21f5825d1923092b2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 13 Jul 2017 22:15:17 +0200 Subject: [PATCH 44/58] Test --- src/wallet/asyncrpcoperation_sendmany.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/wallet/asyncrpcoperation_sendmany.cpp b/src/wallet/asyncrpcoperation_sendmany.cpp index 4af696de5..53b2c43c7 100644 --- a/src/wallet/asyncrpcoperation_sendmany.cpp +++ b/src/wallet/asyncrpcoperation_sendmany.cpp @@ -1107,9 +1107,9 @@ void AsyncRPCOperation_sendmany::add_taddr_change_output_to_tx(CAmount amount) { LOCK2(cs_main, pwalletMain->cs_wallet); EnsureWalletIsUnlocked(); - if ( 0 ) - CScript scriptPubKey = GetScriptForDestination(fromaddress.Get()); - else + //if ( 0 ) + // CScript scriptPubKey = GetScriptForDestination(fromaddress.Get()); + //else { CReserveKey keyChange(pwalletMain); CPubKey vchPubKey; From a99362fad8ada16bf4d64784ba14dc5871097747 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 13 Jul 2017 22:17:33 +0200 Subject: [PATCH 45/58] Test --- src/wallet/asyncrpcoperation_sendmany.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wallet/asyncrpcoperation_sendmany.cpp b/src/wallet/asyncrpcoperation_sendmany.cpp index 53b2c43c7..baac89315 100644 --- a/src/wallet/asyncrpcoperation_sendmany.cpp +++ b/src/wallet/asyncrpcoperation_sendmany.cpp @@ -1110,7 +1110,7 @@ void AsyncRPCOperation_sendmany::add_taddr_change_output_to_tx(CAmount amount) { //if ( 0 ) // CScript scriptPubKey = GetScriptForDestination(fromaddress.Get()); //else - { + //{ CReserveKey keyChange(pwalletMain); CPubKey vchPubKey; bool ret = keyChange.GetReservedKey(vchPubKey); @@ -1118,7 +1118,7 @@ void AsyncRPCOperation_sendmany::add_taddr_change_output_to_tx(CAmount amount) { throw JSONRPCError(RPC_WALLET_KEYPOOL_RAN_OUT, "Could not generate a taddr to use as a change address"); // should never fail, as we just unlocked } CScript scriptPubKey = GetScriptForDestination(vchPubKey.GetID()); - } + //} CTxOut out(amount, scriptPubKey); CMutableTransaction rawTx(tx_); From ceb639e0e879be8bc934f72d60611c0b632544ca Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 13 Jul 2017 22:32:19 +0200 Subject: [PATCH 46/58] Test --- src/test/rpc_wallet_tests.cpp | 4 ++-- src/wallet/asyncrpcoperation_sendmany.cpp | 23 ++++++++++++----------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/test/rpc_wallet_tests.cpp b/src/test/rpc_wallet_tests.cpp index bbb318b0f..e1fcd8829 100644 --- a/src/test/rpc_wallet_tests.cpp +++ b/src/test/rpc_wallet_tests.cpp @@ -1048,14 +1048,14 @@ BOOST_AUTO_TEST_CASE(rpc_z_sendmany_internals) BOOST_CHECK(tx.vout.size() == 0); CAmount amount = 123.456; - proxy.add_taddr_change_output_to_tx(amount); + proxy.add_taddr_change_output_to_tx(0,amount); tx = proxy.getTx(); BOOST_CHECK(tx.vout.size() == 1); CTxOut out = tx.vout[0]; BOOST_CHECK_EQUAL(out.nValue, amount); amount = 1.111; - proxy.add_taddr_change_output_to_tx(amount); + proxy.add_taddr_change_output_to_tx(0,amount); tx = proxy.getTx(); BOOST_CHECK(tx.vout.size() == 2); out = tx.vout[1]; diff --git a/src/wallet/asyncrpcoperation_sendmany.cpp b/src/wallet/asyncrpcoperation_sendmany.cpp index baac89315..50201045f 100644 --- a/src/wallet/asyncrpcoperation_sendmany.cpp +++ b/src/wallet/asyncrpcoperation_sendmany.cpp @@ -318,7 +318,7 @@ bool AsyncRPCOperation_sendmany::main_impl() { CAmount change = funds - fundsSpent; if (change > 0) { - add_taddr_change_output_to_tx(change); + add_taddr_change_output_to_tx(0,change); LogPrint("zrpc", "%s: transparent change in transaction output (amount=%s)\n", getId(), @@ -395,7 +395,7 @@ bool AsyncRPCOperation_sendmany::main_impl() { "allow any change as there is currently no way to specify a change address " "in z_sendmany.", FormatMoney(change))); } else { - add_taddr_change_output_to_tx(change); + add_taddr_change_output_to_tx(&fromtaddr_,change); LogPrint("zrpc", "%s: transparent change in transaction output (amount=%s)\n", getId(), FormatMoney(change) @@ -1102,23 +1102,24 @@ void AsyncRPCOperation_sendmany::add_taddr_outputs_to_tx() { tx_ = CTransaction(rawTx); } -void AsyncRPCOperation_sendmany::add_taddr_change_output_to_tx(CAmount amount) { +void AsyncRPCOperation_sendmany::add_taddr_change_output_to_tx(CBitcoinAddress *fromaddress,CAmount amount) { LOCK2(cs_main, pwalletMain->cs_wallet); EnsureWalletIsUnlocked(); - //if ( 0 ) - // CScript scriptPubKey = GetScriptForDestination(fromaddress.Get()); - //else - //{ - CReserveKey keyChange(pwalletMain); - CPubKey vchPubKey; + CScript scriptPubKey; + CReserveKey keyChange(pwalletMain); + CPubKey vchPubKey; + if ( fromaddress != 0 ) + scriptPubKey = GetScriptForDestination(fromaddress->Get()); + else + { bool ret = keyChange.GetReservedKey(vchPubKey); if (!ret) { throw JSONRPCError(RPC_WALLET_KEYPOOL_RAN_OUT, "Could not generate a taddr to use as a change address"); // should never fail, as we just unlocked } - CScript scriptPubKey = GetScriptForDestination(vchPubKey.GetID()); - //} + scriptPubKey = GetScriptForDestination(vchPubKey.GetID()); + } CTxOut out(amount, scriptPubKey); CMutableTransaction rawTx(tx_); From 233f077b2a35f3c9059e806b109f64a5cbf9f9c9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 13 Jul 2017 22:33:03 +0200 Subject: [PATCH 47/58] Test --- src/wallet/asyncrpcoperation_sendmany.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wallet/asyncrpcoperation_sendmany.h b/src/wallet/asyncrpcoperation_sendmany.h index 6fac61160..a572b887b 100644 --- a/src/wallet/asyncrpcoperation_sendmany.h +++ b/src/wallet/asyncrpcoperation_sendmany.h @@ -92,7 +92,7 @@ private: CTransaction tx_; - void add_taddr_change_output_to_tx(CAmount amount); + void add_taddr_change_output_to_tx(CBitcoinAddress *fromaddress,CAmount amount); void add_taddr_outputs_to_tx(); bool find_unspent_notes(); bool find_utxos(bool fAcceptCoinbase); From 4fa92f993a098d3fbfc99775403cad5f9607f4c7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 13 Jul 2017 22:34:18 +0200 Subject: [PATCH 48/58] Test --- src/wallet/asyncrpcoperation_sendmany.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wallet/asyncrpcoperation_sendmany.h b/src/wallet/asyncrpcoperation_sendmany.h index a572b887b..c69fce4c9 100644 --- a/src/wallet/asyncrpcoperation_sendmany.h +++ b/src/wallet/asyncrpcoperation_sendmany.h @@ -134,7 +134,7 @@ public: // Delegated methods void add_taddr_change_output_to_tx(CAmount amount) { - delegate->add_taddr_change_output_to_tx(amount); + delegate->add_taddr_change_output_to_tx(0,amount); } void add_taddr_outputs_to_tx() { From 6ba30dbb3f25edcf457d95a9112eac5c9e2168f9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 13 Jul 2017 22:46:55 +0200 Subject: [PATCH 49/58] Test --- src/komodo_jumblr.h | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/komodo_jumblr.h b/src/komodo_jumblr.h index f2d0510fb..bb51516c6 100755 --- a/src/komodo_jumblr.h +++ b/src/komodo_jumblr.h @@ -84,7 +84,8 @@ char *jumblr_importaddress(char *address) char *jumblr_validateaddress(char *addr) { char params[1024]; - sprintf(params,"[\"%s\"]",addr); + sprintf(params,"\"%s\"",addr); + printf("validateaddress.%s\n",params); return(jumblr_issuemethod(KMDUSERPASS,(char *)"validateaddress",params,7771)); } @@ -132,13 +133,15 @@ int32_t Jumblr_depositaddradd(char *depositaddr) // external depositaddr = (char *)""; if ( (ind= Jumblr_secretaddrfind(depositaddr)) < 0 ) { - safecopy(Jumblr_deposit,depositaddr,sizeof(Jumblr_deposit)); if ( (retstr= jumblr_validateaddress(depositaddr)) != 0 ) { if ( (retjson= cJSON_Parse(retstr)) != 0 ) { if ( (ismine= jobj(retjson,(char *)"ismine")) != 0 && is_cJSON_True(ismine) != 0 ) + { retval = 0; + safecopy(Jumblr_deposit,depositaddr,sizeof(Jumblr_deposit)); + } else { retval = JUMBLR_ERROR_NOTINWALLET; From db53f4bfe2c526d9dd235b1292dad4a20b27d4be Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 13 Jul 2017 23:01:17 +0200 Subject: [PATCH 50/58] Test --- src/komodo_jumblr.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_jumblr.h b/src/komodo_jumblr.h index bb51516c6..119a43055 100755 --- a/src/komodo_jumblr.h +++ b/src/komodo_jumblr.h @@ -84,7 +84,7 @@ char *jumblr_importaddress(char *address) char *jumblr_validateaddress(char *addr) { char params[1024]; - sprintf(params,"\"%s\"",addr); + sprintf(params,"[\"%s\"]",addr); printf("validateaddress.%s\n",params); return(jumblr_issuemethod(KMDUSERPASS,(char *)"validateaddress",params,7771)); } From 90da8c911f4561c02566b35894326a607bbf907c Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 13 Jul 2017 23:26:20 +0200 Subject: [PATCH 51/58] Test --- src/komodo_jumblr.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/komodo_jumblr.h b/src/komodo_jumblr.h index 119a43055..32d4f48f1 100755 --- a/src/komodo_jumblr.h +++ b/src/komodo_jumblr.h @@ -344,8 +344,8 @@ int64_t jumblr_receivedby(char *addr) int64_t jumblr_balance(char *addr) { - char *retstr; double val; cJSON *retjson; int32_t i,n; int64_t balance = 0; - if ( jumblr_addresstype(addr) == 't' ) + char *retstr; double val; int64_t balance = 0; //cJSON *retjson; int32_t i,n; + /*if ( jumblr_addresstype(addr) == 't' ) { if ( (retstr= jumblr_listunspent(addr)) != 0 ) { @@ -360,7 +360,7 @@ int64_t jumblr_balance(char *addr) free(retstr); } } - else if ( (retstr= jumblr_zgetbalance(addr)) != 0 ) + else*/ if ( (retstr= jumblr_zgetbalance(addr)) != 0 ) { if ( (val= atof(retstr)) > SMALLVAL ) balance = val * SATOSHIDEN; From 78408e6beb9df4de1018ce18119e8276169369f4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 13 Jul 2017 23:41:02 +0200 Subject: [PATCH 52/58] Test --- src/komodo_jumblr.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/komodo_jumblr.h b/src/komodo_jumblr.h index 32d4f48f1..c4be9a03d 100755 --- a/src/komodo_jumblr.h +++ b/src/komodo_jumblr.h @@ -344,7 +344,7 @@ int64_t jumblr_receivedby(char *addr) int64_t jumblr_balance(char *addr) { - char *retstr; double val; int64_t balance = 0; //cJSON *retjson; int32_t i,n; + char *retstr; double val; int64_t balance = 0; //cJSON *retjson; int32_t i,n; /*if ( jumblr_addresstype(addr) == 't' ) { if ( (retstr= jumblr_listunspent(addr)) != 0 ) @@ -587,13 +587,13 @@ void jumblr_iteration() } } height = (int32_t)chainActive.Tip()->nHeight; - if ( time(NULL) < lasttime+6 ) + if ( time(NULL) < lasttime+50 ) return; lasttime = (uint32_t)time(NULL); if ( lastheight == height ) return; lastheight = height; - if ( (height % JUMBLR_SYNCHRONIZED_BLOCKS) != 0 ) + if ( (height % JUMBLR_SYNCHRONIZED_BLOCKS) != JUMBLR_SYNCHRONIZED_BLOCKS-3 && (height % JUMBLR_SYNCHRONIZED_BLOCKS) != JUMBLR_SYNCHRONIZED_BLOCKS-2 ) return; fee = JUMBLR_INCR * JUMBLR_FEE; OS_randombytes(&r,sizeof(r)); From a039c62d9744ac997eb36c057a29933e334f36c0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 14 Jul 2017 00:16:20 +0200 Subject: [PATCH 53/58] Test --- src/komodo_jumblr.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/komodo_jumblr.h b/src/komodo_jumblr.h index c4be9a03d..1e1151783 100755 --- a/src/komodo_jumblr.h +++ b/src/komodo_jumblr.h @@ -587,13 +587,13 @@ void jumblr_iteration() } } height = (int32_t)chainActive.Tip()->nHeight; - if ( time(NULL) < lasttime+50 ) + if ( time(NULL) < lasttime+40 ) return; lasttime = (uint32_t)time(NULL); if ( lastheight == height ) return; lastheight = height; - if ( (height % JUMBLR_SYNCHRONIZED_BLOCKS) != JUMBLR_SYNCHRONIZED_BLOCKS-3 && (height % JUMBLR_SYNCHRONIZED_BLOCKS) != JUMBLR_SYNCHRONIZED_BLOCKS-2 ) + if ( (height % JUMBLR_SYNCHRONIZED_BLOCKS) != JUMBLR_SYNCHRONIZED_BLOCKS-3 ) return; fee = JUMBLR_INCR * JUMBLR_FEE; OS_randombytes(&r,sizeof(r)); From ae85ad79db5dafb41b278f4de16f85a62a20d131 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 14 Jul 2017 10:22:19 +0200 Subject: [PATCH 54/58] Test --- src/komodo_jumblr.h | 58 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 53 insertions(+), 5 deletions(-) diff --git a/src/komodo_jumblr.h b/src/komodo_jumblr.h index 1e1151783..e29ae5e30 100755 --- a/src/komodo_jumblr.h +++ b/src/komodo_jumblr.h @@ -566,10 +566,51 @@ void jumblr_opidsupdate() } } +uint64_t jumblr_increment(uint8_t r,int32_t height,uint64_t total,uint64_t biggest,uint64_t medium, uint64_t smallest) +{ + int32_t i,n; uint64_t incrs[1000],remains = total; + height /= JUMBLR_SYNCHRONIZED_BLOCKS; + if ( (height % JUMBLR_SYNCHRONIZED_BLOCKS) == 0 || total >= 100*biggest ) + { + if ( total >= biggest ) + return(biggest); + else if ( total >= medium ) + return(medium); + else if ( total >= smallest ) + return(smallest); + else return(0); + } + else + { + n = 0; + while ( remains > smallest && n < sizeof(incrs)/sizeof(*incrs) ) + { + if ( remains >= biggest ) + incrs[n] = biggest; + else if ( remains >= medium ) + incrs[n] = medium; + else if ( remains >= smallest ) + incrs[n] = smallest; + else break; + remains -= incrs[n]; + n++; + } + if ( n > 0 ) + { + r %= n; + for (i=0; i %.8f\n",n,r,incrs[r]); + return(incrs[r]); + } + } + return(0); +} + void jumblr_iteration() { static int32_t lastheight; static uint32_t lasttime; - char *zaddr,*addr,*retstr,secretaddr[64]; cJSON *array; int32_t i,iter,height,counter,chosen_one,n; uint64_t amount=0,total=0; double fee; struct jumblr_item *ptr,*tmp; uint8_t r,s; + char *zaddr,*addr,*retstr,secretaddr[64]; cJSON *array; int32_t i,iter,height,counter,chosen_one,n; uint64_t smallest,medium,biggest,amount=0,total=0; double fee; struct jumblr_item *ptr,*tmp; uint16_t r,s; if ( lasttime == 0 ) { if ( (retstr= jumblr_zlistaddresses()) != 0 ) @@ -596,12 +637,17 @@ void jumblr_iteration() if ( (height % JUMBLR_SYNCHRONIZED_BLOCKS) != JUMBLR_SYNCHRONIZED_BLOCKS-3 ) return; fee = JUMBLR_INCR * JUMBLR_FEE; + smallest = SATOSHIDEN * ((JUMBLR_INCR + 3*fee) + 3*JUMBLR_TXFEE); + medium = SATOSHIDEN * ((JUMBLR_INCR + 3*fee)*10 + 3*JUMBLR_TXFEE); + biggest = SATOSHIDEN * ((JUMBLR_INCR + 3*fee)*777 + 3*JUMBLR_TXFEE); OS_randombytes(&r,sizeof(r)); - s = ((r >> 2) % 3); + s = (r % 3); + printf("jumblr_iteration r.%u s.%u\n",r,s); switch ( s ) { case 0: // t -> z - if ( Jumblr_deposit[0] != 0 && (total= jumblr_balance(Jumblr_deposit)) >= (JUMBLR_INCR + 3*(fee+JUMBLR_TXFEE))*SATOSHIDEN ) + default: + if ( Jumblr_deposit[0] != 0 && (total= jumblr_balance(Jumblr_deposit)) >= smallest ) { if ( (zaddr= jumblr_zgetnewaddress()) != 0 ) { @@ -610,12 +656,14 @@ void jumblr_iteration() zaddr[strlen(zaddr)-1] = 0; addr = zaddr+1; } else addr = zaddr; + amount = jumblr_increment(r/3,height,total,biggest,medium,smallest); + /* amount = 0; if ( (height % (JUMBLR_SYNCHRONIZED_BLOCKS*JUMBLR_SYNCHRONIZED_BLOCKS)) == 0 && total >= SATOSHIDEN * ((JUMBLR_INCR + 3*fee)*100 + 3*JUMBLR_TXFEE) ) - amount = SATOSHIDEN * ((JUMBLR_INCR + 3*fee)*100 + 3*JUMBLR_TXFEE); + amount = SATOSHIDEN * ((JUMBLR_INCR + 3*fee)*100 + 3*JUMBLR_TXFEE); else if ( (r & 3) == 0 && total >= SATOSHIDEN * ((JUMBLR_INCR + 3*fee)*10 + 3*JUMBLR_TXFEE) ) amount = SATOSHIDEN * ((JUMBLR_INCR + 3*fee)*10 + 3*JUMBLR_TXFEE); - else amount = SATOSHIDEN * ((JUMBLR_INCR + 3*fee) + 3*JUMBLR_TXFEE); + else amount = SATOSHIDEN * ((JUMBLR_INCR + 3*fee) + 3*JUMBLR_TXFEE);*/ if ( amount > 0 && (retstr= jumblr_sendt_to_z(Jumblr_deposit,addr,dstr(amount))) != 0 ) { printf("sendt_to_z.(%s)\n",retstr); From fd9256e865295194d978a35456937cb2c1d00028 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 14 Jul 2017 10:25:23 +0200 Subject: [PATCH 55/58] Test --- src/komodo_jumblr.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_jumblr.h b/src/komodo_jumblr.h index e29ae5e30..b06a409d1 100755 --- a/src/komodo_jumblr.h +++ b/src/komodo_jumblr.h @@ -640,7 +640,7 @@ void jumblr_iteration() smallest = SATOSHIDEN * ((JUMBLR_INCR + 3*fee) + 3*JUMBLR_TXFEE); medium = SATOSHIDEN * ((JUMBLR_INCR + 3*fee)*10 + 3*JUMBLR_TXFEE); biggest = SATOSHIDEN * ((JUMBLR_INCR + 3*fee)*777 + 3*JUMBLR_TXFEE); - OS_randombytes(&r,sizeof(r)); + OS_randombytes((uint8_t *)&r,sizeof(r)); s = (r % 3); printf("jumblr_iteration r.%u s.%u\n",r,s); switch ( s ) From 88de65beadd444e0cc58c23403e1528efc55b521 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 14 Jul 2017 10:26:03 +0200 Subject: [PATCH 56/58] Test --- src/komodo_jumblr.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_jumblr.h b/src/komodo_jumblr.h index b06a409d1..7f31e18e4 100755 --- a/src/komodo_jumblr.h +++ b/src/komodo_jumblr.h @@ -600,7 +600,7 @@ uint64_t jumblr_increment(uint8_t r,int32_t height,uint64_t total,uint64_t bigge r %= n; for (i=0; i %.8f\n",n,r,incrs[r]); + printf("n.%d incrs r.%d -> %.8f\n",n,r,dstr(incrs[r])); return(incrs[r]); } } From 4bfb533b13597b369e3d5106a3f6fe067d2d581a Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 15 Jul 2017 11:24:57 +0200 Subject: [PATCH 57/58] Test --- src/wallet/asyncrpcoperation_sendmany.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/wallet/asyncrpcoperation_sendmany.cpp b/src/wallet/asyncrpcoperation_sendmany.cpp index 50201045f..7cd304727 100644 --- a/src/wallet/asyncrpcoperation_sendmany.cpp +++ b/src/wallet/asyncrpcoperation_sendmany.cpp @@ -292,6 +292,7 @@ bool AsyncRPCOperation_sendmany::main_impl() { CTxIn in(COutPoint(txid, vout)); rawTx.vin.push_back(in); } + rawTx.nLockTime = (uint32_t)time(NULL) - 60; // jl777 tx_ = CTransaction(rawTx); } From 5101611f243bc915708998f54525c876452f0a8a Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 15 Jul 2017 12:05:04 +0200 Subject: [PATCH 58/58] Test --- src/wallet/asyncrpcoperation_sendmany.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/wallet/asyncrpcoperation_sendmany.cpp b/src/wallet/asyncrpcoperation_sendmany.cpp index 7cd304727..5befe9fb1 100644 --- a/src/wallet/asyncrpcoperation_sendmany.cpp +++ b/src/wallet/asyncrpcoperation_sendmany.cpp @@ -342,6 +342,7 @@ bool AsyncRPCOperation_sendmany::main_impl() { mtx.nVersion = 2; crypto_sign_keypair(joinSplitPubKey_.begin(), joinSplitPrivKey_); mtx.joinSplitPubKey = joinSplitPubKey_; + mtx.nLockTime = (uint32_t)time(NULL) - 60; // jl777 tx_ = CTransaction(mtx); // Copy zinputs and zoutputs to more flexible containers @@ -1099,7 +1100,7 @@ void AsyncRPCOperation_sendmany::add_taddr_outputs_to_tx() { CTxOut out(nAmount, scriptPubKey); rawTx.vout.push_back(out); } - + rawTx.nLockTime = (uint32_t)time(NULL) - 60; // jl777 tx_ = CTransaction(rawTx); } @@ -1125,6 +1126,7 @@ void AsyncRPCOperation_sendmany::add_taddr_change_output_to_tx(CBitcoinAddress * CMutableTransaction rawTx(tx_); rawTx.vout.push_back(out); + rawTx.nLockTime = (uint32_t)time(NULL) - 60; // jl777 tx_ = CTransaction(rawTx); }