From 84b40e08a2f80ea0114804e3dfc861b8e95f57e8 Mon Sep 17 00:00:00 2001 From: "Jonathan \"Duke\" Leto" Date: Sun, 12 Aug 2018 20:31:45 +0200 Subject: [PATCH 01/74] Start adding tests for rewardsunlock --- qa/rpc-tests/cryptoconditions.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/qa/rpc-tests/cryptoconditions.py b/qa/rpc-tests/cryptoconditions.py index 849d7daea..9e7ddf8e5 100755 --- a/qa/rpc-tests/cryptoconditions.py +++ b/qa/rpc-tests/cryptoconditions.py @@ -207,6 +207,10 @@ class CryptoConditionsTest (BitcoinTestFramework): result = rpc.rewardsaddfunding("STUFF", txid, "100") assert_equal(result['result'], 'success') + fundingtxid = result['hex'] + assert fundingtxid, "got funding txid" + + result = rpc.rewardsunlock("STUFF", fundingtxid) def run_test (self): print("Mining blocks...") From 66027c0219598109a8fa86cddafe9a9bc7f49d80 Mon Sep 17 00:00:00 2001 From: "Jonathan \"Duke\" Leto" Date: Mon, 13 Aug 2018 09:55:17 +0200 Subject: [PATCH 02/74] Add rewards tests --- qa/rpc-tests/cryptoconditions.py | 23 +++++++++++++++++++++-- src/wallet/rpcwallet.cpp | 25 ++++++++++++++++++------- 2 files changed, 39 insertions(+), 9 deletions(-) diff --git a/qa/rpc-tests/cryptoconditions.py b/qa/rpc-tests/cryptoconditions.py index 9e7ddf8e5..845d387b4 100755 --- a/qa/rpc-tests/cryptoconditions.py +++ b/qa/rpc-tests/cryptoconditions.py @@ -184,7 +184,7 @@ class CryptoConditionsTest (BitcoinTestFramework): result = rpc.rewardsinfo("none") assert_equal(result['result'], 'error') - result = rpc.rewardscreatefunding("STUFF", "1000", "5", "1", "10", "10") + result = rpc.rewardscreatefunding("STUFF", "1000", "5", "0", "10", "10") assert result['hex'], 'got raw xtn' txid = rpc.sendrawtransaction(result['hex']) assert txid, 'got txid' @@ -195,7 +195,7 @@ class CryptoConditionsTest (BitcoinTestFramework): assert_equal(result['result'], 'success') assert_equal(result['name'], 'STUFF') assert_equal(result['APR'], "5.00000000") - assert_equal(result['minseconds'], 86400) + assert_equal(result['minseconds'], 0) assert_equal(result['maxseconds'], 864000) assert_equal(result['funding'], "1000.00000000") assert_equal(result['mindeposit'], "10.00000000") @@ -210,7 +210,26 @@ class CryptoConditionsTest (BitcoinTestFramework): fundingtxid = result['hex'] assert fundingtxid, "got funding txid" + # the previous xtn has not been broadcasted yet result = rpc.rewardsunlock("STUFF", fundingtxid) + assert_equal(result['result'], 'error') + + # wrong plan name + result = rpc.rewardsunlock("SHTUFF", fundingtxid) + assert_equal(result['result'], 'error') + + txid = rpc.sendrawtransaction(fundingtxid) + assert txid, 'got txid from sendrawtransaction' + + # confirm the xtn above + rpc.generate(1) + + result = rpc.rewardsunlock("STUFF", fundingtxid) + # currently failing because reward is not > txfee? + # assert_equal(result['result'], 'success') + + result = rpc.rewardslock("STUFF", fundingtxid, "-5") + assert_equal(result['result'], 'error') def run_test (self): print("Mining blocks...") diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 6329d4a52..1654be8ba 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -5003,7 +5003,7 @@ UniValue rewardscreatefunding(const UniValue& params, bool fHelp) UniValue rewardslock(const UniValue& params, bool fHelp) { - UniValue result(UniValue::VOBJ); char *name; uint256 fundingtxid; uint64_t amount; std::string hex; + UniValue result(UniValue::VOBJ); char *name; uint256 fundingtxid; int64_t amount; std::string hex; if ( fHelp || params.size() != 3 ) throw runtime_error("rewardslock name fundingtxid amount\n"); if ( ensure_CCrequirements() < 0 ) @@ -5014,11 +5014,19 @@ UniValue rewardslock(const UniValue& params, bool fHelp) fundingtxid = Parseuint256((char *)params[1].get_str().c_str()); amount = atof(params[2].get_str().c_str()) * COIN; hex = RewardsLock(0,name,fundingtxid,amount); - if ( hex.size() > 0 ) - { - result.push_back(Pair("result", "success")); - result.push_back(Pair("hex", hex)); - } else result.push_back(Pair("error", "couldnt create rewards lock transaction")); + if ( amount > 0 ) { + if ( hex.size() > 0 ) + { + result.push_back(Pair("result", "success")); + result.push_back(Pair("hex", hex)); + } else { + result.push_back(Pair("result", "error")); + result.push_back(Pair("error", "couldnt create rewards lock transaction")); + } + } else { + result.push_back(Pair("result", "error")); + result.push_back(Pair("error", "amount must be positive")); + } return(result); } @@ -5070,7 +5078,10 @@ UniValue rewardsunlock(const UniValue& params, bool fHelp) { result.push_back(Pair("result", "success")); result.push_back(Pair("hex", hex)); - } else result.push_back(Pair("error", "couldnt create rewards unlock transaction")); + } else { + result.push_back(Pair("result", "error")); + result.push_back(Pair("error", "couldnt create rewards unlock transaction")); + } return(result); } From 7300a1c11702b6af5f36733805683fec38aa5b00 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 12 Aug 2018 23:14:56 -1100 Subject: [PATCH 03/74] Constrain dice vins to be for exact plan --- src/cc/dice.cpp | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/src/cc/dice.cpp b/src/cc/dice.cpp index 0b18c1bcc..f084705fd 100644 --- a/src/cc/dice.cpp +++ b/src/cc/dice.cpp @@ -313,18 +313,21 @@ uint256 DiceGetEntropy(CTransaction tx,uint8_t reffuncid) else return(zeroid); } -uint64_t IsDicevout(struct CCcontract_info *cp,const CTransaction& tx,int32_t v) +uint64_t IsDicevout(struct CCcontract_info *cp,const CTransaction& tx,int32_t v,uint64_t refsbits,uint256 reffundingtxid) { - char destaddr[64]; + char destaddr[64]; uint8_t funcid; uint64_t sbits; uint256 fundingtxid,hash,proof; if ( tx.vout[v].scriptPubKey.IsPayToCryptoCondition() != 0 ) { if ( Getscriptaddress(destaddr,tx.vout[v].scriptPubKey) > 0 && strcmp(destaddr,cp->unspendableCCaddr) == 0 ) - return(tx.vout[v].nValue); + { + if ( (numvouts= tx.vout.size()) > 0 && (funcid= DecodeDiceOpRet(tx.GetHash(),tx.vout[numvouts-1].scriptPubKey,sbits,fundingtxid,hash,proof)) != 0 && sbits == refsbits && ((funcid == 'F' && tx.GetHash() == reffundingtxid) || fundingtxid == reffundingtxid) ) + return(tx.vout[v].nValue); + } } return(0); } -int64_t DiceAmounts(uint64_t &inputs,uint64_t &outputs,struct CCcontract_info *cp,Eval *eval,const CTransaction &tx) +int64_t DiceAmounts(uint64_t &inputs,uint64_t &outputs,struct CCcontract_info *cp,Eval *eval,const CTransaction &tx,uint64_t refsbits,uint256 reffundingtxid) { CTransaction vinTx; uint256 hashBlock; int32_t i,numvins,numvouts; uint64_t assetoshis; numvins = tx.vin.size(); @@ -338,7 +341,7 @@ int64_t DiceAmounts(uint64_t &inputs,uint64_t &outputs,struct CCcontract_info *c return eval->Invalid("always should find vin, but didnt"); else { - if ( (assetoshis= IsDicevout(cp,vinTx,tx.vin[i].prevout.n)) != 0 ) + if ( (assetoshis= IsDicevout(cp,vinTx,tx.vin[i].prevout.n,refsbits,reffundingtxid)) != 0 ) inputs += assetoshis; } } @@ -346,7 +349,7 @@ int64_t DiceAmounts(uint64_t &inputs,uint64_t &outputs,struct CCcontract_info *c for (i=0; iInvalid("vin0 or vin1 normal vin for bet"); else if ( tx.vin[1].prevout.hash != tx.vin[2].prevout.hash ) @@ -630,7 +633,7 @@ int64_t DicePlanFunds(uint64_t &entropyval,uint256 &entropytxid,uint64_t refsbit { if ( (funcid == 'F' && reffundingtxid == txid) || reffundingtxid == fundingtxid ) { - if ( refsbits == sbits && (nValue= IsDicevout(cp,tx,vout)) > 10000 && (funcid == 'F' || funcid == 'E' || funcid == 'W' || funcid == 'L' || funcid == 'T') ) + if ( refsbits == sbits && (nValue= IsDicevout(cp,tx,vout,refsbits,reffundingtxid)) > 10000 && (funcid == 'F' || funcid == 'E' || funcid == 'W' || funcid == 'L' || funcid == 'T') ) { fprintf(stderr,"%s.(%c %.8f) ",uint256_str(str,txid),funcid,(double)nValue/COIN); if ( funcid != 'F' && funcid != 'T' ) From 8608399cb542de07ac8fff8270168cb6bc4bd04a Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 12 Aug 2018 23:16:48 -1100 Subject: [PATCH 04/74] Numvouts --- src/cc/dice.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cc/dice.cpp b/src/cc/dice.cpp index f084705fd..05d249a7a 100644 --- a/src/cc/dice.cpp +++ b/src/cc/dice.cpp @@ -315,12 +315,12 @@ uint256 DiceGetEntropy(CTransaction tx,uint8_t reffuncid) uint64_t IsDicevout(struct CCcontract_info *cp,const CTransaction& tx,int32_t v,uint64_t refsbits,uint256 reffundingtxid) { - char destaddr[64]; uint8_t funcid; uint64_t sbits; uint256 fundingtxid,hash,proof; + char destaddr[64]; uint8_t funcid; int32_t numvouts; uint64_t sbits; uint256 fundingtxid,hash,proof; if ( tx.vout[v].scriptPubKey.IsPayToCryptoCondition() != 0 ) { - if ( Getscriptaddress(destaddr,tx.vout[v].scriptPubKey) > 0 && strcmp(destaddr,cp->unspendableCCaddr) == 0 ) + if ( Getscriptaddress(destaddr,tx.vout[v].scriptPubKey) > 0 && strcmp(destaddr,cp->unspendableCCaddr) == 0 && (numvouts= tx.vout.size()) > 0 ) { - if ( (numvouts= tx.vout.size()) > 0 && (funcid= DecodeDiceOpRet(tx.GetHash(),tx.vout[numvouts-1].scriptPubKey,sbits,fundingtxid,hash,proof)) != 0 && sbits == refsbits && ((funcid == 'F' && tx.GetHash() == reffundingtxid) || fundingtxid == reffundingtxid) ) + if ( (funcid= DecodeDiceOpRet(tx.GetHash(),tx.vout[numvouts-1].scriptPubKey,sbits,fundingtxid,hash,proof)) != 0 && sbits == refsbits && ((funcid == 'F' && tx.GetHash() == reffundingtxid) || fundingtxid == reffundingtxid) ) return(tx.vout[v].nValue); } } From a85ad9d32beeaa21f42d15297c6f0ec9f32204ff Mon Sep 17 00:00:00 2001 From: jl777 Date: Sun, 12 Aug 2018 23:22:31 -1100 Subject: [PATCH 05/74] Prevent reporting locked funds as part of reward funds --- src/cc/rewards.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cc/rewards.cpp b/src/cc/rewards.cpp index 198018d58..9314f7c94 100644 --- a/src/cc/rewards.cpp +++ b/src/cc/rewards.cpp @@ -328,11 +328,11 @@ int64_t RewardsPlanFunds(uint64_t refsbits,struct CCcontract_info *cp,CPubKey pk vout = (int32_t)it->first.index; if ( GetTransaction(txid,tx,hashBlock,false) != 0 && tx.vout[vout].scriptPubKey.IsPayToCryptoCondition() != 0 ) { - if ( (funcid= DecodeRewardsOpRet(txid,tx.vout[tx.vout.size()-1].scriptPubKey,sbits,fundingtxid)) != 0 ) + if ( (funcid= DecodeRewardsOpRet(txid,tx.vout[tx.vout.size()-1].scriptPubKey,sbits,fundingtxid)) == 'F' || funcid == 'A' || funcid == 'U' ) { - if ( (funcid == 'F' && reffundingtxid == txid) || reffundingtxid == fundingtxid ) + if ( refsbits == sbits && (funcid == 'F' && reffundingtxid == txid) || reffundingtxid == fundingtxid ) { - if ( refsbits == sbits && (nValue= IsRewardsvout(cp,tx,vout,sbits,fundingtxid)) > 0 ) + if ( (nValue= IsRewardsvout(cp,tx,vout,sbits,fundingtxid)) > 0 ) totalinputs += nValue; else fprintf(stderr,"refsbits.%llx sbits.%llx nValue %.8f\n",(long long)refsbits,(long long)sbits,(double)nValue/COIN); } //else fprintf(stderr,"else case\n"); From 944aed48a8aeb85c33524b93c9b16c55f2e95491 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 13 Aug 2018 03:12:15 -1100 Subject: [PATCH 06/74] Test --- src/cc/dice.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/cc/dice.cpp b/src/cc/dice.cpp index 05d249a7a..94495cc4b 100644 --- a/src/cc/dice.cpp +++ b/src/cc/dice.cpp @@ -591,9 +591,12 @@ uint64_t AddDiceInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPubK continue; if ( GetTransaction(txid,tx,hashBlock,false) != 0 && tx.vout.size() > 0 && tx.vout[vout].scriptPubKey.IsPayToCryptoCondition() != 0 && myIsutxo_spentinmempool(txid,vout) == 0 ) { - if ( (funcid= DecodeDiceOpRet(txid,tx.vout[tx.vout.size()-1].scriptPubKey,sbits,fundingtxid,hash,proof)) != 0 && sbits == refsbits ) + if ( (funcid= DecodeDiceOpRet(txid,tx.vout[tx.vout.size()-1].scriptPubKey,sbits,fundingtxid,hash,proof)) != 0 ) { - if ( (funcid == 'F' && reffundingtxid == txid) || reffundingtxid == fundingtxid ) + char str[65],sstr[16]; + unstringbits(sstr,sbits); + fprintf(stderr,"(%c) %.8f %s %s\n",fundsflag,funcid,(double)tx.vout[0].nValue/COIN,sstr,uint256_str(str,txid)); + if ( sbits == refsbits && (funcid == 'F' && reffundingtxid == txid) || reffundingtxid == fundingtxid ) { if ( funcid == 'F' || funcid == 'E' || funcid == 'W' || funcid == 'L' || funcid == 'T' ) { From a4a96df9e5d0e22ad10758acf536571ec64c8e61 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 13 Aug 2018 03:15:16 -1100 Subject: [PATCH 07/74] Skip adding CC vin if CCchange is big enough --- src/cc/dice.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cc/dice.cpp b/src/cc/dice.cpp index 94495cc4b..0e1ebe9cb 100644 --- a/src/cc/dice.cpp +++ b/src/cc/dice.cpp @@ -905,7 +905,7 @@ std::string DiceBet(uint64_t txfee,char *planstr,uint256 fundingtxid,int64_t bet std::string DiceBetFinish(int32_t *resultp,uint64_t txfee,char *planstr,uint256 fundingtxid,uint256 bettxid,int32_t winlosetimeout) { - CMutableTransaction mtx; CScript scriptPubKey,fundingPubKey; CTransaction betTx,entropyTx; uint256 hentropyproof,entropytxid,hashBlock,bettorentropy,entropy,hentropy; CPubKey mypk,dicepk,fundingpk; struct CCcontract_info *cp,C; int64_t inputs,CCchange=0,odds,fundsneeded,minbet,maxbet,maxodds,timeoutblocks; uint8_t funcid=0; int32_t iswin=0; uint64_t entropyval,sbits; + CMutableTransaction mtx; CScript scriptPubKey,fundingPubKey; CTransaction betTx,entropyTx; uint256 hentropyproof,entropytxid,hashBlock,bettorentropy,entropy,hentropy; CPubKey mypk,dicepk,fundingpk; struct CCcontract_info *cp,C; int64_t inputs=0,CCchange=0,odds,fundsneeded,minbet,maxbet,maxodds,timeoutblocks; uint8_t funcid=0; int32_t iswin=0; uint64_t entropyval,sbits; *resultp = 0; //char str[65]; fprintf(stderr,"DiceBetFinish.%s %s\n",planstr,uint256_str(str,bettxid)); if ( (cp= Diceinit(fundingPubKey,fundingtxid,&C,planstr,txfee,mypk,dicepk,sbits,minbet,maxbet,maxodds,timeoutblocks)) == 0 ) @@ -970,7 +970,7 @@ std::string DiceBetFinish(int32_t *resultp,uint64_t txfee,char *planstr,uint256 } CCchange = betTx.vout[0].nValue; fundsneeded = txfee + odds*betTx.vout[1].nValue; - if ( (inputs= AddDiceInputs(cp,mtx,dicepk,fundsneeded,60,sbits,fundingtxid)) > 0 ) + if ( CCchange >= fundsneeded || (inputs= AddDiceInputs(cp,mtx,dicepk,fundsneeded,60,sbits,fundingtxid)) > 0 ) { if ( inputs > fundsneeded ) CCchange += (inputs - fundsneeded); From a5a2c7cb3a1faa4fbf615be6b0c2c06ab0879baf Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 13 Aug 2018 03:16:59 -1100 Subject: [PATCH 08/74] Test --- src/cc/dice.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/dice.cpp b/src/cc/dice.cpp index 0e1ebe9cb..b00044040 100644 --- a/src/cc/dice.cpp +++ b/src/cc/dice.cpp @@ -595,7 +595,7 @@ uint64_t AddDiceInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPubK { char str[65],sstr[16]; unstringbits(sstr,sbits); - fprintf(stderr,"(%c) %.8f %s %s\n",fundsflag,funcid,(double)tx.vout[0].nValue/COIN,sstr,uint256_str(str,txid)); + fprintf(stderr,"(%c) %.8f %s %s\n",funcid,(double)tx.vout[0].nValue/COIN,sstr,uint256_str(str,txid)); if ( sbits == refsbits && (funcid == 'F' && reffundingtxid == txid) || reffundingtxid == fundingtxid ) { if ( funcid == 'F' || funcid == 'E' || funcid == 'W' || funcid == 'L' || funcid == 'T' ) From cb2ee04b3528e91ac6da2acf4789609a25823088 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 13 Aug 2018 05:46:11 -1100 Subject: [PATCH 09/74] Fix dice finish --- src/cc/dice.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/dice.cpp b/src/cc/dice.cpp index b00044040..62a7d1046 100644 --- a/src/cc/dice.cpp +++ b/src/cc/dice.cpp @@ -970,7 +970,7 @@ std::string DiceBetFinish(int32_t *resultp,uint64_t txfee,char *planstr,uint256 } CCchange = betTx.vout[0].nValue; fundsneeded = txfee + odds*betTx.vout[1].nValue; - if ( CCchange >= fundsneeded || (inputs= AddDiceInputs(cp,mtx,dicepk,fundsneeded,60,sbits,fundingtxid)) > 0 ) + if ( CCchange >= fundsneeded+betTx.vout[1].nValue || (inputs= AddDiceInputs(cp,mtx,dicepk,fundsneeded,60,sbits,fundingtxid)) > 0 ) { if ( inputs > fundsneeded ) CCchange += (inputs - fundsneeded); From 6e78d3df436e838c13b190a8a116bda379b9d7c1 Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 13 Aug 2018 21:06:49 -1100 Subject: [PATCH 10/74] KOMODO_MININGTHREADS to control staking vs PoW, delay start mining by 15 seconds --- src/komodo_globals.h | 2 +- src/komodo_utils.h | 3 +++ src/miner.cpp | 12 ++++++------ src/rpcmining.cpp | 7 ++++++- 4 files changed, 16 insertions(+), 8 deletions(-) diff --git a/src/komodo_globals.h b/src/komodo_globals.h index c4ba26eb6..86c168a85 100644 --- a/src/komodo_globals.h +++ b/src/komodo_globals.h @@ -45,7 +45,7 @@ struct komodo_state KOMODO_STATES[34]; #define _COINBASE_MATURITY 100 int COINBASE_MATURITY = _COINBASE_MATURITY;//100; -int32_t IS_KOMODO_NOTARY,USE_EXTERNAL_PUBKEY,KOMODO_CHOSEN_ONE,ASSETCHAINS_SEED,KOMODO_ON_DEMAND,KOMODO_EXTERNAL_NOTARIES,KOMODO_PASSPORT_INITDONE,KOMODO_PAX,KOMODO_EXCHANGEWALLET,KOMODO_REWIND; +int32_t KOMODO_MININGTHREADS = -1,IS_KOMODO_NOTARY,USE_EXTERNAL_PUBKEY,KOMODO_CHOSEN_ONE,ASSETCHAINS_SEED,KOMODO_ON_DEMAND,KOMODO_EXTERNAL_NOTARIES,KOMODO_PASSPORT_INITDONE,KOMODO_PAX,KOMODO_EXCHANGEWALLET,KOMODO_REWIND; int32_t KOMODO_INSYNC,KOMODO_LASTMINED,prevKOMODO_LASTMINED,JUMBLR_PAUSE = 1; std::string NOTARY_PUBKEY,ASSETCHAINS_NOTARIES,ASSETCHAINS_OVERRIDE_PUBKEY,DONATION_PUBKEY; uint8_t NOTARY_PUBKEY33[33],ASSETCHAINS_OVERRIDE_PUBKEY33[33],ASSETCHAINS_PUBLIC,ASSETCHAINS_PRIVATE; diff --git a/src/komodo_utils.h b/src/komodo_utils.h index 747a43b72..8269ee206 100644 --- a/src/komodo_utils.h +++ b/src/komodo_utils.h @@ -1505,6 +1505,9 @@ void komodo_args(char *argv0) extern const char *Notaries_elected1[][2]; std::string name,addn; char *dirname,fname[512],arg0str[64],magicstr[9]; uint8_t magic[4],extrabuf[256],*extraptr=0; FILE *fp; uint64_t val; uint16_t port; int32_t i,baseid,len,n,extralen = 0; IS_KOMODO_NOTARY = GetBoolArg("-notary", false); + if ( GetBoolArg("-gen", false) != 0 ) + KOMODO_MININGTHREADS = GetArg("-genproclimit",1); + else KOMODO_MININGTHREADS = 0; if ( (KOMODO_EXCHANGEWALLET= GetBoolArg("-exchange", false)) != 0 ) fprintf(stderr,"KOMODO_EXCHANGEWALLET mode active\n"); DONATION_PUBKEY = GetArg("-donation", ""); diff --git a/src/miner.cpp b/src/miner.cpp index fb2eb2d05..874c1b4f8 100644 --- a/src/miner.cpp +++ b/src/miner.cpp @@ -106,7 +106,7 @@ void UpdateTime(CBlockHeader* pblock, const Consensus::Params& consensusParams, #include "komodo_defs.h" -extern int32_t KOMODO_LONGESTCHAIN,ASSETCHAINS_SEED,IS_KOMODO_NOTARY,USE_EXTERNAL_PUBKEY,KOMODO_CHOSEN_ONE,ASSETCHAIN_INIT,KOMODO_INITDONE,KOMODO_ON_DEMAND,KOMODO_INITDONE,KOMODO_PASSPORT_INITDONE; +extern int32_t KOMODO_MININGTHREADS,KOMODO_LONGESTCHAIN,ASSETCHAINS_SEED,IS_KOMODO_NOTARY,USE_EXTERNAL_PUBKEY,KOMODO_CHOSEN_ONE,ASSETCHAIN_INIT,KOMODO_INITDONE,KOMODO_ON_DEMAND,KOMODO_INITDONE,KOMODO_PASSPORT_INITDONE; extern uint64_t ASSETCHAINS_REWARD,ASSETCHAINS_COMMISSION,ASSETCHAINS_STAKED; extern char ASSETCHAINS_SYMBOL[KOMODO_ASSETCHAIN_MAXLEN]; extern std::string NOTARY_PUBKEY,ASSETCHAINS_OVERRIDE_PUBKEY; @@ -393,7 +393,7 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn,int32_t gpucount) //pblock->nTime = blocktime + 1; pblock->nBits = GetNextWorkRequired(pindexPrev, pblock, Params().GetConsensus()); //LogPrintf("CreateNewBlock(): total size %u blocktime.%u nBits.%08x\n", nBlockSize,blocktime,pblock->nBits); - if ( ASSETCHAINS_SYMBOL[0] != 0 && ASSETCHAINS_STAKED != 0 && GetArg("-genproclimit", 0) == 0 ) + if ( ASSETCHAINS_SYMBOL[0] != 0 && ASSETCHAINS_STAKED != 0 && KOMODO_MININGTHREADS == 0 ) { uint64_t txfees,utxovalue; uint32_t txtime; uint256 utxotxid,revtxid; int32_t i,siglen,numsigs,utxovout; uint8_t utxosig[128],*ptr; CMutableTransaction txStaked = CreateNewContextualCMutableTransaction(Params().GetConsensus(), chainActive.Height() + 1); @@ -453,7 +453,7 @@ CBlockTemplate* CreateNewBlock(const CScript& scriptPubKeyIn,int32_t gpucount) // Fill in header pblock->hashPrevBlock = pindexPrev->GetBlockHash(); pblock->hashReserved = uint256(); - if ( ASSETCHAINS_SYMBOL[0] == 0 || ASSETCHAINS_STAKED == 0 || GetArg("-genproclimit", 0) > 0 ) + if ( ASSETCHAINS_SYMBOL[0] == 0 || ASSETCHAINS_STAKED == 0 || KOMODO_MININGTHREADS > 0 ) { UpdateTime(pblock, Params().GetConsensus(), pindexPrev); pblock->nBits = GetNextWorkRequired(pindexPrev, pblock, Params().GetConsensus()); @@ -788,7 +788,7 @@ void static BitcoinMiner() } if (!fvNodesEmpty )//&& !IsInitialBlockDownload()) break; - MilliSleep(5000); + MilliSleep(15000); //fprintf(stderr,"fvNodesEmpty %d IsInitialBlockDownload(%s) %d\n",(int32_t)fvNodesEmpty,ASSETCHAINS_SYMBOL,(int32_t)IsInitialBlockDownload()); } while (true); @@ -950,7 +950,7 @@ void static BitcoinMiner() // (x_1, x_2, ...) = A(I, V, n, k) LogPrint("pow", "Running Equihash solver \"%s\" with nNonce = %s\n",solver, pblock->nNonce.ToString()); arith_uint256 hashTarget; - if ( GetArg("-genproclimit", 0) > 0 && ASSETCHAINS_STAKED > 0 && ASSETCHAINS_STAKED < 100 && Mining_height > 10 ) + if ( KOMODO_MININGTHREADS > 0 && ASSETCHAINS_STAKED > 0 && ASSETCHAINS_STAKED < 100 && Mining_height > 10 ) hashTarget = HASHTarget_POW; else hashTarget = HASHTarget; std::function)> validBlock = @@ -978,7 +978,7 @@ void static BitcoinMiner() fprintf(stderr," POW\n");*/ if ( h > hashTarget ) { - //if ( ASSETCHAINS_STAKED != 0 && GetArg("-genproclimit", 0) == 0 ) + //if ( ASSETCHAINS_STAKED != 0 && KOMODO_MININGTHREADS == 0 ) // sleep(1); return false; } diff --git a/src/rpcmining.cpp b/src/rpcmining.cpp index 4c4d2eed5..df58a5573 100644 --- a/src/rpcmining.cpp +++ b/src/rpcmining.cpp @@ -33,6 +33,7 @@ using namespace std; extern uint64_t ASSETCHAINS_STAKED; +extern int32_t KOMODO_MININGTHREADS; arith_uint256 komodo_PoWtarget(int32_t *percPoSp,arith_uint256 target,int32_t height,int32_t goalperc); /** @@ -327,6 +328,9 @@ UniValue setgenerate(const UniValue& params, bool fHelp) mapArgs["-gen"] = (fGenerate ? "1" : "0"); mapArgs ["-genproclimit"] = itostr(nGenProcLimit); + if ( fGenerate == 0 ) + KOMODO_MININGTHREADS = -1; + else KOMODO_MININGTHREADS = (int32_t)nGenProcLimit; #ifdef ENABLE_WALLET GenerateBitcoins(fGenerate, pwalletMain, nGenProcLimit); #else @@ -382,6 +386,7 @@ UniValue getmininginfo(const UniValue& params, bool fHelp) obj.push_back(Pair("chain", Params().NetworkIDString())); #ifdef ENABLE_MINING obj.push_back(Pair("generate", getgenerate(params, false))); + obj.push_back(Pair("numthreads", (int64_t)KOMODO_MININGTHREADS)); #endif return obj; } @@ -647,7 +652,7 @@ UniValue getblocktemplate(const UniValue& params, bool fHelp) pblocktemplate = CreateNewBlockWithKey(); #endif if (!pblocktemplate) - throw JSONRPCError(RPC_OUT_OF_MEMORY, "Out of memory"); + throw JSONRPCError(RPC_OUT_OF_MEMORY, "Out of memory or no available utxo for staking"); // Need to update only after we know CreateNewBlockWithKey succeeded pindexPrev = pindexPrevNew; From 9b940331f9f20cefe1f635bc21c493be9e96aa1b Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 13 Aug 2018 21:31:14 -1100 Subject: [PATCH 11/74] Add segid to get block --- src/rpcblockchain.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index b76698917..c9e94438c 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -121,6 +121,7 @@ UniValue blockheaderToJSON(const CBlockIndex* blockindex) result.push_back(Pair("bits", strprintf("%08x", blockindex->nBits))); result.push_back(Pair("difficulty", GetDifficulty(blockindex))); result.push_back(Pair("chainwork", blockindex->nChainWork.GetHex())); + result.push_back(Pair("segid", (int64_t)blockindex->segid)); if (blockindex->pprev) result.push_back(Pair("previousblockhash", blockindex->pprev->GetBlockHash().GetHex())); From a4885032666a7512fa0c2f7145bff0ff18cf3dbd Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 13 Aug 2018 21:37:46 -1100 Subject: [PATCH 12/74] Test --- src/rpcblockchain.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index c9e94438c..d870ad75e 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -147,6 +147,7 @@ UniValue blockToDeltasJSON(const CBlock& block, const CBlockIndex* blockindex) result.push_back(Pair("height", blockindex->nHeight)); result.push_back(Pair("version", block.nVersion)); result.push_back(Pair("merkleroot", block.hashMerkleRoot.GetHex())); + result.push_back(Pair("segid", (int64_t)blockindex->segid)); UniValue deltas(UniValue::VARR); @@ -263,6 +264,7 @@ UniValue blockToJSON(const CBlock& block, const CBlockIndex* blockindex, bool tx result.push_back(Pair("height", blockindex->nHeight)); result.push_back(Pair("version", block.nVersion)); result.push_back(Pair("merkleroot", block.hashMerkleRoot.GetHex())); + result.push_back(Pair("segid", (int64_t)blockindex->segid)); UniValue txs(UniValue::VARR); BOOST_FOREACH(const CTransaction&tx, block.vtx) { From 99c3975dcb84493caddc11ffd0ef667595da850b Mon Sep 17 00:00:00 2001 From: jl777 Date: Mon, 13 Aug 2018 23:00:06 -1100 Subject: [PATCH 13/74] Set default KOMODO_MININGTHREADS <= -1 --- src/komodo_utils.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_utils.h b/src/komodo_utils.h index 8269ee206..616f7ecaa 100644 --- a/src/komodo_utils.h +++ b/src/komodo_utils.h @@ -1507,7 +1507,7 @@ void komodo_args(char *argv0) IS_KOMODO_NOTARY = GetBoolArg("-notary", false); if ( GetBoolArg("-gen", false) != 0 ) KOMODO_MININGTHREADS = GetArg("-genproclimit",1); - else KOMODO_MININGTHREADS = 0; + else KOMODO_MININGTHREADS = -1; if ( (KOMODO_EXCHANGEWALLET= GetBoolArg("-exchange", false)) != 0 ) fprintf(stderr,"KOMODO_EXCHANGEWALLET mode active\n"); DONATION_PUBKEY = GetArg("-donation", ""); From 0e03d55920f323544b9f69b2852f05e245f98090 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 14 Aug 2018 02:18:44 -1100 Subject: [PATCH 14/74] Fix dice finish --- src/cc/dice.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/cc/dice.cpp b/src/cc/dice.cpp index 62a7d1046..7521df794 100644 --- a/src/cc/dice.cpp +++ b/src/cc/dice.cpp @@ -970,19 +970,21 @@ std::string DiceBetFinish(int32_t *resultp,uint64_t txfee,char *planstr,uint256 } CCchange = betTx.vout[0].nValue; fundsneeded = txfee + odds*betTx.vout[1].nValue; - if ( CCchange >= fundsneeded+betTx.vout[1].nValue || (inputs= AddDiceInputs(cp,mtx,dicepk,fundsneeded,60,sbits,fundingtxid)) > 0 ) + if ( CCchange >= fundsneeded+betTx.vout[1].nValue ) + CCchange -= (fundsneeded + betTx.vout[1].nValue); + else if ( (inputs= AddDiceInputs(cp,mtx,dicepk,fundsneeded,60,sbits,fundingtxid)) > 0 ) { if ( inputs > fundsneeded ) CCchange += (inputs - fundsneeded); - mtx.vout.push_back(MakeCC1vout(cp->evalcode,CCchange,dicepk)); - mtx.vout.push_back(CTxOut(txfee,fundingPubKey)); - mtx.vout.push_back(CTxOut((odds+1) * betTx.vout[1].nValue,betTx.vout[2].scriptPubKey)); } else { fprintf(stderr,"not enough inputs for %.8f\n",(double)fundsneeded/COIN); return(""); } + mtx.vout.push_back(MakeCC1vout(cp->evalcode,CCchange,dicepk)); + mtx.vout.push_back(CTxOut(txfee,fundingPubKey)); + mtx.vout.push_back(CTxOut((odds+1) * betTx.vout[1].nValue,betTx.vout[2].scriptPubKey)); } else { From db871af56fd0de9d2eac2c67df414914db69ffcf Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 14 Aug 2018 03:44:36 -1100 Subject: [PATCH 15/74] Fix dice finish --- src/cc/dice.cpp | 2 +- src/komodo_bitcoind.h | 11 +++++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/cc/dice.cpp b/src/cc/dice.cpp index 7521df794..669cb9007 100644 --- a/src/cc/dice.cpp +++ b/src/cc/dice.cpp @@ -968,7 +968,7 @@ std::string DiceBetFinish(int32_t *resultp,uint64_t txfee,char *planstr,uint256 fprintf(stderr,"illegal odds.%d vs maxodds.%d\n",(int32_t)odds,(int32_t)maxodds); return(""); } - CCchange = betTx.vout[0].nValue; + CCchange = betTx.vout[0].nValue + betTx.vout[1]; fundsneeded = txfee + odds*betTx.vout[1].nValue; if ( CCchange >= fundsneeded+betTx.vout[1].nValue ) CCchange -= (fundsneeded + betTx.vout[1].nValue); diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index bd5505c1c..13501d2a9 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -1327,14 +1327,16 @@ arith_uint256 komodo_PoWtarget(int32_t *percPoSp,arith_uint256 target,int32_t he ave = (sum / arith_uint256(m)); if ( ave > target ) ave = target; - } else ave = easydiff; //else return(target); + } else ave = target; //easydiff; //else return(target); if ( percPoS == 0 ) percPoS = 1; if ( percPoS < goalperc ) // increase PoW diff -> lower bnTarget { + //if ( oldflag != 0 ) + // bnTarget = (ave * arith_uint256(percPoS * percPoS)) / arith_uint256(goalperc * goalperc * goalperc); if ( oldflag != 0 ) - bnTarget = (ave * arith_uint256(percPoS * percPoS)) / arith_uint256(goalperc * goalperc * goalperc); - else bnTarget = (ave / arith_uint256(goalperc * goalperc * goalperc)) * arith_uint256(percPoS * percPoS); + bnTarget = (ave / arith_uint256(goalperc * goalperc * goalperc)) * arith_uint256(percPoS * percPoS); + else bnTarget = (ave / arith_uint256(goalperc * goalperc * goalperc * goalperc)) * arith_uint256(percPoS * percPoS); if ( ASSETCHAINS_STAKED < 100 ) { for (i=31; i>=24; i--) @@ -1355,7 +1357,8 @@ arith_uint256 komodo_PoWtarget(int32_t *percPoSp,arith_uint256 target,int32_t he bnTarget = ((ave * arith_uint256(goalperc)) + (easydiff * arith_uint256(percPoS))) / arith_uint256(percPoS + goalperc); //bnTarget = (bnTarget * arith_uint256(percPoS * percPoS * percPoS)) / arith_uint256(goalperc * goalperc); bnTarget = (bnTarget / arith_uint256(goalperc * goalperc)) * arith_uint256(percPoS * percPoS * percPoS); - } else bnTarget = (ave / arith_uint256(goalperc * goalperc)) * arith_uint256(percPoS * percPoS * percPoS); + } + else bnTarget = (ave / arith_uint256(goalperc * goalperc)) * arith_uint256(percPoS * percPoS * percPoS); if ( bnTarget > easydiff ) bnTarget = easydiff; else if ( bnTarget < ave ) // overflow From 2b4374d705f57e16a24234895fe99b7faead4ee2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 14 Aug 2018 03:45:58 -1100 Subject: [PATCH 16/74] nValue --- src/cc/dice.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/dice.cpp b/src/cc/dice.cpp index 669cb9007..1f2c770d7 100644 --- a/src/cc/dice.cpp +++ b/src/cc/dice.cpp @@ -968,7 +968,7 @@ std::string DiceBetFinish(int32_t *resultp,uint64_t txfee,char *planstr,uint256 fprintf(stderr,"illegal odds.%d vs maxodds.%d\n",(int32_t)odds,(int32_t)maxodds); return(""); } - CCchange = betTx.vout[0].nValue + betTx.vout[1]; + CCchange = betTx.vout[0].nValue + betTx.vout[1].nValue; fundsneeded = txfee + odds*betTx.vout[1].nValue; if ( CCchange >= fundsneeded+betTx.vout[1].nValue ) CCchange -= (fundsneeded + betTx.vout[1].nValue); From 1da742e71ecc8fa80334122faf76ae323e69231f Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 14 Aug 2018 04:48:07 -1100 Subject: [PATCH 17/74] Test --- src/cc/dice.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cc/dice.cpp b/src/cc/dice.cpp index 1f2c770d7..ef1b27bf3 100644 --- a/src/cc/dice.cpp +++ b/src/cc/dice.cpp @@ -969,9 +969,9 @@ std::string DiceBetFinish(int32_t *resultp,uint64_t txfee,char *planstr,uint256 return(""); } CCchange = betTx.vout[0].nValue + betTx.vout[1].nValue; - fundsneeded = txfee + odds*betTx.vout[1].nValue; - if ( CCchange >= fundsneeded+betTx.vout[1].nValue ) - CCchange -= (fundsneeded + betTx.vout[1].nValue); + fundsneeded = txfee + (odds+1)*betTx.vout[1].nValue; + if ( CCchange >= fundsneeded ) + CCchange -= fundsneeded; else if ( (inputs= AddDiceInputs(cp,mtx,dicepk,fundsneeded,60,sbits,fundingtxid)) > 0 ) { if ( inputs > fundsneeded ) From ef44dd00e197cbc8068d9a8a03fa324a185740d3 Mon Sep 17 00:00:00 2001 From: "Jonathan \"Duke\" Leto" Date: Wed, 15 Aug 2018 10:21:59 +0200 Subject: [PATCH 18/74] more rewards tests --- qa/rpc-tests/cryptoconditions.py | 45 ++++++++++++++++++++++++++------ 1 file changed, 37 insertions(+), 8 deletions(-) diff --git a/qa/rpc-tests/cryptoconditions.py b/qa/rpc-tests/cryptoconditions.py index 845d387b4..ad7ee7467 100755 --- a/qa/rpc-tests/cryptoconditions.py +++ b/qa/rpc-tests/cryptoconditions.py @@ -184,7 +184,7 @@ class CryptoConditionsTest (BitcoinTestFramework): result = rpc.rewardsinfo("none") assert_equal(result['result'], 'error') - result = rpc.rewardscreatefunding("STUFF", "1000", "5", "0", "10", "10") + result = rpc.rewardscreatefunding("STUFF", "7777", "25", "0", "10", "10") assert result['hex'], 'got raw xtn' txid = rpc.sendrawtransaction(result['hex']) assert txid, 'got txid' @@ -194,10 +194,10 @@ class CryptoConditionsTest (BitcoinTestFramework): result = rpc.rewardsinfo(txid) assert_equal(result['result'], 'success') assert_equal(result['name'], 'STUFF') - assert_equal(result['APR'], "5.00000000") + assert_equal(result['APR'], "25.00000000") assert_equal(result['minseconds'], 0) assert_equal(result['maxseconds'], 864000) - assert_equal(result['funding'], "1000.00000000") + assert_equal(result['funding'], "7777.00000000") assert_equal(result['mindeposit'], "10.00000000") assert_equal(result['fundingtxid'], txid) @@ -205,11 +205,14 @@ class CryptoConditionsTest (BitcoinTestFramework): result = rpc.rewardsaddfunding("STUFF", txid, "0") assert_equal(result['result'], 'error') - result = rpc.rewardsaddfunding("STUFF", txid, "100") + result = rpc.rewardsaddfunding("STUFF", txid, "555") assert_equal(result['result'], 'success') fundingtxid = result['hex'] assert fundingtxid, "got funding txid" + result = rpc.rewardslock("STUFF", fundingtxid, "7") + assert_equal(result['result'], 'error') + # the previous xtn has not been broadcasted yet result = rpc.rewardsunlock("STUFF", fundingtxid) assert_equal(result['result'], 'error') @@ -224,13 +227,39 @@ class CryptoConditionsTest (BitcoinTestFramework): # confirm the xtn above rpc.generate(1) - result = rpc.rewardsunlock("STUFF", fundingtxid) - # currently failing because reward is not > txfee? - # assert_equal(result['result'], 'success') - + # amount must be positive result = rpc.rewardslock("STUFF", fundingtxid, "-5") assert_equal(result['result'], 'error') + # amount must be positive + result = rpc.rewardslock("STUFF", fundingtxid, "0") + assert_equal(result['result'], 'error') + + # trying to lock less than the min amount is an error + result = rpc.rewardslock("STUFF", fundingtxid, "7") + assert_equal(result['result'], 'error') + + # not working + #result = rpc.rewardslock("STUFF", fundingtxid, "10") + #assert_equal(result['result'], 'success') + #locktxid = result['hex'] + #assert locktxid, "got lock txid" + + # locktxid has not been broadcast yet + #result = rpc.rewardsunlock("STUFF", locktxid) + #assert_equal(result['result'], 'error') + + # broadcast xtn + #txid = rpc.sendrawtransaction(locktxid) + #assert txid, 'got txid from sendrawtransaction' + + # confirm the xtn above + #rpc.generate(1) + + #result = rpc.rewardsunlock("STUFF", locktxid) + #assert_equal(result['result'], 'error') + + def run_test (self): print("Mining blocks...") rpc = self.nodes[0] From 6ca2e998838df140e1168cdb1913ff6b8fe7ccf0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Aug 2018 00:18:13 -1100 Subject: [PATCH 19/74] Backwards compatibility breaking changes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Assets: change tokeninfo to return "supply" in satoshis Max description length to 4096 Rewards: Fix rewardsunlock without giving it a locked txid always gives error Fix (nonconsensus) allow anybody to unlock only AFTER maxtime Fix rewards unlock to use mempool fix could you add a locked_funds value to rewardsinfo? Fix i deposited 100000 at 20% apr for one day i only got back 100000.01140669 seems like too little for 20% APR Faucet: Fix txid with 0x00 at beginning and end required for faucetget txid (65536 average iterations needed) Change reduce faucet get to 0.1 coins Can’t reproduce: it seems that if you re-run faucetget twice in the same block is when it pegs the cpu to max Dice: fix Dice status always returning loss Wont fix Profit margin for dice plan sounds good. -> use -ac_commission --- src/cc/CCassetstx.cpp | 3 +- src/cc/CCfaucet.h | 1 + src/cc/CCinclude.h | 1 + src/cc/dice.cpp | 12 +++--- src/cc/faucet.cpp | 38 ++++++++++++++---- src/cc/rewards.cpp | 87 +++++++++++++++++++++++++++++++--------- src/rpcblockchain.cpp | 2 +- src/wallet/rpcwallet.cpp | 9 ++++- 8 files changed, 119 insertions(+), 34 deletions(-) diff --git a/src/cc/CCassetstx.cpp b/src/cc/CCassetstx.cpp index bfd51f4b7..5869aa133 100644 --- a/src/cc/CCassetstx.cpp +++ b/src/cc/CCassetstx.cpp @@ -74,8 +74,7 @@ UniValue AssetInfo(uint256 assetid) result.push_back(Pair("tokenid",uint256_str(str,assetid))); result.push_back(Pair("owner",pubkey33_str(str,origpubkey.data()))); result.push_back(Pair("name",name)); - sprintf(numstr,"%.8f",(double)vintx.vout[0].nValue/COIN); - result.push_back(Pair("supply",numstr)); + result.push_back(Pair("supply",vintx.vout[0].nValue)); result.push_back(Pair("description",description)); return(result); } diff --git a/src/cc/CCfaucet.h b/src/cc/CCfaucet.h index f9b933255..39930cb20 100644 --- a/src/cc/CCfaucet.h +++ b/src/cc/CCfaucet.h @@ -20,6 +20,7 @@ #include "CCinclude.h" #define EVAL_FAUCET 0xe4 +#define FAUCETSIZE (COIN / 10) bool FaucetValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx); diff --git a/src/cc/CCinclude.h b/src/cc/CCinclude.h index 6a1a25b35..5116c1da6 100644 --- a/src/cc/CCinclude.h +++ b/src/cc/CCinclude.h @@ -64,6 +64,7 @@ bool myAddtomempool(CTransaction &tx); bool myIsutxo_spentinmempool(uint256 txid,int32_t vout); int32_t myIsutxo_spent(uint256 &spenttxid,uint256 txid,int32_t vout); bool mySendrawtransaction(std::string res); +int32_t decode_hex(uint8_t *bytes,int32_t n,char *hex); // CCcustom CPubKey GetUnspendable(struct CCcontract_info *cp,uint8_t *unspendablepriv); diff --git a/src/cc/dice.cpp b/src/cc/dice.cpp index ef1b27bf3..4f162eafc 100644 --- a/src/cc/dice.cpp +++ b/src/cc/dice.cpp @@ -1059,9 +1059,9 @@ double DiceStatus(uint64_t txfee,char *planstr,uint256 fundingtxid,uint256 bettx { if ( (vout= myIsutxo_spent(spenttxid,bettxid,1)) >= 0 ) { - if ( GetTransaction(spenttxid,spenttx,hashBlock,false) != 0 && spenttx.vout.size() > 2 ) + if ( GetTransaction(txid,betTx,hashBlock,false) != 0 && GetTransaction(spenttxid,spenttx,hashBlock,false) != 0 && spenttx.vout.size() > 2 ) { - if ( spenttx.vout[2].scriptPubKey == fundingPubKey ) + if ( betTx.vout[1].scriptPubKey.IsPayToCryptoCondition() == 0 || betTx.vout[2].scriptPubKey.IsPayToCryptoCondition() != 0 || spenttx.vout[2].scriptPubKey != betTx.vout[2].scriptPubKey ) return(0.); else return((double)spenttx.vout[2].nValue/COIN); } else return(0.); @@ -1075,15 +1075,17 @@ double DiceStatus(uint64_t txfee,char *planstr,uint256 fundingtxid,uint256 bettx sleep(1); if ( (vout= myIsutxo_spent(spenttxid,bettxid,1)) >= 0 ) { - if ( GetTransaction(spenttxid,spenttx,hashBlock,false) != 0 && spenttx.vout.size() >= 2 ) + if ( GetTransaction(txid,betTx,hashBlock,false) != 0 && GetTransaction(spenttxid,spenttx,hashBlock,false) != 0 && spenttx.vout.size() >= 2 ) { - if ( spenttx.vout[2].scriptPubKey == fundingPubKey || ((uint8_t *)spenttx.vout[2].scriptPubKey.data())[0] == 0x6a ) + if ( betTx.vout[1].scriptPubKey.IsPayToCryptoCondition() == 0 || betTx.vout[2].scriptPubKey.IsPayToCryptoCondition() != 0 || spenttx.vout[2].scriptPubKey != betTx.vout[2].scriptPubKey ) + //if ( spenttx.vout[2].scriptPubKey == fundingPubKey || ((uint8_t *)spenttx.vout[2].scriptPubKey.data())[0] == 0x6a ) return(0.); else return((double)spenttx.vout[2].nValue/COIN); } else return(0.); } fprintf(stderr,"didnt find dicefinish tx\n"); - } else return(-1.); + } + return(-1.); } return(0.); } diff --git a/src/cc/faucet.cpp b/src/cc/faucet.cpp index 1adec8af8..796dfb50c 100644 --- a/src/cc/faucet.cpp +++ b/src/cc/faucet.cpp @@ -69,17 +69,17 @@ bool FaucetExactAmounts(struct CCcontract_info *cp,Eval* eval,const CTransaction if ( (assetoshis= IsFaucetvout(cp,tx,i)) != 0 ) outputs += assetoshis; } - if ( inputs != outputs+COIN+txfee ) + if ( inputs != outputs+FAUCETSIZE+txfee ) { fprintf(stderr,"inputs %llu vs outputs %llu\n",(long long)inputs,(long long)outputs); - return eval->Invalid("mismatched inputs != outputs + COIN + txfee"); + return eval->Invalid("mismatched inputs != outputs + FAUCETSIZE + txfee"); } else return(true); } bool FaucetValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx) { - int32_t numvins,numvouts,preventCCvins,preventCCvouts,i; bool retval; + int32_t numvins,numvouts,preventCCvins,preventCCvouts,i; bool retval; uint256 txid; uint8_t hash[32]; numvins = tx.vin.size(); numvouts = tx.vout.size(); preventCCvins = preventCCvouts = -1; @@ -87,7 +87,6 @@ bool FaucetValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx return eval->Invalid("no vouts"); else { - //fprintf(stderr,"check vins\n"); for (i=0; iInvalid("invalid faucet output"); + else if ( hash[0] != 0 || hash[31] != 0 ) + return eval->Invalid("invalid faucetget txid"); retval = PreventCC(eval,tx,preventCCvins,numvins,preventCCvouts,numvouts); if ( retval != 0 ) fprintf(stderr,"faucetget validated\n"); @@ -154,7 +158,7 @@ int64_t AddFaucetInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPub std::string FaucetGet(uint64_t txfee) { - CMutableTransaction mtx; CPubKey mypk,faucetpk; CScript opret; int64_t inputs,CCchange=0,nValue=COIN; struct CCcontract_info *cp,C; + CMutableTransaction mtx,tmpmtx; CPubKey mypk,faucetpk; CScript opret; int64_t inputs,CCchange=0,nValue=FAUCETSIZE; struct CCcontract_info *cp,C; std::string rawhex; int32_t i,len; uint8_t hash[32],buf[32768]; cp = CCinit(&C,EVAL_FAUCET); if ( txfee == 0 ) txfee = 10000; @@ -167,7 +171,27 @@ std::string FaucetGet(uint64_t txfee) if ( CCchange != 0 ) mtx.vout.push_back(MakeCC1vout(EVAL_FAUCET,CCchange,faucetpk)); mtx.vout.push_back(CTxOut(nValue,CScript() << ParseHex(HexStr(mypk)) << OP_CHECKSIG)); - return(FinalizeCCTx(-1LL,cp,mtx,mypk,txfee,opret)); + for (i=0; i<1000000; i++) + { + tmpmtx = mtx; + rawhex = FinalizeCCTx(-1LL,cp,tmpmtx,mypk,txfee,opret); // signature changes each time + if ( (len= (int32_t)rawhex.size()) > 0 && len < 65536 ) + { + len >>= 1; + decode_hex(buf,len,(char *)rawhex.c_str()); + vcalc_sha256(0,hash,buf,len); + fprintf(stderr,"%02x%02x ",hash[0],hash[31]); + if ( hash[0] == 0 && hash[31] == 0 ) + { + fprintf(stderr,"found valid txid after %d iterations\n",i); + return(rawhex); + } + } + rawhex.delete(); + tmpmtx.delete(); + } + fprintf(stderr,"couldnt generate valid txid\n"); + return(""); } else fprintf(stderr,"cant find faucet inputs\n"); return(""); } diff --git a/src/cc/rewards.cpp b/src/cc/rewards.cpp index 9314f7c94..52bc82a7d 100644 --- a/src/cc/rewards.cpp +++ b/src/cc/rewards.cpp @@ -77,8 +77,10 @@ int64_t RewardsCalc(int64_t amount,uint256 txid,uint64_t APR,uint64_t minseconds //duration = (uint32_t)time(NULL) - (1532713903 - 3600 * 24); } else if ( duration > maxseconds ) duration = maxseconds; - reward = (((amount * APR) / COIN) * duration) / (365*24*3600LL * 100); - fprintf(stderr,"amount %.8f %.8f %llu -> duration.%llu reward %.8f\n",(double)amount/COIN,((double)amount * APR)/COIN,(long long)((amount * APR) / (COIN * 365*24*3600)),(long long)duration,(double)reward/COIN); + if ( 0 ) // amount * APR * duration / COIN * 100 * 365*24*3600 + reward = (((amount * APR) / COIN) * duration) / (365*24*3600LL * 100); + else reward = (((amount * duration) / (365 * 24 * 3600LL)) * (APR / 1000000)) / 10000; + fprintf(stderr,"amount %.8f %.8f %llu -> duration.%llu reward %.8f vals %.8f %.8f\n",(double)amount/COIN,((double)amount * APR)/COIN,(long long)((amount * APR) / (COIN * 365*24*3600)),(long long)duration,(double)reward/COIN,(double)((amount * duration) / (365 * 24 * 3600LL))/COIN,(double)(((amount * duration) / (365 * 24 * 3600LL)) * (APR / 1000000))/COIN); return(reward); } @@ -270,10 +272,38 @@ bool RewardsValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &t return(true); } -// 'L' vs 'F' and 'A' -int64_t AddRewardsInputs(CScript &scriptPubKey,int32_t fundsflag,struct CCcontract_info *cp,CMutableTransaction &mtx,CPubKey pk,int64_t total,int32_t maxinputs,uint64_t refsbits,uint256 reffundingtxid) +uint64_t myIs_unlockedtx_inmempool(uint256 &txid,int32_t &vout,uint64_t refsbits,uint256 reffundingtxid,uint64_t needed) { - char coinaddr[64],str[65]; uint64_t sbits,nValue,totalinputs = 0; uint256 txid,hashBlock,fundingtxid; CTransaction tx; int32_t j,vout,n = 0; uint8_t funcid; + uint8_t funcid; uint64_t sbits,nValue; uint256 fundingtxid; char str[65]; + memset(&txid,0,sizeof(txid)); + vout = -1; + nValue = 0; + BOOST_FOREACH(const CTxMemPoolEntry &e,mempool.mapTx) + { + const CTransaction &tx = e.GetTx(); + if ( tx.vout.size() > 0 && tx.vout[0].nValue >= needed ) + { + const uint256 &hash = tx.GetHash(); + if ( tx.vout[0].scriptPubKey.IsPayToCryptoCondition() != 0 && myIsutxo_spentinmempool(hash,0) == 0 ) + { + if ( (funcid= DecodeRewardsOpRet(hash,tx.vout[tx.vout.size()-1].scriptPubKey,sbits,fundingtxid)) == 'U' && sbits == refsbits && fundingtxid == reffundingtxid ) + { + txid = hash; + vout = 0; + nValue = tx.vout[0].nValue; + fprintf(stderr,"found 'U' %s %.8f in unspent in mempool\n",uint256_str(str,txid),(double)nValue/COIN); + return(nValue); + } + } + } + } + return(nValue); +} + +// 'L' vs 'F' and 'A' +int64_t AddRewardsInputs(CScript &scriptPubKey,uint64_t maxseconds,struct CCcontract_info *cp,CMutableTransaction &mtx,CPubKey pk,int64_t total,int32_t maxinputs,uint64_t refsbits,uint256 reffundingtxid) +{ + char coinaddr[64],str[65]; uint64_t sbits,nValue,totalinputs = 0; uint256 txid,hashBlock,fundingtxid; CTransaction tx; int32_t numblocks,j,vout,n = 0; uint8_t funcid; std::vector > unspentOutputs; GetCCaddress(cp,coinaddr,pk); SetCCunspents(unspentOutputs,coinaddr); @@ -296,13 +326,16 @@ int64_t AddRewardsInputs(CScript &scriptPubKey,int32_t fundsflag,struct CCcontra if ( sbits != refsbits || fundingtxid != reffundingtxid ) continue; fprintf(stderr,"fundsflag.%d (%c) %.8f %.8f\n",fundsflag,funcid,(double)tx.vout[vout].nValue/COIN,(double)it->second.satoshis/COIN); - if ( fundsflag != 0 && funcid != 'F' && funcid != 'A' && funcid != 'U' ) - continue; - else if ( fundsflag == 0 && (funcid != 'L' || tx.vout.size() < 4) ) + if ( maxseconds == 0 && funcid != 'F' && funcid != 'A' && funcid != 'U' ) continue; + else if ( maxseconds != 0 && funcid != 'L' ) + { + if ( CCduration(numblocks,txid)) < maxseconds ) + continue; + } if ( total != 0 && maxinputs != 0 ) { - if ( fundsflag == 0 ) + if ( maxseconds != 0 ) scriptPubKey = tx.vout[1].scriptPubKey; mtx.vin.push_back(CTxIn(txid,vout,CScript())); } @@ -313,13 +346,25 @@ int64_t AddRewardsInputs(CScript &scriptPubKey,int32_t fundsflag,struct CCcontra } else fprintf(stderr,"null funcid\n"); } } + if ( maxseconds == 0 && totalinputs < total && (maxinputs == 0 || n < maxinputs-1) ) + { + fprintf(stderr,"search mempool for unlocked and unspent CC rewards output for %.8f\n",(double)(total-totalinputs)/COIN); + if ( (nValue= myIs_unlockedtx_inmempool(txid,vout,refsbits,reffundingtxid,total-totalinputs)) > 0 ) + { + mtx.vin.push_back(CTxIn(txid,vout,CScript())); + fprintf(stderr,"added mempool vout for %.8f\n",(double)nValue/COIN); + totalinputs += nValue; + n++; + } + } return(totalinputs); } -int64_t RewardsPlanFunds(uint64_t refsbits,struct CCcontract_info *cp,CPubKey pk,uint256 reffundingtxid) +int64_t RewardsPlanFunds(uint64_t &lockedfunds,uint64_t refsbits,struct CCcontract_info *cp,CPubKey pk,uint256 reffundingtxid) { char coinaddr[64]; uint64_t sbits; int64_t nValue,totalinputs = 0; uint256 txid,hashBlock,fundingtxid; CTransaction tx; int32_t vout; uint8_t funcid; std::vector > unspentOutputs; + lockedfunds = 0; GetCCaddress(cp,coinaddr,pk); SetCCunspents(unspentOutputs,coinaddr); for (std::vector >::const_iterator it=unspentOutputs.begin(); it!=unspentOutputs.end(); it++) @@ -328,12 +373,16 @@ int64_t RewardsPlanFunds(uint64_t refsbits,struct CCcontract_info *cp,CPubKey pk vout = (int32_t)it->first.index; if ( GetTransaction(txid,tx,hashBlock,false) != 0 && tx.vout[vout].scriptPubKey.IsPayToCryptoCondition() != 0 ) { - if ( (funcid= DecodeRewardsOpRet(txid,tx.vout[tx.vout.size()-1].scriptPubKey,sbits,fundingtxid)) == 'F' || funcid == 'A' || funcid == 'U' ) + if ( (funcid= DecodeRewardsOpRet(txid,tx.vout[tx.vout.size()-1].scriptPubKey,sbits,fundingtxid)) == 'F' || funcid == 'A' || funcid == 'U' || funcid == 'L' ) { if ( refsbits == sbits && (funcid == 'F' && reffundingtxid == txid) || reffundingtxid == fundingtxid ) { if ( (nValue= IsRewardsvout(cp,tx,vout,sbits,fundingtxid)) > 0 ) - totalinputs += nValue; + { + if ( funcid == 'L' ) + lockedfunds += nValue; + else totalinputs += nValue; + } else fprintf(stderr,"refsbits.%llx sbits.%llx nValue %.8f\n",(long long)refsbits,(long long)sbits,(double)nValue/COIN); } //else fprintf(stderr,"else case\n"); } else fprintf(stderr,"funcid.%d %c skipped %.8f\n",funcid,funcid,(double)tx.vout[vout].nValue/COIN); @@ -367,7 +416,7 @@ bool RewardsPlanExists(struct CCcontract_info *cp,uint64_t refsbits,CPubKey rewa UniValue RewardsInfo(uint256 rewardsid) { - UniValue result(UniValue::VOBJ); uint256 hashBlock; CTransaction vintx; uint64_t APR,minseconds,maxseconds,mindeposit,sbits,funding; CPubKey rewardspk; struct CCcontract_info *cp,C; char str[67],numstr[65]; + UniValue result(UniValue::VOBJ); uint256 hashBlock; CTransaction vintx; uint64_t lockedfunds,APR,minseconds,maxseconds,mindeposit,sbits,funding; CPubKey rewardspk; struct CCcontract_info *cp,C; char str[67],numstr[65]; if ( GetTransaction(rewardsid,vintx,hashBlock,false) == 0 ) { fprintf(stderr,"cant find fundingtxid\n"); @@ -395,9 +444,11 @@ UniValue RewardsInfo(uint256 rewardsid) result.push_back(Pair("mindeposit",numstr)); cp = CCinit(&C,EVAL_REWARDS); rewardspk = GetUnspendable(cp,0); - funding = RewardsPlanFunds(sbits,cp,rewardspk,rewardsid); + funding = RewardsPlanFunds(lockedfunds,sbits,cp,rewardspk,rewardsid); sprintf(numstr,"%.8f",(double)funding/COIN); result.push_back(Pair("funding",numstr)); + sprintf(numstr,"%.8f",(double)lockedfunds/COIN); + result.push_back(Pair("locked",numstr)); return(result); } @@ -485,7 +536,7 @@ std::string RewardsAddfunding(uint64_t txfee,char *planstr,uint256 fundingtxid,i std::string RewardsLock(uint64_t txfee,char *planstr,uint256 fundingtxid,int64_t deposit) { - CMutableTransaction mtx; CPubKey mypk,rewardspk; CScript opret; uint64_t sbits,funding,APR,minseconds,maxseconds,mindeposit; struct CCcontract_info *cp,C; + CMutableTransaction mtx; CPubKey mypk,rewardspk; CScript opret; uint64_t lockedfunds,sbits,funding,APR,minseconds,maxseconds,mindeposit; struct CCcontract_info *cp,C; if ( deposit < 0 ) { fprintf(stderr,"negative parameter error\n"); @@ -507,7 +558,7 @@ std::string RewardsLock(uint64_t txfee,char *planstr,uint256 fundingtxid,int64_t fprintf(stderr,"Rewards plan %s deposit %.8f < mindeposit %.8f\n",planstr,(double)deposit/COIN,(double)mindeposit/COIN); return(""); } - if ( (funding= RewardsPlanFunds(sbits,cp,rewardspk,fundingtxid)) >= deposit ) // arbitrary cmpval + if ( (funding= RewardsPlanFunds(lockedfunds,sbits,cp,rewardspk,fundingtxid)) >= deposit ) // arbitrary cmpval { if ( AddNormalinputs(mtx,mypk,deposit+2*txfee,64) > 0 ) { @@ -536,7 +587,7 @@ std::string RewardsUnlock(uint64_t txfee,char *planstr,uint256 fundingtxid,uint2 } fprintf(stderr,"APR %.8f minseconds.%llu maxseconds.%llu mindeposit %.8f\n",(double)APR/COIN,(long long)minseconds,(long long)maxseconds,(double)mindeposit/COIN); if ( locktxid == zeroid ) - amount = AddRewardsInputs(scriptPubKey,0,cp,mtx,rewardspk,(1LL << 30),1,sbits,fundingtxid); + amount = AddRewardsInputs(scriptPubKey,maxseconds,cp,mtx,rewardspk,(1LL << 30),1,sbits,fundingtxid); else { GetCCaddress(cp,coinaddr,rewardspk); @@ -558,7 +609,7 @@ std::string RewardsUnlock(uint64_t txfee,char *planstr,uint256 fundingtxid,uint2 } if ( amount > 0 && (reward= RewardsCalc(amount,mtx.vin[0].prevout.hash,APR,minseconds,maxseconds,mindeposit)) > txfee && scriptPubKey.size() > 0 ) { - if ( (inputs= AddRewardsInputs(ignore,1,cp,mtx,rewardspk,reward+txfee,30,sbits,fundingtxid)) > 0 ) + if ( (inputs= AddRewardsInputs(ignore,0,cp,mtx,rewardspk,reward+txfee,30,sbits,fundingtxid)) > 0 ) { if ( inputs >= (reward + 2*txfee) ) CCchange = (inputs - (reward + txfee)); diff --git a/src/rpcblockchain.cpp b/src/rpcblockchain.cpp index d870ad75e..7f01c862f 100644 --- a/src/rpcblockchain.cpp +++ b/src/rpcblockchain.cpp @@ -352,7 +352,7 @@ UniValue getdifficulty(const UniValue& params, bool fHelp) bool myIsutxo_spentinmempool(uint256 txid,int32_t vout) { //char *uint256_str(char *str,uint256); char str[65]; - LOCK(mempool.cs); + //LOCK(mempool.cs); BOOST_FOREACH(const CTxMemPoolEntry &e,mempool.mapTx) { const CTransaction &tx = e.GetTx(); diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 6329d4a52..5c16c3b9c 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -5319,7 +5319,7 @@ UniValue dicestatus(const UniValue& params, bool fHelp) result.push_back(Pair("status", "loss")); else result.push_back(Pair("status", "no pending bets")); } - } else result.push_back(Pair("status", "invalid bet txid")); + } else result.push_back(Pair("status", "bet still pending")); return(result); } @@ -5412,7 +5412,14 @@ UniValue tokencreate(const UniValue& params, bool fHelp) name = params[0].get_str(); supply = atof(params[1].get_str().c_str()) * COIN; if ( params.size() == 3 ) + { description = params[2].get_str(); + if ( description.size() > 4096 ) + { + result.push_back(Pair("error", "token description longer than 4096")); + return(result); + } + } hex = CreateAsset(0,supply,name,description); if ( hex.size() > 0 ) { From 76fb8636ec9c48b9d0c830fc7f66ca5871aa8d09 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Aug 2018 00:22:18 -1100 Subject: [PATCH 20/74] Syntax --- src/cc/faucet.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/cc/faucet.cpp b/src/cc/faucet.cpp index 796dfb50c..e31ebbb25 100644 --- a/src/cc/faucet.cpp +++ b/src/cc/faucet.cpp @@ -79,7 +79,7 @@ bool FaucetExactAmounts(struct CCcontract_info *cp,Eval* eval,const CTransaction bool FaucetValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx) { - int32_t numvins,numvouts,preventCCvins,preventCCvouts,i; bool retval; uint256 txid; uint8_t hash[32]; + int32_t numvins,numvouts,preventCCvins,preventCCvouts,i; bool retval; uint256 txid; uint8_t hash[32]; char str[65]; numvins = tx.vin.size(); numvouts = tx.vout.size(); preventCCvins = preventCCvouts = -1; @@ -187,8 +187,6 @@ std::string FaucetGet(uint64_t txfee) return(rawhex); } } - rawhex.delete(); - tmpmtx.delete(); } fprintf(stderr,"couldnt generate valid txid\n"); return(""); From 6986a67b5c41c7c7c2dfc9039de263c412fb70e3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Aug 2018 00:23:23 -1100 Subject: [PATCH 21/74] Syntax --- src/cc/rewards.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cc/rewards.cpp b/src/cc/rewards.cpp index 52bc82a7d..3c6b72ff2 100644 --- a/src/cc/rewards.cpp +++ b/src/cc/rewards.cpp @@ -325,12 +325,12 @@ int64_t AddRewardsInputs(CScript &scriptPubKey,uint64_t maxseconds,struct CCcont { if ( sbits != refsbits || fundingtxid != reffundingtxid ) continue; - fprintf(stderr,"fundsflag.%d (%c) %.8f %.8f\n",fundsflag,funcid,(double)tx.vout[vout].nValue/COIN,(double)it->second.satoshis/COIN); + fprintf(stderr,"maxseconds.%d (%c) %.8f %.8f\n",(int32_t)maxseconds,funcid,(double)tx.vout[vout].nValue/COIN,(double)it->second.satoshis/COIN); if ( maxseconds == 0 && funcid != 'F' && funcid != 'A' && funcid != 'U' ) continue; else if ( maxseconds != 0 && funcid != 'L' ) { - if ( CCduration(numblocks,txid)) < maxseconds ) + if ( CCduration(numblocks,txid) < maxseconds ) continue; } if ( total != 0 && maxinputs != 0 ) From 97e4544b10ca70dee4b18bd148b0ace03ee92369 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Aug 2018 00:33:12 -1100 Subject: [PATCH 22/74] Test --- src/cc/dice.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/cc/dice.cpp b/src/cc/dice.cpp index 4f162eafc..bae8ad653 100644 --- a/src/cc/dice.cpp +++ b/src/cc/dice.cpp @@ -1061,6 +1061,8 @@ double DiceStatus(uint64_t txfee,char *planstr,uint256 fundingtxid,uint256 bettx { if ( GetTransaction(txid,betTx,hashBlock,false) != 0 && GetTransaction(spenttxid,spenttx,hashBlock,false) != 0 && spenttx.vout.size() > 2 ) { + char str[65]; + fprintf(stderr,"found spenttxid %s\n",uint256_str(str,spenttxid)); if ( betTx.vout[1].scriptPubKey.IsPayToCryptoCondition() == 0 || betTx.vout[2].scriptPubKey.IsPayToCryptoCondition() != 0 || spenttx.vout[2].scriptPubKey != betTx.vout[2].scriptPubKey ) return(0.); else return((double)spenttx.vout[2].nValue/COIN); From f4fc4a80f9a73e661e53e3e2aaca46cc066405d5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Aug 2018 00:50:04 -1100 Subject: [PATCH 23/74] Add nonceto faucet get --- src/cc/faucet.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/cc/faucet.cpp b/src/cc/faucet.cpp index e31ebbb25..42e767442 100644 --- a/src/cc/faucet.cpp +++ b/src/cc/faucet.cpp @@ -174,6 +174,7 @@ std::string FaucetGet(uint64_t txfee) for (i=0; i<1000000; i++) { tmpmtx = mtx; + opret << OP_RETURN << E_MARSHAL(ss << EVAL_FAUCET << 'G' << i); rawhex = FinalizeCCTx(-1LL,cp,tmpmtx,mypk,txfee,opret); // signature changes each time if ( (len= (int32_t)rawhex.size()) > 0 && len < 65536 ) { From a6c2a2fe36a667850987b307889eba9e63279b71 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Aug 2018 00:51:13 -1100 Subject: [PATCH 24/74] Test --- src/cc/faucet.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/cc/faucet.cpp b/src/cc/faucet.cpp index 42e767442..9956733bd 100644 --- a/src/cc/faucet.cpp +++ b/src/cc/faucet.cpp @@ -171,7 +171,7 @@ std::string FaucetGet(uint64_t txfee) if ( CCchange != 0 ) mtx.vout.push_back(MakeCC1vout(EVAL_FAUCET,CCchange,faucetpk)); mtx.vout.push_back(CTxOut(nValue,CScript() << ParseHex(HexStr(mypk)) << OP_CHECKSIG)); - for (i=0; i<1000000; i++) + for (i=0; i<1000; i++) { tmpmtx = mtx; opret << OP_RETURN << E_MARSHAL(ss << EVAL_FAUCET << 'G' << i); @@ -181,7 +181,9 @@ std::string FaucetGet(uint64_t txfee) len >>= 1; decode_hex(buf,len,(char *)rawhex.c_str()); vcalc_sha256(0,hash,buf,len); - fprintf(stderr,"%02x%02x ",hash[0],hash[31]); + for (j=0; j<32; j++) + fprintf(stderr,"%02x",hash[i]); + fprintf(stderr," "); if ( hash[0] == 0 && hash[31] == 0 ) { fprintf(stderr,"found valid txid after %d iterations\n",i); From 300b9ceeb8e2ebaa01303b5e2a8f25dfd1c06a83 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Aug 2018 00:52:08 -1100 Subject: [PATCH 25/74] Test --- src/cc/faucet.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/cc/faucet.cpp b/src/cc/faucet.cpp index 9956733bd..217d9145f 100644 --- a/src/cc/faucet.cpp +++ b/src/cc/faucet.cpp @@ -171,6 +171,7 @@ std::string FaucetGet(uint64_t txfee) if ( CCchange != 0 ) mtx.vout.push_back(MakeCC1vout(EVAL_FAUCET,CCchange,faucetpk)); mtx.vout.push_back(CTxOut(nValue,CScript() << ParseHex(HexStr(mypk)) << OP_CHECKSIG)); + fprintf(stderr,"start at %u\n",(uint32_t)time(NULL)); for (i=0; i<1000; i++) { tmpmtx = mtx; @@ -186,12 +187,12 @@ std::string FaucetGet(uint64_t txfee) fprintf(stderr," "); if ( hash[0] == 0 && hash[31] == 0 ) { - fprintf(stderr,"found valid txid after %d iterations\n",i); + fprintf(stderr,"found valid txid after %d iterations %u\n",i,(uint32_t)time(NULL)); return(rawhex); } } } - fprintf(stderr,"couldnt generate valid txid\n"); + fprintf(stderr,"couldnt generate valid txid %u\n",(uint32_t)time(NULL)); return(""); } else fprintf(stderr,"cant find faucet inputs\n"); return(""); From b940bb4abdae315b8d74553ac605da4f026ee7b8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Aug 2018 00:53:17 -1100 Subject: [PATCH 26/74] Fix --- src/cc/faucet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/faucet.cpp b/src/cc/faucet.cpp index 217d9145f..f27a90347 100644 --- a/src/cc/faucet.cpp +++ b/src/cc/faucet.cpp @@ -158,7 +158,7 @@ int64_t AddFaucetInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPub std::string FaucetGet(uint64_t txfee) { - CMutableTransaction mtx,tmpmtx; CPubKey mypk,faucetpk; CScript opret; int64_t inputs,CCchange=0,nValue=FAUCETSIZE; struct CCcontract_info *cp,C; std::string rawhex; int32_t i,len; uint8_t hash[32],buf[32768]; + CMutableTransaction mtx,tmpmtx; CPubKey mypk,faucetpk; CScript opret; int64_t inputs,CCchange=0,nValue=FAUCETSIZE; struct CCcontract_info *cp,C; std::string rawhex; int32_t i,j,len; uint8_t hash[32],buf[32768]; cp = CCinit(&C,EVAL_FAUCET); if ( txfee == 0 ) txfee = 10000; From ca9af9a1f68028dcb6062f4600334ba2ca9acbbb Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Aug 2018 00:54:42 -1100 Subject: [PATCH 27/74] Test --- src/cc/faucet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/faucet.cpp b/src/cc/faucet.cpp index f27a90347..9f5d620b7 100644 --- a/src/cc/faucet.cpp +++ b/src/cc/faucet.cpp @@ -183,7 +183,7 @@ std::string FaucetGet(uint64_t txfee) decode_hex(buf,len,(char *)rawhex.c_str()); vcalc_sha256(0,hash,buf,len); for (j=0; j<32; j++) - fprintf(stderr,"%02x",hash[i]); + fprintf(stderr,"%02x",hash[j]); fprintf(stderr," "); if ( hash[0] == 0 && hash[31] == 0 ) { From 2accae9efdc8f6f5331941ed5032f8874597d5c2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Aug 2018 00:56:14 -1100 Subject: [PATCH 28/74] Test --- src/cc/faucet.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/cc/faucet.cpp b/src/cc/faucet.cpp index 9f5d620b7..31e4bce21 100644 --- a/src/cc/faucet.cpp +++ b/src/cc/faucet.cpp @@ -172,7 +172,7 @@ std::string FaucetGet(uint64_t txfee) mtx.vout.push_back(MakeCC1vout(EVAL_FAUCET,CCchange,faucetpk)); mtx.vout.push_back(CTxOut(nValue,CScript() << ParseHex(HexStr(mypk)) << OP_CHECKSIG)); fprintf(stderr,"start at %u\n",(uint32_t)time(NULL)); - for (i=0; i<1000; i++) + for (i=0; i<1000000; i++) { tmpmtx = mtx; opret << OP_RETURN << E_MARSHAL(ss << EVAL_FAUCET << 'G' << i); @@ -182,9 +182,9 @@ std::string FaucetGet(uint64_t txfee) len >>= 1; decode_hex(buf,len,(char *)rawhex.c_str()); vcalc_sha256(0,hash,buf,len); - for (j=0; j<32; j++) - fprintf(stderr,"%02x",hash[j]); - fprintf(stderr," "); + //for (j=0; j<32; j++) + // fprintf(stderr,"%02x",hash[j]); + //fprintf(stderr," "); if ( hash[0] == 0 && hash[31] == 0 ) { fprintf(stderr,"found valid txid after %d iterations %u\n",i,(uint32_t)time(NULL)); From 6155bc4b68d400d9309b3e343c20bbd41e17fed6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Aug 2018 01:00:43 -1100 Subject: [PATCH 29/74] tst --- src/cc/faucet.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/cc/faucet.cpp b/src/cc/faucet.cpp index 31e4bce21..5acbb46b9 100644 --- a/src/cc/faucet.cpp +++ b/src/cc/faucet.cpp @@ -191,6 +191,8 @@ std::string FaucetGet(uint64_t txfee) return(rawhex); } } + if ( (i % 10000) == 9999 ) + fprintf(stderr,"."); } fprintf(stderr,"couldnt generate valid txid %u\n",(uint32_t)time(NULL)); return(""); From fd39f0953539e7e99616bd2222513a6053ac5c96 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Aug 2018 01:04:07 -1100 Subject: [PATCH 30/74] 0 mod 4096 for faucet get --- src/cc/faucet.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cc/faucet.cpp b/src/cc/faucet.cpp index 5acbb46b9..fa21dc985 100644 --- a/src/cc/faucet.cpp +++ b/src/cc/faucet.cpp @@ -114,7 +114,7 @@ bool FaucetValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx fprintf(stderr,"check faucetget txid %s %02x/%02x\n",uint256_str(str,txid),hash[0],hash[31]); if ( tx.vout[i].nValue != FAUCETSIZE ) return eval->Invalid("invalid faucet output"); - else if ( hash[0] != 0 || hash[31] != 0 ) + else if ( (hash[0] & 0x3f) != 0 || (hash[31] & 0x3f) != 0 ) return eval->Invalid("invalid faucetget txid"); retval = PreventCC(eval,tx,preventCCvins,numvins,preventCCvouts,numvouts); if ( retval != 0 ) @@ -185,7 +185,7 @@ std::string FaucetGet(uint64_t txfee) //for (j=0; j<32; j++) // fprintf(stderr,"%02x",hash[j]); //fprintf(stderr," "); - if ( hash[0] == 0 && hash[31] == 0 ) + if ( (hash[0] & 0x3f) == 0 && (hash[31] & 0x3f) == 0 ) { fprintf(stderr,"found valid txid after %d iterations %u\n",i,(uint32_t)time(NULL)); return(rawhex); From 43e77d75f7d2383569a0ed33681ffdb9b9689a36 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Aug 2018 01:06:19 -1100 Subject: [PATCH 31/74] Test --- src/cc/faucet.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/cc/faucet.cpp b/src/cc/faucet.cpp index fa21dc985..c0aae09dc 100644 --- a/src/cc/faucet.cpp +++ b/src/cc/faucet.cpp @@ -190,8 +190,9 @@ std::string FaucetGet(uint64_t txfee) fprintf(stderr,"found valid txid after %d iterations %u\n",i,(uint32_t)time(NULL)); return(rawhex); } + fprintf(stderr,"%x%x ",(hash[0] & 0x3f) >> 6,(hash[31] & 0x3f) >> 6); } - if ( (i % 10000) == 9999 ) + if ( (i % 1000) == 999 ) fprintf(stderr,"."); } fprintf(stderr,"couldnt generate valid txid %u\n",(uint32_t)time(NULL)); From 6f054a7708c36d4f0c9fb1e1fa6f7e2e4529386b Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Aug 2018 01:11:06 -1100 Subject: [PATCH 32/74] Test --- src/cc/faucet.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/cc/faucet.cpp b/src/cc/faucet.cpp index c0aae09dc..dedbbcf3f 100644 --- a/src/cc/faucet.cpp +++ b/src/cc/faucet.cpp @@ -158,7 +158,7 @@ int64_t AddFaucetInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPub std::string FaucetGet(uint64_t txfee) { - CMutableTransaction mtx,tmpmtx; CPubKey mypk,faucetpk; CScript opret; int64_t inputs,CCchange=0,nValue=FAUCETSIZE; struct CCcontract_info *cp,C; std::string rawhex; int32_t i,j,len; uint8_t hash[32],buf[32768]; + CMutableTransaction mtx,tmpmtx; CPubKey mypk,faucetpk; CScript opret; int64_t inputs,CCchange=0,nValue=FAUCETSIZE; struct CCcontract_info *cp,C; std::string rawhex; int32_t i,j,len; uint8_t buf[32768]; bits256 hash; cp = CCinit(&C,EVAL_FAUCET); if ( txfee == 0 ) txfee = 10000; @@ -181,19 +181,17 @@ std::string FaucetGet(uint64_t txfee) { len >>= 1; decode_hex(buf,len,(char *)rawhex.c_str()); - vcalc_sha256(0,hash,buf,len); + hash = bits256_doublesha256(0,buf,len); //for (j=0; j<32; j++) // fprintf(stderr,"%02x",hash[j]); //fprintf(stderr," "); - if ( (hash[0] & 0x3f) == 0 && (hash[31] & 0x3f) == 0 ) + if ( (hash.bytes[0] & 0x3f) == 0 && (hash.bytes[31] & 0x3f) == 0 ) { fprintf(stderr,"found valid txid after %d iterations %u\n",i,(uint32_t)time(NULL)); return(rawhex); } - fprintf(stderr,"%x%x ",(hash[0] & 0x3f) >> 6,(hash[31] & 0x3f) >> 6); + fprintf(stderr,"%02x%02x ",hash.bytes[0],hash.bytes[31]); } - if ( (i % 1000) == 999 ) - fprintf(stderr,"."); } fprintf(stderr,"couldnt generate valid txid %u\n",(uint32_t)time(NULL)); return(""); From 135d90357fc66ddb532af65f2592624d520951e9 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Aug 2018 01:15:12 -1100 Subject: [PATCH 33/74] Test --- src/cc/CCinclude.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/cc/CCinclude.h b/src/cc/CCinclude.h index 5116c1da6..3954068e1 100644 --- a/src/cc/CCinclude.h +++ b/src/cc/CCinclude.h @@ -101,5 +101,6 @@ bits256 curve25519_shared(bits256 privkey,bits256 otherpub); bits256 curve25519_basepoint9(); bits256 curve25519(bits256 mysecret,bits256 basepoint); void vcalc_sha256(char deprecated[(256 >> 3) * 2 + 1],uint8_t hash[256 >> 3],uint8_t *src,int32_t len); +bits256 bits256_doublesha256(char *deprecated,uint8_t *data,int32_t datalen); #endif From 09bff6c967f14bb7a7ae61607d4566f5d48f23bd Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Aug 2018 01:18:39 -1100 Subject: [PATCH 34/74] Test --- src/cc/faucet.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cc/faucet.cpp b/src/cc/faucet.cpp index dedbbcf3f..dd3b75399 100644 --- a/src/cc/faucet.cpp +++ b/src/cc/faucet.cpp @@ -158,7 +158,7 @@ int64_t AddFaucetInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPub std::string FaucetGet(uint64_t txfee) { - CMutableTransaction mtx,tmpmtx; CPubKey mypk,faucetpk; CScript opret; int64_t inputs,CCchange=0,nValue=FAUCETSIZE; struct CCcontract_info *cp,C; std::string rawhex; int32_t i,j,len; uint8_t buf[32768]; bits256 hash; + CMutableTransaction mtx,tmpmtx; CPubKey mypk,faucetpk; int64_t inputs,CCchange=0,nValue=FAUCETSIZE; struct CCcontract_info *cp,C; std::string rawhex; int32_t i,j,len; uint8_t buf[32768]; bits256 hash; cp = CCinit(&C,EVAL_FAUCET); if ( txfee == 0 ) txfee = 10000; @@ -175,8 +175,8 @@ std::string FaucetGet(uint64_t txfee) for (i=0; i<1000000; i++) { tmpmtx = mtx; - opret << OP_RETURN << E_MARSHAL(ss << EVAL_FAUCET << 'G' << i); - rawhex = FinalizeCCTx(-1LL,cp,tmpmtx,mypk,txfee,opret); // signature changes each time + //opret << OP_RETURN << E_MARSHAL(ss << EVAL_FAUCET << 'G' << i); + rawhex = FinalizeCCTx(-1LL,cp,tmpmtx,mypk,txfee,OP_RETURN << E_MARSHAL(ss << EVAL_FAUCET << 'G' << i)); // signature changes each time if ( (len= (int32_t)rawhex.size()) > 0 && len < 65536 ) { len >>= 1; From 0ac322177136f9065d2dd6d3a8b08c711a190b41 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Aug 2018 01:19:17 -1100 Subject: [PATCH 35/74] Test --- src/cc/faucet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/faucet.cpp b/src/cc/faucet.cpp index dd3b75399..b3c115cee 100644 --- a/src/cc/faucet.cpp +++ b/src/cc/faucet.cpp @@ -176,7 +176,7 @@ std::string FaucetGet(uint64_t txfee) { tmpmtx = mtx; //opret << OP_RETURN << E_MARSHAL(ss << EVAL_FAUCET << 'G' << i); - rawhex = FinalizeCCTx(-1LL,cp,tmpmtx,mypk,txfee,OP_RETURN << E_MARSHAL(ss << EVAL_FAUCET << 'G' << i)); // signature changes each time + rawhex = FinalizeCCTx(-1LL,cp,tmpmtx,mypk,txfee,CScript() << OP_RETURN << E_MARSHAL(ss << EVAL_FAUCET << 'G' << i)); // signature changes each time if ( (len= (int32_t)rawhex.size()) > 0 && len < 65536 ) { len >>= 1; From e9a15289d7072fb68c7615d02dbb6722daefe4e7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Aug 2018 01:22:22 -1100 Subject: [PATCH 36/74] Test --- src/cc/faucet.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cc/faucet.cpp b/src/cc/faucet.cpp index b3c115cee..a3a3b350f 100644 --- a/src/cc/faucet.cpp +++ b/src/cc/faucet.cpp @@ -114,7 +114,7 @@ bool FaucetValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx fprintf(stderr,"check faucetget txid %s %02x/%02x\n",uint256_str(str,txid),hash[0],hash[31]); if ( tx.vout[i].nValue != FAUCETSIZE ) return eval->Invalid("invalid faucet output"); - else if ( (hash[0] & 0x3f) != 0 || (hash[31] & 0x3f) != 0 ) + else if ( (hash[0] & 0xff) != 0 || (hash[31] & 0xff) != 0 ) return eval->Invalid("invalid faucetget txid"); retval = PreventCC(eval,tx,preventCCvins,numvins,preventCCvouts,numvouts); if ( retval != 0 ) @@ -185,7 +185,7 @@ std::string FaucetGet(uint64_t txfee) //for (j=0; j<32; j++) // fprintf(stderr,"%02x",hash[j]); //fprintf(stderr," "); - if ( (hash.bytes[0] & 0x3f) == 0 && (hash.bytes[31] & 0x3f) == 0 ) + if ( (hash.bytes[0] & 0xff) == 0 && (hash.bytes[31] & 0xff) == 0 ) { fprintf(stderr,"found valid txid after %d iterations %u\n",i,(uint32_t)time(NULL)); return(rawhex); From a997e9ed74e8fb476ec6d9c8f02618d2e40df2b4 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Aug 2018 01:24:39 -1100 Subject: [PATCH 37/74] Test --- src/cc/faucet.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cc/faucet.cpp b/src/cc/faucet.cpp index a3a3b350f..90c3a7c1c 100644 --- a/src/cc/faucet.cpp +++ b/src/cc/faucet.cpp @@ -114,7 +114,7 @@ bool FaucetValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx fprintf(stderr,"check faucetget txid %s %02x/%02x\n",uint256_str(str,txid),hash[0],hash[31]); if ( tx.vout[i].nValue != FAUCETSIZE ) return eval->Invalid("invalid faucet output"); - else if ( (hash[0] & 0xff) != 0 || (hash[31] & 0xff) != 0 ) + else if ( (hash[0] & 0x7f) != 0 || (hash[31] & 0x7f) != 0 ) return eval->Invalid("invalid faucetget txid"); retval = PreventCC(eval,tx,preventCCvins,numvins,preventCCvouts,numvouts); if ( retval != 0 ) @@ -185,7 +185,7 @@ std::string FaucetGet(uint64_t txfee) //for (j=0; j<32; j++) // fprintf(stderr,"%02x",hash[j]); //fprintf(stderr," "); - if ( (hash.bytes[0] & 0xff) == 0 && (hash.bytes[31] & 0xff) == 0 ) + if ( (hash.bytes[0] & 0x7f) == 0 && (hash.bytes[31] & 0x7f) == 0 ) { fprintf(stderr,"found valid txid after %d iterations %u\n",i,(uint32_t)time(NULL)); return(rawhex); From 9193afd9269b65664fde52cbe660636c4ea2a086 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Aug 2018 01:25:23 -1100 Subject: [PATCH 38/74] Test --- src/cc/faucet.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cc/faucet.cpp b/src/cc/faucet.cpp index 90c3a7c1c..af5e458ef 100644 --- a/src/cc/faucet.cpp +++ b/src/cc/faucet.cpp @@ -114,7 +114,7 @@ bool FaucetValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx fprintf(stderr,"check faucetget txid %s %02x/%02x\n",uint256_str(str,txid),hash[0],hash[31]); if ( tx.vout[i].nValue != FAUCETSIZE ) return eval->Invalid("invalid faucet output"); - else if ( (hash[0] & 0x7f) != 0 || (hash[31] & 0x7f) != 0 ) + else if ( (hash[0] & 0xff) != 0 || (hash[31] & 0xff) != 0 ) return eval->Invalid("invalid faucetget txid"); retval = PreventCC(eval,tx,preventCCvins,numvins,preventCCvouts,numvouts); if ( retval != 0 ) @@ -185,12 +185,12 @@ std::string FaucetGet(uint64_t txfee) //for (j=0; j<32; j++) // fprintf(stderr,"%02x",hash[j]); //fprintf(stderr," "); - if ( (hash.bytes[0] & 0x7f) == 0 && (hash.bytes[31] & 0x7f) == 0 ) + if ( (hash.bytes[0] & 0xff) == 0 && (hash.bytes[31] & 0xff) == 0 ) { fprintf(stderr,"found valid txid after %d iterations %u\n",i,(uint32_t)time(NULL)); return(rawhex); } - fprintf(stderr,"%02x%02x ",hash.bytes[0],hash.bytes[31]); + //fprintf(stderr,"%02x%02x ",hash.bytes[0],hash.bytes[31]); } } fprintf(stderr,"couldnt generate valid txid %u\n",(uint32_t)time(NULL)); From d614c74afb7ff1dcfd8d78ea6749ba294ffc11dc Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Aug 2018 01:28:08 -1100 Subject: [PATCH 39/74] Test --- src/cc/faucet.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/cc/faucet.cpp b/src/cc/faucet.cpp index af5e458ef..caeb95765 100644 --- a/src/cc/faucet.cpp +++ b/src/cc/faucet.cpp @@ -175,16 +175,12 @@ std::string FaucetGet(uint64_t txfee) for (i=0; i<1000000; i++) { tmpmtx = mtx; - //opret << OP_RETURN << E_MARSHAL(ss << EVAL_FAUCET << 'G' << i); - rawhex = FinalizeCCTx(-1LL,cp,tmpmtx,mypk,txfee,CScript() << OP_RETURN << E_MARSHAL(ss << EVAL_FAUCET << 'G' << i)); // signature changes each time + rawhex = FinalizeCCTx(-1LL,cp,tmpmtx,mypk,txfee,CScript() << OP_RETURN << E_MARSHAL(ss << (uint8_t)EVAL_FAUCET << (uint8_t)'G' << i)); if ( (len= (int32_t)rawhex.size()) > 0 && len < 65536 ) { len >>= 1; decode_hex(buf,len,(char *)rawhex.c_str()); hash = bits256_doublesha256(0,buf,len); - //for (j=0; j<32; j++) - // fprintf(stderr,"%02x",hash[j]); - //fprintf(stderr," "); if ( (hash.bytes[0] & 0xff) == 0 && (hash.bytes[31] & 0xff) == 0 ) { fprintf(stderr,"found valid txid after %d iterations %u\n",i,(uint32_t)time(NULL)); From 815e9937bbbf280a49af3061d61d8b49c680a7df Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Aug 2018 01:39:51 -1100 Subject: [PATCH 40/74] Test --- src/cc/dice.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/cc/dice.cpp b/src/cc/dice.cpp index bae8ad653..912b1de7b 100644 --- a/src/cc/dice.cpp +++ b/src/cc/dice.cpp @@ -1057,16 +1057,19 @@ double DiceStatus(uint64_t txfee,char *planstr,uint256 fundingtxid,uint256 bettx } else { + char str[65]; if ( (vout= myIsutxo_spent(spenttxid,bettxid,1)) >= 0 ) { - if ( GetTransaction(txid,betTx,hashBlock,false) != 0 && GetTransaction(spenttxid,spenttx,hashBlock,false) != 0 && spenttx.vout.size() > 2 ) + fprintf(stderr,"bettx is spent\n"); + if ( GetTransaction(bettxid,betTx,hashBlock,false) != 0 && GetTransaction(spenttxid,spenttx,hashBlock,false) != 0 && spenttx.vout.size() > 2 ) { - char str[65]; fprintf(stderr,"found spenttxid %s\n",uint256_str(str,spenttxid)); if ( betTx.vout[1].scriptPubKey.IsPayToCryptoCondition() == 0 || betTx.vout[2].scriptPubKey.IsPayToCryptoCondition() != 0 || spenttx.vout[2].scriptPubKey != betTx.vout[2].scriptPubKey ) return(0.); else return((double)spenttx.vout[2].nValue/COIN); - } else return(0.); + } + fprintf(stderr,"couldnt find bettx or spenttx %s\n",uint256_str(str,spenttxid)); + return(0.); } else if ( scriptPubKey == fundingPubKey ) res = DiceBetFinish(&result,txfee,planstr,fundingtxid,bettxid,1); From e65c27b52e3476bfcc7cdedf50398fa915f296ac Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Aug 2018 01:47:10 -1100 Subject: [PATCH 41/74] -print --- src/cc/dice.cpp | 4 ++-- src/cc/rewards.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/cc/dice.cpp b/src/cc/dice.cpp index 912b1de7b..a697d238e 100644 --- a/src/cc/dice.cpp +++ b/src/cc/dice.cpp @@ -1060,10 +1060,10 @@ double DiceStatus(uint64_t txfee,char *planstr,uint256 fundingtxid,uint256 bettx char str[65]; if ( (vout= myIsutxo_spent(spenttxid,bettxid,1)) >= 0 ) { - fprintf(stderr,"bettx is spent\n"); + //fprintf(stderr,"bettx is spent\n"); if ( GetTransaction(bettxid,betTx,hashBlock,false) != 0 && GetTransaction(spenttxid,spenttx,hashBlock,false) != 0 && spenttx.vout.size() > 2 ) { - fprintf(stderr,"found spenttxid %s\n",uint256_str(str,spenttxid)); + //fprintf(stderr,"found spenttxid %s\n",uint256_str(str,spenttxid)); if ( betTx.vout[1].scriptPubKey.IsPayToCryptoCondition() == 0 || betTx.vout[2].scriptPubKey.IsPayToCryptoCondition() != 0 || spenttx.vout[2].scriptPubKey != betTx.vout[2].scriptPubKey ) return(0.); else return((double)spenttx.vout[2].nValue/COIN); diff --git a/src/cc/rewards.cpp b/src/cc/rewards.cpp index 3c6b72ff2..f625c04e7 100644 --- a/src/cc/rewards.cpp +++ b/src/cc/rewards.cpp @@ -313,7 +313,7 @@ int64_t AddRewardsInputs(CScript &scriptPubKey,uint64_t maxseconds,struct CCcont vout = (int32_t)it->first.index; if ( it->second.satoshis < 1000000 ) continue; - fprintf(stderr,"(%s) %s/v%d %.8f\n",coinaddr,uint256_str(str,txid),vout,(double)it->second.satoshis/COIN); + //fprintf(stderr,"(%s) %s/v%d %.8f\n",coinaddr,uint256_str(str,txid),vout,(double)it->second.satoshis/COIN); for (j=0; jsecond.satoshis/COIN); if ( maxseconds == 0 && funcid != 'F' && funcid != 'A' && funcid != 'U' ) continue; else if ( maxseconds != 0 && funcid != 'L' ) @@ -333,6 +332,7 @@ int64_t AddRewardsInputs(CScript &scriptPubKey,uint64_t maxseconds,struct CCcont if ( CCduration(numblocks,txid) < maxseconds ) continue; } + fprintf(stderr,"maxseconds.%d (%c) %.8f %.8f\n",(int32_t)maxseconds,funcid,(double)tx.vout[vout].nValue/COIN,(double)it->second.satoshis/COIN); if ( total != 0 && maxinputs != 0 ) { if ( maxseconds != 0 ) From fefaa934a9777c27f330dc9afc6b83f573684621 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Aug 2018 01:51:22 -1100 Subject: [PATCH 42/74] Cap reward to a doubling --- src/cc/rewards.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/cc/rewards.cpp b/src/cc/rewards.cpp index f625c04e7..d3df9233b 100644 --- a/src/cc/rewards.cpp +++ b/src/cc/rewards.cpp @@ -80,6 +80,8 @@ int64_t RewardsCalc(int64_t amount,uint256 txid,uint64_t APR,uint64_t minseconds if ( 0 ) // amount * APR * duration / COIN * 100 * 365*24*3600 reward = (((amount * APR) / COIN) * duration) / (365*24*3600LL * 100); else reward = (((amount * duration) / (365 * 24 * 3600LL)) * (APR / 1000000)) / 10000; + if ( reward > amount ) + reward = amount; fprintf(stderr,"amount %.8f %.8f %llu -> duration.%llu reward %.8f vals %.8f %.8f\n",(double)amount/COIN,((double)amount * APR)/COIN,(long long)((amount * APR) / (COIN * 365*24*3600)),(long long)duration,(double)reward/COIN,(double)((amount * duration) / (365 * 24 * 3600LL))/COIN,(double)(((amount * duration) / (365 * 24 * 3600LL)) * (APR / 1000000))/COIN); return(reward); } From 87c119b71c63ab787617e162f935452e4ad20329 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Aug 2018 02:29:44 -1100 Subject: [PATCH 43/74] Add pub key to faucet get I-return --- src/cc/faucet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/faucet.cpp b/src/cc/faucet.cpp index caeb95765..e357310ff 100644 --- a/src/cc/faucet.cpp +++ b/src/cc/faucet.cpp @@ -175,7 +175,7 @@ std::string FaucetGet(uint64_t txfee) for (i=0; i<1000000; i++) { tmpmtx = mtx; - rawhex = FinalizeCCTx(-1LL,cp,tmpmtx,mypk,txfee,CScript() << OP_RETURN << E_MARSHAL(ss << (uint8_t)EVAL_FAUCET << (uint8_t)'G' << i)); + rawhex = FinalizeCCTx(-1LL,cp,tmpmtx,mypk,txfee,CScript() << OP_RETURN << E_MARSHAL(ss << (uint8_t)EVAL_FAUCET << (uint8_t)'G' << mypk << i)); if ( (len= (int32_t)rawhex.size()) > 0 && len < 65536 ) { len >>= 1; From af3024a34478e53ae103fd18302af00504408ecb Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Aug 2018 02:44:59 -1100 Subject: [PATCH 44/74] Faucet get only for first txid --- src/cc/faucet.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/cc/faucet.cpp b/src/cc/faucet.cpp index e357310ff..9c0fc0cb0 100644 --- a/src/cc/faucet.cpp +++ b/src/cc/faucet.cpp @@ -79,7 +79,8 @@ bool FaucetExactAmounts(struct CCcontract_info *cp,Eval* eval,const CTransaction bool FaucetValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx) { - int32_t numvins,numvouts,preventCCvins,preventCCvouts,i; bool retval; uint256 txid; uint8_t hash[32]; char str[65]; + int32_t numvins,numvouts,preventCCvins,preventCCvouts,i; bool retval; uint256 txid; uint8_t hash[32]; char str[65],destaddr[64]; + std::vector > txids; numvins = tx.vin.size(); numvouts = tx.vout.size(); preventCCvins = preventCCvouts = -1; @@ -116,6 +117,10 @@ bool FaucetValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx return eval->Invalid("invalid faucet output"); else if ( (hash[0] & 0xff) != 0 || (hash[31] & 0xff) != 0 ) return eval->Invalid("invalid faucetget txid"); + Getscriptaddress(destaddr,tx.vout[i].scriptPubKey); + SetCCtxids(txids,destaddr); + for (std::vector >::const_iterator it=txids.begin(); it!=txids.end(); it++) + return eval->Invalid("faucet is only for unused addresses"); retval = PreventCC(eval,tx,preventCCvins,numvins,preventCCvouts,numvouts); if ( retval != 0 ) fprintf(stderr,"faucetget validated\n"); From 4b3021d80bb0b124f079545f3218f90f1346dabc Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Aug 2018 05:07:28 -1100 Subject: [PATCH 45/74] Fix mempool zombie --- src/cc/faucet.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/cc/faucet.cpp b/src/cc/faucet.cpp index 9c0fc0cb0..827dc2716 100644 --- a/src/cc/faucet.cpp +++ b/src/cc/faucet.cpp @@ -79,7 +79,7 @@ bool FaucetExactAmounts(struct CCcontract_info *cp,Eval* eval,const CTransaction bool FaucetValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx) { - int32_t numvins,numvouts,preventCCvins,preventCCvouts,i; bool retval; uint256 txid; uint8_t hash[32]; char str[65],destaddr[64]; + int32_t numvins,numvouts,preventCCvins,preventCCvouts,i,j=0; bool retval; uint256 txid; uint8_t hash[32]; char str[65],destaddr[64]; std::vector > txids; numvins = tx.vin.size(); numvouts = tx.vout.size(); @@ -120,7 +120,10 @@ bool FaucetValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx Getscriptaddress(destaddr,tx.vout[i].scriptPubKey); SetCCtxids(txids,destaddr); for (std::vector >::const_iterator it=txids.begin(); it!=txids.end(); it++) - return eval->Invalid("faucet is only for unused addresses"); + { + if ( ++j > 1 ) + return eval->Invalid("faucet is only for unused addresses"); + } retval = PreventCC(eval,tx,preventCCvins,numvins,preventCCvouts,numvouts); if ( retval != 0 ) fprintf(stderr,"faucetget validated\n"); From f344c6933832aa2be566282366af774076ac7e86 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Aug 2018 05:18:01 -1100 Subject: [PATCH 46/74] +prints --- src/cc/rewards.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cc/rewards.cpp b/src/cc/rewards.cpp index d3df9233b..7bbcb3065 100644 --- a/src/cc/rewards.cpp +++ b/src/cc/rewards.cpp @@ -567,9 +567,9 @@ std::string RewardsLock(uint64_t txfee,char *planstr,uint256 fundingtxid,int64_t mtx.vout.push_back(MakeCC1vout(cp->evalcode,deposit,rewardspk)); mtx.vout.push_back(CTxOut(txfee,CScript() << ParseHex(HexStr(mypk)) << OP_CHECKSIG)); return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeRewardsOpRet('L',sbits,fundingtxid))); - } else fprintf(stderr,"cant find enough inputs %.8f note enough for %.8f\n",(double)funding/COIN,(double)deposit/COIN); + } else fprintf(stderr,"cant find enough inputs %.8f not enough for %.8f, make sure you imported privkey for the -pubkey address\n",(double)funding/COIN,(double)deposit/COIN); } - fprintf(stderr,"cant find rewards inputs\n"); + fprintf(stderr,"cant find rewards inputs funding %.8f locked %.8f vs deposit %.8f\n",(double)funding/COIN,(double)lockedfunds/COIN,(double)deposit/COIN); return(""); } From 8d13c0ef190900c64c55bd1eaedfff478d4df8d8 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Aug 2018 07:41:28 -1100 Subject: [PATCH 47/74] Consensus stable faucet get constraint --- src/cc/faucet.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/cc/faucet.cpp b/src/cc/faucet.cpp index 827dc2716..142100c70 100644 --- a/src/cc/faucet.cpp +++ b/src/cc/faucet.cpp @@ -79,7 +79,7 @@ bool FaucetExactAmounts(struct CCcontract_info *cp,Eval* eval,const CTransaction bool FaucetValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx) { - int32_t numvins,numvouts,preventCCvins,preventCCvouts,i,j=0; bool retval; uint256 txid; uint8_t hash[32]; char str[65],destaddr[64]; + int32_t numvins,numvouts,preventCCvins,preventCCvouts,i,numblocks; bool retval; uint256 txid; uint8_t hash[32]; char str[65],destaddr[64]; std::vector > txids; numvins = tx.vin.size(); numvouts = tx.vout.size(); @@ -121,8 +121,8 @@ bool FaucetValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx SetCCtxids(txids,destaddr); for (std::vector >::const_iterator it=txids.begin(); it!=txids.end(); it++) { - if ( ++j > 1 ) - return eval->Invalid("faucet is only for unused addresses"); + if ( CCduration(numblocks,it->first.txhash) > 0 && numblocks > 3 ) + return eval->Invalid("faucet is only for brand new addresses"); } retval = PreventCC(eval,tx,preventCCvins,numvins,preventCCvouts,numvouts); if ( retval != 0 ) From 5159767093007890c1c5cd0c911193356a760e37 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Aug 2018 08:09:21 -1100 Subject: [PATCH 48/74] +print --- src/cc/faucet.cpp | 6 +++++- src/cc/rewards.cpp | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/cc/faucet.cpp b/src/cc/faucet.cpp index 142100c70..a467ed311 100644 --- a/src/cc/faucet.cpp +++ b/src/cc/faucet.cpp @@ -121,8 +121,12 @@ bool FaucetValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx SetCCtxids(txids,destaddr); for (std::vector >::const_iterator it=txids.begin(); it!=txids.end(); it++) { + //int height = it->first.blockHeight; if ( CCduration(numblocks,it->first.txhash) > 0 && numblocks > 3 ) - return eval->Invalid("faucet is only for brand new addresses"); + { + fprintf(stderr,"would return error %s numblocks.%d ago\n",uint256_str(str,it->first.txhash),numblocks); + //return eval->Invalid("faucet is only for brand new addresses"); + } } retval = PreventCC(eval,tx,preventCCvins,numvins,preventCCvouts,numvouts); if ( retval != 0 ) diff --git a/src/cc/rewards.cpp b/src/cc/rewards.cpp index 7bbcb3065..c98b42a17 100644 --- a/src/cc/rewards.cpp +++ b/src/cc/rewards.cpp @@ -69,7 +69,7 @@ int64_t RewardsCalc(int64_t amount,uint256 txid,uint64_t APR,uint64_t minseconds,uint64_t maxseconds,uint64_t mindeposit) { int32_t numblocks; uint64_t duration,reward = 0; - fprintf(stderr,"minseconds %llu maxseconds %llu\n",(long long)minseconds,(long long)maxseconds); + //fprintf(stderr,"minseconds %llu maxseconds %llu\n",(long long)minseconds,(long long)maxseconds); if ( (duration= CCduration(numblocks,txid)) < minseconds ) { fprintf(stderr,"duration %llu < minseconds %llu\n",(long long)duration,(long long)minseconds); From c4a13b6f0d357265bafefd3257c63b1106835586 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Aug 2018 08:10:29 -1100 Subject: [PATCH 49/74] Test --- src/cc/faucet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/faucet.cpp b/src/cc/faucet.cpp index a467ed311..ba87e06b3 100644 --- a/src/cc/faucet.cpp +++ b/src/cc/faucet.cpp @@ -125,7 +125,7 @@ bool FaucetValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx if ( CCduration(numblocks,it->first.txhash) > 0 && numblocks > 3 ) { fprintf(stderr,"would return error %s numblocks.%d ago\n",uint256_str(str,it->first.txhash),numblocks); - //return eval->Invalid("faucet is only for brand new addresses"); + return eval->Invalid("faucet is only for brand new addresses"); } } retval = PreventCC(eval,tx,preventCCvins,numvins,preventCCvouts,numvouts); From 59e96a42569edfa7f283590e96e678cd28b3f3e6 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Aug 2018 08:19:58 -1100 Subject: [PATCH 50/74] -print --- src/cc/faucet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/faucet.cpp b/src/cc/faucet.cpp index ba87e06b3..0ab51ff13 100644 --- a/src/cc/faucet.cpp +++ b/src/cc/faucet.cpp @@ -124,7 +124,7 @@ bool FaucetValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx //int height = it->first.blockHeight; if ( CCduration(numblocks,it->first.txhash) > 0 && numblocks > 3 ) { - fprintf(stderr,"would return error %s numblocks.%d ago\n",uint256_str(str,it->first.txhash),numblocks); + //fprintf(stderr,"would return error %s numblocks.%d ago\n",uint256_str(str,it->first.txhash),numblocks); return eval->Invalid("faucet is only for brand new addresses"); } } From 8e0ff2b732ad421148f71160d41e44e8f201d812 Mon Sep 17 00:00:00 2001 From: "Jonathan \"Duke\" Leto" Date: Wed, 15 Aug 2018 23:24:59 +0200 Subject: [PATCH 51/74] Test refactoring, more tests, and lots of error checking improvements and uint64_t fixes --- qa/rpc-tests/cryptoconditions.py | 26 +++-- src/cc/rewards.cpp | 44 ++++++--- src/wallet/rpcwallet.cpp | 165 ++++++++++++++++++++----------- 3 files changed, 158 insertions(+), 77 deletions(-) diff --git a/qa/rpc-tests/cryptoconditions.py b/qa/rpc-tests/cryptoconditions.py index ad7ee7467..8cfa4fd2a 100755 --- a/qa/rpc-tests/cryptoconditions.py +++ b/qa/rpc-tests/cryptoconditions.py @@ -46,11 +46,19 @@ class CryptoConditionsTest (BitcoinTestFramework): ]] ) self.is_network_split = split + self.rpc = self.nodes[0] self.sync_all() print("Done setting up network") + def send_and_mine(self, xtn): + txid = self.rpc.sendrawtransaction(xtn) + assert txid, 'got txid' + # we need the tx above to be confirmed in the next block + self.rpc.generate(1) + return txid + def run_faucet_tests(self): - rpc = self.nodes[0] + rpc = self.rpc # basic sanity tests result = rpc.getwalletinfo() @@ -90,9 +98,6 @@ class CryptoConditionsTest (BitcoinTestFramework): # we need the tx above to be confirmed in the next block rpc.generate(1) - # clear the rawmempool - result = rpc.getrawmempool() - result = rpc.getwalletinfo() balance2 = result['balance'] # make sure our balance is less now @@ -145,13 +150,18 @@ class CryptoConditionsTest (BitcoinTestFramework): for x in ['AssetsCCaddress', 'myCCaddress', 'Assetsmarker', 'myaddress', 'CCaddress']: assert_equal(result[x][0], 'R') - result = rpc.tokencreate("DUKE", "1987.420", "duke") - assert_equal(result['result'], 'success') - # there are no tokens created yet result = rpc.tokenlist() assert_equal(result, []) + result = rpc.tokencreate("DUKE", "1987.420", "duke") + assert_equal(result['result'], 'success') + self.send_and_mine(result['hex']) + + result = rpc.tokenlist() + tokenid = result[0] + assert(tokenid, "got tokenid") + # there are no token orders yet result = rpc.tokenorders() assert_equal(result, []) @@ -166,6 +176,7 @@ class CryptoConditionsTest (BitcoinTestFramework): result = rpc.tokeninfo(self.pubkey) assert_equal(result['result'], 'error') + def run_rewards_tests(self): rpc = self.nodes[0] result = rpc.rewardsaddress() @@ -272,7 +283,6 @@ class CryptoConditionsTest (BitcoinTestFramework): print("Importing privkey") rpc.importprivkey(self.privkey) - self.run_faucet_tests() self.run_rewards_tests() self.run_dice_tests() diff --git a/src/cc/rewards.cpp b/src/cc/rewards.cpp index 9314f7c94..9b58f4bf3 100644 --- a/src/cc/rewards.cpp +++ b/src/cc/rewards.cpp @@ -66,6 +66,8 @@ */ +extern std::string CCerror; + int64_t RewardsCalc(int64_t amount,uint256 txid,uint64_t APR,uint64_t minseconds,uint64_t maxseconds,uint64_t mindeposit) { int32_t numblocks; uint64_t duration,reward = 0; @@ -532,6 +534,7 @@ std::string RewardsUnlock(uint64_t txfee,char *planstr,uint256 fundingtxid,uint2 if ( RewardsPlanExists(cp,sbits,rewardspk,APR,minseconds,maxseconds,mindeposit) == 0 ) { fprintf(stderr,"Rewards plan %s doesnt exist\n",planstr); + CCerror = "Rewards plan does not exist"; return(""); } fprintf(stderr,"APR %.8f minseconds.%llu maxseconds.%llu mindeposit %.8f\n",(double)APR/COIN,(long long)minseconds,(long long)maxseconds,(double)mindeposit/COIN); @@ -543,6 +546,7 @@ std::string RewardsUnlock(uint64_t txfee,char *planstr,uint256 fundingtxid,uint2 if ( (amount= CCutxovalue(coinaddr,locktxid,0)) == 0 ) { fprintf(stderr,"%s locktxid/v0 is spent\n",coinaddr); + CCerror = "locktxid/v0 is spent"; return(""); } if ( GetTransaction(locktxid,tx,hashBlock,false) != 0 && tx.vout.size() > 0 && tx.vout[1].scriptPubKey.IsPayToCryptoCondition() == 0 ) @@ -553,21 +557,37 @@ std::string RewardsUnlock(uint64_t txfee,char *planstr,uint256 fundingtxid,uint2 else { fprintf(stderr,"%s no normal vout.1 in locktxid\n",coinaddr); + CCerror = "no normal vout.1 in locktxid"; return(""); } } - if ( amount > 0 && (reward= RewardsCalc(amount,mtx.vin[0].prevout.hash,APR,minseconds,maxseconds,mindeposit)) > txfee && scriptPubKey.size() > 0 ) - { - if ( (inputs= AddRewardsInputs(ignore,1,cp,mtx,rewardspk,reward+txfee,30,sbits,fundingtxid)) > 0 ) - { - if ( inputs >= (reward + 2*txfee) ) - CCchange = (inputs - (reward + txfee)); - fprintf(stderr,"inputs %.8f CCchange %.8f amount %.8f reward %.8f\n",(double)inputs/COIN,(double)CCchange/COIN,(double)amount/COIN,(double)reward/COIN); - mtx.vout.push_back(MakeCC1vout(cp->evalcode,CCchange,rewardspk)); - mtx.vout.push_back(CTxOut(amount+reward,scriptPubKey)); - return(FinalizeCCTx(-1LL,cp,mtx,mypk,txfee,EncodeRewardsOpRet('U',sbits,fundingtxid))); - } - fprintf(stderr,"cant find enough rewards inputs\n"); + if ( amount > 0 ) { + reward = RewardsCalc(amount,mtx.vin[0].prevout.hash,APR,minseconds,maxseconds,mindeposit); + if (scriptPubKey.size() > 0) { + if (reward > txfee) { + if ( (inputs= AddRewardsInputs(ignore,1,cp,mtx,rewardspk,reward+txfee,30,sbits,fundingtxid)) > 0 ) + { + if ( inputs >= (reward + 2*txfee) ) + CCchange = (inputs - (reward + txfee)); + fprintf(stderr,"inputs %.8f CCchange %.8f amount %.8f reward %.8f\n",(double)inputs/COIN,(double)CCchange/COIN,(double)amount/COIN,(double)reward/COIN); + mtx.vout.push_back(MakeCC1vout(cp->evalcode,CCchange,rewardspk)); + mtx.vout.push_back(CTxOut(amount+reward,scriptPubKey)); + return(FinalizeCCTx(-1LL,cp,mtx,mypk,txfee,EncodeRewardsOpRet('U',sbits,fundingtxid))); + } + CCerror = "cant find enough rewards inputs"; + fprintf(stderr,"%s\n", CCerror.c_str()); + } else { + // strprintf? + CCerror = strprintf("reward %.8f is <= the transaction fee", reward); + fprintf(stderr,"%s\n", CCerror.c_str()); + } + } else { + CCerror = "invalid scriptPubKey"; + fprintf(stderr,"%s\n", CCerror.c_str()); + } + } else { + CCerror = "amount must be positive"; + fprintf(stderr,"%s\n", CCerror.c_str()); } fprintf(stderr,"amount %.8f -> reward %.8f\n",(double)amount/COIN,(double)reward/COIN); return(""); diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 1654be8ba..cbd08dd6c 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -38,6 +38,9 @@ #include +#define ERR_RESULT(x) result.push_back(Pair("result", "error")); \ + result.push_back(Pair("error", x)); + using namespace std; using namespace libzcash; @@ -49,6 +52,8 @@ uint32_t komodo_segid32(char *coinaddr); int64_t nWalletUnlockTime; static CCriticalSection cs_nWalletUnlockTime; +//TODO: find a better place for this +std::string CCerror; // Private method: UniValue z_getoperationstatus_IMPL(const UniValue&, bool); @@ -5074,7 +5079,10 @@ UniValue rewardsunlock(const UniValue& params, bool fHelp) txid = Parseuint256((char *)params[2].get_str().c_str()); else memset(&txid,0,sizeof(txid)); hex = RewardsUnlock(0,name,fundingtxid,txid); - if ( hex.size() > 0 ) + if (CCerror != "") { + result.push_back(Pair("result", "error")); + result.push_back(Pair("error", CCerror)); + } else if ( hex.size() > 0 ) { result.push_back(Pair("result", "success")); result.push_back(Pair("hex", hex)); @@ -5194,8 +5202,7 @@ UniValue faucetget(const UniValue& params, bool fHelp) const CKeyStore& keystore = *pwalletMain; LOCK2(cs_main, pwalletMain->cs_wallet); hex = FaucetGet(0); - if ( hex.size() > 0 ) - { + if ( hex.size() > 0 ) { result.push_back(Pair("result", "success")); result.push_back(Pair("hex", hex)); } else { @@ -5221,17 +5228,22 @@ UniValue dicefund(const UniValue& params, bool fHelp) maxodds = atol(params[4].get_str().c_str()); timeoutblocks = atol(params[5].get_str().c_str()); hex = DiceCreateFunding(0,name,funds,minbet,maxbet,maxodds,timeoutblocks); - if ( hex.size() > 0 ) - { + if (CCerror != "") { + result.push_back(Pair("result", "error")); + result.push_back(Pair("error", CCerror)); + } else if ( hex.size() > 0 ) { result.push_back(Pair("result", "success")); result.push_back(Pair("hex", hex)); - } else result.push_back(Pair("error", "couldnt create dice funding transaction")); + } else { + result.push_back(Pair("error", "couldnt create dice funding transaction")); + result.push_back(Pair("result", "error")); + } return(result); } UniValue diceaddfunds(const UniValue& params, bool fHelp) { - UniValue result(UniValue::VOBJ); char *name; uint256 fundingtxid; uint64_t amount; std::string hex; + UniValue result(UniValue::VOBJ); char *name; uint256 fundingtxid; int64_t amount; std::string hex; if ( fHelp || params.size() != 3 ) throw runtime_error("diceaddfunds name fundingtxid amount\n"); if ( ensure_CCrequirements() < 0 ) @@ -5241,18 +5253,28 @@ UniValue diceaddfunds(const UniValue& params, bool fHelp) name = (char *)params[0].get_str().c_str(); fundingtxid = Parseuint256((char *)params[1].get_str().c_str()); amount = atof(params[2].get_str().c_str()) * COIN; - hex = DiceAddfunding(0,name,fundingtxid,amount); - if ( hex.size() > 0 ) - { - result.push_back(Pair("result", "success")); - result.push_back(Pair("hex", hex)); - } else result.push_back(Pair("error", "couldnt create dice addfunding transaction")); + if ( amount > 0 ) { + hex = DiceAddfunding(0,name,fundingtxid,amount); + if (CCerror != "") { + result.push_back(Pair("result", "error")); + result.push_back(Pair("error", CCerror)); + } else if ( hex.size() > 0 ) { + result.push_back(Pair("result", "success")); + result.push_back(Pair("hex", hex)); + } else { + result.push_back(Pair("result", "error")); + result.push_back(Pair("error", "couldnt create dice addfunding transaction")); + } + } else { + result.push_back(Pair("result", "error")); + result.push_back(Pair("error", "amount must be positive")); + } return(result); } UniValue dicebet(const UniValue& params, bool fHelp) { - UniValue result(UniValue::VOBJ); std::string hex; uint256 fundingtxid; uint64_t amount,odds; char *name; + UniValue result(UniValue::VOBJ); std::string hex; uint256 fundingtxid; int64_t amount,odds; char *name; if ( fHelp || params.size() != 4 ) throw runtime_error("dicebet name fundingtxid amount odds\n"); if ( ensure_CCrequirements() < 0 ) @@ -5263,18 +5285,24 @@ UniValue dicebet(const UniValue& params, bool fHelp) fundingtxid = Parseuint256((char *)params[1].get_str().c_str()); amount = atof(params[2].get_str().c_str()) * COIN; odds = atol(params[3].get_str().c_str()); - hex = DiceBet(0,name,fundingtxid,amount,odds); - if ( hex.size() > 0 ) - { - result.push_back(Pair("result", "success")); - result.push_back(Pair("hex", hex)); - } else result.push_back(Pair("error", "couldnt create faucet get transaction")); + if (amount > 0 && odds > 0) { + hex = DiceBet(0,name,fundingtxid,amount,odds); + if ( hex.size() > 0 ) + { + result.push_back(Pair("result", "success")); + result.push_back(Pair("hex", hex)); + } else { + ERR_RESULT("couldnt create faucet get transaction"); + } + } else { + ERR_RESULT("amount and odds must be positive"); + } return(result); } UniValue dicefinish(const UniValue& params, bool fHelp) { - UniValue result(UniValue::VOBJ); char *name; uint256 fundingtxid,bettxid; uint64_t amount; std::string hex; int32_t r; + UniValue result(UniValue::VOBJ); char *name; uint256 fundingtxid,bettxid; std::string hex; int32_t r; if ( fHelp || params.size() != 3 ) throw runtime_error("dicefinish name fundingtxid bettxid\n"); if ( ensure_CCrequirements() < 0 ) @@ -5295,7 +5323,7 @@ UniValue dicefinish(const UniValue& params, bool fHelp) UniValue dicestatus(const UniValue& params, bool fHelp) { - UniValue result(UniValue::VOBJ); char *name; uint256 fundingtxid,bettxid; uint64_t amount; std::string status; double winnings; + UniValue result(UniValue::VOBJ); char *name; uint256 fundingtxid,bettxid; std::string status; double winnings; if ( fHelp || (params.size() != 2 && params.size() != 3) ) throw runtime_error("dicestatus name fundingtxid bettxid\n"); if ( ensure_CCrequirements() < 0 ) @@ -5435,7 +5463,7 @@ UniValue tokencreate(const UniValue& params, bool fHelp) UniValue tokentransfer(const UniValue& params, bool fHelp) { - UniValue result(UniValue::VOBJ); std::string hex; uint64_t amount; uint256 tokenid; + UniValue result(UniValue::VOBJ); std::string hex; int64_t amount; uint256 tokenid; if ( fHelp || params.size() != 3 ) throw runtime_error("tokentransfer tokenid destpubkey amount\n"); if ( ensure_CCrequirements() < 0 ) @@ -5446,17 +5474,21 @@ UniValue tokentransfer(const UniValue& params, bool fHelp) std::vector pubkey(ParseHex(params[1].get_str().c_str())); amount = atol(params[2].get_str().c_str()); hex = AssetTransfer(0,tokenid,pubkey,amount); - if ( hex.size() > 0 ) - { - result.push_back(Pair("result", "success")); - result.push_back(Pair("hex", hex)); - } else result.push_back(Pair("error", "couldnt transfer assets")); + if (amount > 0) { + if ( hex.size() > 0 ) + { + result.push_back(Pair("result", "success")); + result.push_back(Pair("hex", hex)); + } else result.push_back(Pair("error", "couldnt transfer assets")); + } else { + ERR_RESULT("amount must be positive"); + } return(result); } UniValue tokenbid(const UniValue& params, bool fHelp) { - UniValue result(UniValue::VOBJ); uint64_t bidamount,numtokens; std::string hex; double price; uint256 tokenid; + UniValue result(UniValue::VOBJ); int64_t bidamount,numtokens; std::string hex; double price; uint256 tokenid; if ( fHelp || params.size() != 3 ) throw runtime_error("tokenbid numtokens tokenid price\n"); if ( ensure_CCrequirements() < 0 ) @@ -5468,11 +5500,15 @@ UniValue tokenbid(const UniValue& params, bool fHelp) price = atof(params[2].get_str().c_str()); bidamount = (price * numtokens) * COIN + 0.0000000049999; hex = CreateBuyOffer(0,bidamount,tokenid,numtokens); - if ( hex.size() > 0 ) - { - result.push_back(Pair("result", "success")); - result.push_back(Pair("hex", hex)); - } else result.push_back(Pair("error", "couldnt create bid")); + if (price > 0 && numtokens > 0) { + if ( hex.size() > 0 ) + { + result.push_back(Pair("result", "success")); + result.push_back(Pair("hex", hex)); + } else result.push_back(Pair("error", "couldnt create bid")); + } else { + ERR_RESULT("price and numtokens must be positive"); + } return(result); } @@ -5519,7 +5555,7 @@ UniValue tokenfillbid(const UniValue& params, bool fHelp) UniValue tokenask(const UniValue& params, bool fHelp) { - UniValue result(UniValue::VOBJ); uint64_t askamount,numtokens; std::string hex; double price; uint256 tokenid; + UniValue result(UniValue::VOBJ); int64_t askamount,numtokens; std::string hex; double price; uint256 tokenid; if ( fHelp || params.size() != 3 ) throw runtime_error("tokenask numtokens tokenid price\n"); if ( ensure_CCrequirements() < 0 ) @@ -5531,18 +5567,22 @@ UniValue tokenask(const UniValue& params, bool fHelp) price = atof(params[2].get_str().c_str()); askamount = (price * numtokens) * COIN + 0.0000000049999; hex = CreateSell(0,numtokens,tokenid,askamount); - if ( hex.size() > 0 ) - { - result.push_back(Pair("result", "success")); - result.push_back(Pair("hex", hex)); - } else result.push_back(Pair("error", "couldnt create ask")); + if (price > 0 && numtokens > 0) { + if ( hex.size() > 0 ) + { + result.push_back(Pair("result", "success")); + result.push_back(Pair("hex", hex)); + } else result.push_back(Pair("error", "couldnt create ask")); + } else { + ERR_RESULT("price and numtokens must be positive"); + } return(result); } UniValue tokenswapask(const UniValue& params, bool fHelp) { static uint256 zeroid; - UniValue result(UniValue::VOBJ); uint64_t askamount,numtokens; std::string hex; double price; uint256 tokenid,otherid; + UniValue result(UniValue::VOBJ); int64_t askamount,numtokens; std::string hex; double price; uint256 tokenid,otherid; if ( fHelp || params.size() != 4 ) throw runtime_error("tokenswapask numtokens tokenid otherid price\n"); if ( ensure_CCrequirements() < 0 ) @@ -5555,11 +5595,15 @@ UniValue tokenswapask(const UniValue& params, bool fHelp) price = atof(params[3].get_str().c_str()); askamount = (price * numtokens); hex = CreateSwap(0,numtokens,tokenid,otherid,askamount); - if ( hex.size() > 0 ) - { - result.push_back(Pair("result", "success")); - result.push_back(Pair("hex", hex)); - } else result.push_back(Pair("error", "couldnt create swap")); + if (price > 0 && numtokens > 0) { + if ( hex.size() > 0 ) + { + result.push_back(Pair("result", "success")); + result.push_back(Pair("hex", hex)); + } else result.push_back(Pair("error", "couldnt create swap")); + } else { + ERR_RESULT("price and numtokens must be positive"); + } return(result); } @@ -5597,18 +5641,22 @@ UniValue tokenfillask(const UniValue& params, bool fHelp) asktxid = Parseuint256((char *)params[1].get_str().c_str()); fillunits = atol(params[2].get_str().c_str()); hex = FillSell(0,tokenid,zeroid,asktxid,fillunits); - if ( hex.size() > 0 ) - { - result.push_back(Pair("result", "success")); - result.push_back(Pair("hex", hex)); - } else result.push_back(Pair("error", "couldnt fill bid")); + if (fillunits > 0) { + if ( hex.size() > 0) + { + result.push_back(Pair("result", "success")); + result.push_back(Pair("hex", hex)); + } else ERR_RESULT("couldnt fill bid"); + } else { + ERR_RESULT("fillunits must be positive"); + } return(result); } UniValue tokenfillswap(const UniValue& params, bool fHelp) { static uint256 zeroid; - UniValue result(UniValue::VOBJ); uint64_t fillunits; std::string hex; uint256 tokenid,otherid,asktxid; + UniValue result(UniValue::VOBJ); int64_t fillunits; std::string hex; uint256 tokenid,otherid,asktxid; if ( fHelp || params.size() != 4 ) throw runtime_error("tokenfillswap tokenid otherid asktxid fillunits\n"); if ( ensure_CCrequirements() < 0 ) @@ -5620,11 +5668,14 @@ UniValue tokenfillswap(const UniValue& params, bool fHelp) asktxid = Parseuint256((char *)params[2].get_str().c_str()); fillunits = atol(params[3].get_str().c_str()); hex = FillSell(0,tokenid,otherid,asktxid,fillunits); - if ( hex.size() > 0 ) - { - result.push_back(Pair("result", "success")); - result.push_back(Pair("hex", hex)); - } else result.push_back(Pair("error", "couldnt fill bid")); + if (fillunits > 0) { + if ( hex.size() > 0 ) { + result.push_back(Pair("result", "success")); + result.push_back(Pair("hex", hex)); + } else ERR_RESULT("couldnt fill bid"); + } else { + ERR_RESULT("fillunits must be positive"); + } return(result); } From 764eb2e5be573ffea8a82cb0dfe46d69fc66c422 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Aug 2018 22:10:55 -1100 Subject: [PATCH 52/74] +dice attack vector --- src/cc/dice.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/cc/dice.cpp b/src/cc/dice.cpp index a697d238e..c2f055d8d 100644 --- a/src/cc/dice.cpp +++ b/src/cc/dice.cpp @@ -79,6 +79,12 @@ winner: timeout: same as winner, just without hentropy or proof +WARNING: there is an attack vector that precludes betting any large amounts, it goes as follows: + 1. do dicebet to get the house entropy revealed + 2. calculate bettor entropy that would win against the house entropy + 3. reorg the chain and make a big bet using the winning entropy calculated in 2. + + In order to mitigate this, the disclosure of the house entropy needs to be delayed beyond a reasonable reorg depth (notarization). It is recommended for production dice game with significant amounts of money to use such a delayed disclosure method. */ #include "../compat/endian.h" From 291a646a84610ba081019877c81a32f6c97256d2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 15 Aug 2018 23:47:37 -1100 Subject: [PATCH 53/74] Fix bid fill --- src/cc/CCassetsCore.cpp | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/cc/CCassetsCore.cpp b/src/cc/CCassetsCore.cpp index da505db9c..9ef08348e 100644 --- a/src/cc/CCassetsCore.cpp +++ b/src/cc/CCassetsCore.cpp @@ -58,16 +58,20 @@ bool ValidateBidRemainder(int64_t remaining_units,int64_t remaining_nValue,int64 } else { - unitprice = (orig_nValue * COIN) / totalunits; - recvunitprice = (received_nValue * COIN) / paidunits; + //unitprice = (orig_nValue * COIN) / totalunits; + //recvunitprice = (received_nValue * COIN) / paidunits; + //if ( remaining_units != 0 ) + // newunitprice = (remaining_nValue * COIN) / remaining_units; + unitprice = (orig_nValue / totalunits); + recvunitprice = (received_nValue / paidunits); if ( remaining_units != 0 ) - newunitprice = (remaining_nValue * COIN) / remaining_units; + newunitprice = (remaining_nValue / remaining_units); if ( recvunitprice < unitprice ) { - fprintf(stderr,"error recvunitprice %.16f < %.16f unitprice, new unitprice %.16f\n",(double)recvunitprice/(COIN*COIN),(double)unitprice/(COIN*COIN),(double)newunitprice/(COIN*COIN)); + fprintf(stderr,"error recvunitprice %.16f < %.16f unitprice, new unitprice %.16f\n",(double)recvunitprice/(COIN),(double)unitprice/(COIN),(double)newunitprice/(COIN)); return(false); } - fprintf(stderr,"orig %llu total %llu, recv %llu paid %llu,recvunitprice %.16f >= %.16f unitprice, new unitprice %.16f\n",(long long)orig_nValue,(long long)totalunits,(long long)received_nValue,(long long)paidunits,(double)recvunitprice/(COIN*COIN),(double)unitprice/(COIN*COIN),(double)newunitprice/(COIN*COIN)); + fprintf(stderr,"orig %llu total %llu, recv %llu paid %llu,recvunitprice %.16f >= %.16f unitprice, new unitprice %.16f\n",(long long)orig_nValue,(long long)totalunits,(long long)received_nValue,(long long)paidunits,(double)recvunitprice/(COIN),(double)unitprice/(COIN),(double)newunitprice/(COIN)); } return(true); } @@ -89,8 +93,10 @@ bool SetBidFillamounts(int64_t &received_nValue,int64_t &remaining_units,int64_t return(true); } remaining_units = (totalunits - paidunits); - unitprice = (orig_nValue * COIN) / totalunits; - received_nValue = (paidunits * unitprice) / COIN; + //unitprice = (orig_nValue * COIN) / totalunits; + //received_nValue = (paidunits * unitprice) / COIN; + unitprice = (orig_nValue / totalunits); + received_nValue = (paidunits * unitprice); if ( unitprice > 0 && received_nValue > 0 && received_nValue <= orig_nValue ) { remaining_nValue = (orig_nValue - received_nValue); From f6160f58c13f4979c25e7b70f7a7d2ad310efd98 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 16 Aug 2018 01:06:06 -1100 Subject: [PATCH 54/74] Add rpc error checking --- src/wallet/rpcwallet.cpp | 40 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 5c16c3b9c..977aee98d 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -5441,6 +5441,11 @@ UniValue tokentransfer(const UniValue& params, bool fHelp) tokenid = Parseuint256((char *)params[0].get_str().c_str()); std::vector pubkey(ParseHex(params[1].get_str().c_str())); amount = atol(params[2].get_str().c_str()); + if ( tokenid == zeroid || amount <= 0 ) + { + result.push_back(Pair("error", "invalid parameter")); + return(result); + } hex = AssetTransfer(0,tokenid,pubkey,amount); if ( hex.size() > 0 ) { @@ -5463,6 +5468,11 @@ UniValue tokenbid(const UniValue& params, bool fHelp) tokenid = Parseuint256((char *)params[1].get_str().c_str()); price = atof(params[2].get_str().c_str()); bidamount = (price * numtokens) * COIN + 0.0000000049999; + if ( tokenid == zeroid || tokenid == zeroid || price <= 0 || bidamount <= 0 ) + { + result.push_back(Pair("error", "invalid parameter")); + return(result); + } hex = CreateBuyOffer(0,bidamount,tokenid,numtokens); if ( hex.size() > 0 ) { @@ -5483,6 +5493,11 @@ UniValue tokencancelbid(const UniValue& params, bool fHelp) LOCK2(cs_main, pwalletMain->cs_wallet); tokenid = Parseuint256((char *)params[0].get_str().c_str()); bidtxid = Parseuint256((char *)params[1].get_str().c_str()); + if ( tokenid == zeroid || bidtxid == zeroid ) + { + result.push_back(Pair("error", "invalid parameter")); + return(result); + } hex = CancelBuyOffer(0,tokenid,bidtxid); if ( hex.size() > 0 ) { @@ -5504,6 +5519,11 @@ UniValue tokenfillbid(const UniValue& params, bool fHelp) tokenid = Parseuint256((char *)params[0].get_str().c_str()); bidtxid = Parseuint256((char *)params[1].get_str().c_str()); fillamount = atol(params[2].get_str().c_str()); + if ( tokenid == zeroid || bidtxid == zeroid || fillamount <= 0 ) + { + result.push_back(Pair("error", "invalid parameter")); + return(result); + } hex = FillBuyOffer(0,tokenid,bidtxid,fillamount); if ( hex.size() > 0 ) { @@ -5526,6 +5546,11 @@ UniValue tokenask(const UniValue& params, bool fHelp) tokenid = Parseuint256((char *)params[1].get_str().c_str()); price = atof(params[2].get_str().c_str()); askamount = (price * numtokens) * COIN + 0.0000000049999; + if ( tokenid == zeroid || numtokens <= 0 || price <= 0 || askamount <= 0 ) + { + result.push_back(Pair("error", "invalid parameter")); + return(result); + } hex = CreateSell(0,numtokens,tokenid,askamount); if ( hex.size() > 0 ) { @@ -5537,7 +5562,6 @@ UniValue tokenask(const UniValue& params, bool fHelp) UniValue tokenswapask(const UniValue& params, bool fHelp) { - static uint256 zeroid; UniValue result(UniValue::VOBJ); uint64_t askamount,numtokens; std::string hex; double price; uint256 tokenid,otherid; if ( fHelp || params.size() != 4 ) throw runtime_error("tokenswapask numtokens tokenid otherid price\n"); @@ -5570,18 +5594,22 @@ UniValue tokencancelask(const UniValue& params, bool fHelp) LOCK2(cs_main, pwalletMain->cs_wallet); tokenid = Parseuint256((char *)params[0].get_str().c_str()); asktxid = Parseuint256((char *)params[1].get_str().c_str()); + if ( tokenid == zeroid || asktxid == zeroid ) + { + result.push_back(Pair("error", "invalid parameter")); + return(result); + } hex = CancelSell(0,tokenid,asktxid); if ( hex.size() > 0 ) { result.push_back(Pair("result", "success")); result.push_back(Pair("hex", hex)); - } else result.push_back(Pair("error", "couldnt cancel bid")); + } else result.push_back(Pair("error", "couldnt cancel ask")); return(result); } UniValue tokenfillask(const UniValue& params, bool fHelp) { - static uint256 zeroid; UniValue result(UniValue::VOBJ); uint64_t fillunits; std::string hex; uint256 tokenid,asktxid; if ( fHelp || params.size() != 3 ) throw runtime_error("tokenfillask tokenid asktxid fillunits\n"); @@ -5592,6 +5620,11 @@ UniValue tokenfillask(const UniValue& params, bool fHelp) tokenid = Parseuint256((char *)params[0].get_str().c_str()); asktxid = Parseuint256((char *)params[1].get_str().c_str()); fillunits = atol(params[2].get_str().c_str()); + if ( tokenid == zeroid || asktxid == zeroid || fillunits <= 0 ) + { + result.push_back(Pair("error", "invalid parameter")); + return(result); + } hex = FillSell(0,tokenid,zeroid,asktxid,fillunits); if ( hex.size() > 0 ) { @@ -5603,7 +5636,6 @@ UniValue tokenfillask(const UniValue& params, bool fHelp) UniValue tokenfillswap(const UniValue& params, bool fHelp) { - static uint256 zeroid; UniValue result(UniValue::VOBJ); uint64_t fillunits; std::string hex; uint256 tokenid,otherid,asktxid; if ( fHelp || params.size() != 4 ) throw runtime_error("tokenfillswap tokenid otherid asktxid fillunits\n"); From 4d47fcb9371c24507109c4427f870dcc3653db91 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 16 Aug 2018 01:07:44 -1100 Subject: [PATCH 55/74] Create nonzero tokens --- src/wallet/rpcwallet.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 977aee98d..1597051f2 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -5411,6 +5411,11 @@ UniValue tokencreate(const UniValue& params, bool fHelp) LOCK2(cs_main, pwalletMain->cs_wallet); name = params[0].get_str(); supply = atof(params[1].get_str().c_str()) * COIN; + if ( name.size() == 0 || supply <= 0 ) + { + result.push_back(Pair("error", "invalid parameter")); + return(result); + } if ( params.size() == 3 ) { description = params[2].get_str(); From 8a3e1884d6a97dccffd3e90ffa8d288152485005 Mon Sep 17 00:00:00 2001 From: "Jonathan \"Duke\" Leto" Date: Thu, 16 Aug 2018 17:17:54 +0200 Subject: [PATCH 56/74] More token tests and more error checking and better errors from internals --- qa/rpc-tests/cryptoconditions.py | 50 ++++++++++++++++-- src/cc/CCassetstx.cpp | 12 +++-- src/wallet/rpcwallet.cpp | 90 +++++++++++--------------------- 3 files changed, 86 insertions(+), 66 deletions(-) diff --git a/qa/rpc-tests/cryptoconditions.py b/qa/rpc-tests/cryptoconditions.py index 8cfa4fd2a..68b381272 100755 --- a/qa/rpc-tests/cryptoconditions.py +++ b/qa/rpc-tests/cryptoconditions.py @@ -12,6 +12,12 @@ from test_framework.util import assert_equal, assert_greater_than, \ import time from decimal import Decimal +def assert_success(result): + assert_equal(result['result'], 'success') + +def assert_error(result): + assert_equal(result['result'], 'error') + class CryptoConditionsTest (BitcoinTestFramework): def setup_chain(self): @@ -148,8 +154,7 @@ class CryptoConditionsTest (BitcoinTestFramework): result = rpc.tokenaddress(self.pubkey) assert_equal(result['result'], 'success') for x in ['AssetsCCaddress', 'myCCaddress', 'Assetsmarker', 'myaddress', 'CCaddress']: - assert_equal(result[x][0], 'R') - + assert_equal(result[x][0], 'R') # there are no tokens created yet result = rpc.tokenlist() assert_equal(result, []) @@ -174,8 +179,47 @@ class CryptoConditionsTest (BitcoinTestFramework): # this is not a valid assetid result = rpc.tokeninfo(self.pubkey) - assert_equal(result['result'], 'error') + assert_error(result) + # invalid numtokens + result = rpc.tokenask("-1", tokenid, "1") + assert_error(result) + + # invalid numtokens + result = rpc.tokenask("0", tokenid, "1") + assert_error(result) + + # invalid price + result = rpc.tokenask("1", tokenid, "-1") + assert_error(result) + + # invalid price + result = rpc.tokenask("1", tokenid, "0") + assert_error(result) + + # invalid tokenid + result = rpc.tokenask("100", "deadbeef", "1") + assert_error(result) + + # valid + result = rpc.tokenask("100", tokenid, "7.77") + assert_success(result) + tokenaskhex = result['hex'] + assert tokenaskhex, "got tokenask hexk" + tokenaskid = self.send_and_mine(result['hex']) + + + # invalid fillunits + result = rpc.tokenfillask(tokenid, tokenaskid, "0") + assert_error(result) + + # invalid fillunits + result = rpc.tokenfillask(tokenid, tokenaskid, "-777") + assert_error(result) + + # should this pass or fail? + result = rpc.tokenfillask(tokenid, tokenaskid, "10") + #assert_success(result) def run_rewards_tests(self): rpc = self.nodes[0] diff --git a/src/cc/CCassetstx.cpp b/src/cc/CCassetstx.cpp index bfd51f4b7..40d76370c 100644 --- a/src/cc/CCassetstx.cpp +++ b/src/cc/CCassetstx.cpp @@ -14,6 +14,7 @@ ******************************************************************************/ #include "CCassets.h" +extern std::string CCerror; int64_t AddAssetInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPubKey pk,uint256 assetid,int64_t total,int32_t maxinputs) { @@ -427,12 +428,14 @@ std::string FillSell(int64_t txfee,uint256 assetid,uint256 assetid2,uint256 askt CTransaction vintx,filltx; uint256 hashBlock; CMutableTransaction mtx; CPubKey mypk; std::vector origpubkey; double dprice; uint64_t mask; int32_t askvout=0; int64_t received_assetoshis,total_nValue,orig_assetoshis,paid_nValue,remaining_nValue,inputs,CCchange=0; struct CCcontract_info *cp,C; if ( fillunits < 0 ) { - fprintf(stderr,"negative fillunits %lld\n",(long long)fillunits); + CCerror = strprintf("negative fillunits %lld\n",(long long)fillunits); + fprintf(stderr,"%s\n",CCerror.c_str()); return(""); } if ( assetid2 != zeroid ) { - fprintf(stderr,"asset swaps disabled\n"); + CCerror = "asset swaps disabled"; + fprintf(stderr,"%s\n",CCerror.c_str()); return(""); } @@ -474,7 +477,10 @@ std::string FillSell(int64_t txfee,uint256 assetid,uint256 assetid2,uint256 askt if ( CCchange != 0 ) mtx.vout.push_back(MakeCC1vout(EVAL_ASSETS,CCchange,mypk)); return(FinalizeCCTx(mask,cp,mtx,mypk,txfee,EncodeAssetOpRet(assetid2!=zeroid?'E':'S',assetid,assetid2,remaining_nValue,origpubkey))); - } else fprintf(stderr,"filltx not enough utxos\n"); + } else { + CCerror = strprintf("filltx not enough utxos"); + fprintf(stderr,"%s\n", CCerror.c_str()); + } } } return(""); diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index cbd08dd6c..0775842a2 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -38,8 +38,7 @@ #include -#define ERR_RESULT(x) result.push_back(Pair("result", "error")); \ - result.push_back(Pair("error", x)); +#define ERR_RESULT(x) result.push_back(Pair("result", "error")) , result.push_back(Pair("error", x)); using namespace std; @@ -52,7 +51,6 @@ uint32_t komodo_segid32(char *coinaddr); int64_t nWalletUnlockTime; static CCriticalSection cs_nWalletUnlockTime; -//TODO: find a better place for this std::string CCerror; // Private method: @@ -5002,7 +5000,7 @@ UniValue rewardscreatefunding(const UniValue& params, bool fHelp) { result.push_back(Pair("result", "success")); result.push_back(Pair("hex", hex)); - } else result.push_back(Pair("error", "couldnt create rewards funding transaction")); + } else ERR_RESULT("couldnt create rewards funding transaction"); return(result); } @@ -5024,14 +5022,8 @@ UniValue rewardslock(const UniValue& params, bool fHelp) { result.push_back(Pair("result", "success")); result.push_back(Pair("hex", hex)); - } else { - result.push_back(Pair("result", "error")); - result.push_back(Pair("error", "couldnt create rewards lock transaction")); - } - } else { - result.push_back(Pair("result", "error")); - result.push_back(Pair("error", "amount must be positive")); - } + } else ERR_RESULT( "couldnt create rewards lock transaction"); + } else ERR_RESULT("amount must be positive"); return(result); } @@ -5080,16 +5072,11 @@ UniValue rewardsunlock(const UniValue& params, bool fHelp) else memset(&txid,0,sizeof(txid)); hex = RewardsUnlock(0,name,fundingtxid,txid); if (CCerror != "") { - result.push_back(Pair("result", "error")); - result.push_back(Pair("error", CCerror)); - } else if ( hex.size() > 0 ) - { + ERR_RESULT(CCerror); + } else if ( hex.size() > 0 ) { result.push_back(Pair("result", "success")); result.push_back(Pair("hex", hex)); - } else { - result.push_back(Pair("result", "error")); - result.push_back(Pair("error", "couldnt create rewards unlock transaction")); - } + } else ERR_RESULT("couldnt create rewards unlock transaction"); return(result); } @@ -5181,14 +5168,8 @@ UniValue faucetfund(const UniValue& params, bool fHelp) { result.push_back(Pair("result", "success")); result.push_back(Pair("hex", hex)); - } else { - result.push_back(Pair("result", "error")); - result.push_back(Pair("error", "couldnt create faucet funding transaction")); - } - } else { - result.push_back(Pair("result", "error")); - result.push_back(Pair("error", "funding amount must be positive")); - } + } else ERR_RESULT("couldnt create faucet funding transaction"); + } else ERR_RESULT( "funding amount must be positive"); return(result); } @@ -5205,10 +5186,7 @@ UniValue faucetget(const UniValue& params, bool fHelp) if ( hex.size() > 0 ) { result.push_back(Pair("result", "success")); result.push_back(Pair("hex", hex)); - } else { - result.push_back(Pair("result", "error")); - result.push_back(Pair("error", "couldnt create faucet get transaction")); - } + } else ERR_RESULT("couldnt create faucet get transaction"); return(result); } @@ -5229,14 +5207,12 @@ UniValue dicefund(const UniValue& params, bool fHelp) timeoutblocks = atol(params[5].get_str().c_str()); hex = DiceCreateFunding(0,name,funds,minbet,maxbet,maxodds,timeoutblocks); if (CCerror != "") { - result.push_back(Pair("result", "error")); - result.push_back(Pair("error", CCerror)); + ERR_RESULT(CCerror); } else if ( hex.size() > 0 ) { result.push_back(Pair("result", "success")); result.push_back(Pair("hex", hex)); } else { - result.push_back(Pair("error", "couldnt create dice funding transaction")); - result.push_back(Pair("result", "error")); + ERR_RESULT( "couldnt create dice funding transaction"); } return(result); } @@ -5256,19 +5232,12 @@ UniValue diceaddfunds(const UniValue& params, bool fHelp) if ( amount > 0 ) { hex = DiceAddfunding(0,name,fundingtxid,amount); if (CCerror != "") { - result.push_back(Pair("result", "error")); - result.push_back(Pair("error", CCerror)); + ERR_RESULT(CCerror); } else if ( hex.size() > 0 ) { result.push_back(Pair("result", "success")); result.push_back(Pair("hex", hex)); - } else { - result.push_back(Pair("result", "error")); - result.push_back(Pair("error", "couldnt create dice addfunding transaction")); - } - } else { - result.push_back(Pair("result", "error")); - result.push_back(Pair("error", "amount must be positive")); - } + } else ERR_RESULT("couldnt create dice addfunding transaction"); + } else ERR_RESULT("amount must be positive"); return(result); } @@ -5291,9 +5260,7 @@ UniValue dicebet(const UniValue& params, bool fHelp) { result.push_back(Pair("result", "success")); result.push_back(Pair("hex", hex)); - } else { - ERR_RESULT("couldnt create faucet get transaction"); - } + } else ERR_RESULT("couldnt create faucet get transaction"); } else { ERR_RESULT("amount and odds must be positive"); } @@ -5317,7 +5284,7 @@ UniValue dicefinish(const UniValue& params, bool fHelp) { result.push_back(Pair("result", "success")); result.push_back(Pair("hex", hex)); - } else result.push_back(Pair("error", "couldnt create dicefinish transaction")); + } else ERR_RESULT( "couldnt create dicefinish transaction"); return(result); } @@ -5457,7 +5424,7 @@ UniValue tokencreate(const UniValue& params, bool fHelp) { result.push_back(Pair("result", "success")); result.push_back(Pair("hex", hex)); - } else result.push_back(Pair("error", "couldnt create transaction")); + } else ERR_RESULT("couldnt create transaction"); return(result); } @@ -5479,7 +5446,7 @@ UniValue tokentransfer(const UniValue& params, bool fHelp) { result.push_back(Pair("result", "success")); result.push_back(Pair("hex", hex)); - } else result.push_back(Pair("error", "couldnt transfer assets")); + } else ERR_RESULT("couldnt transfer assets"); } else { ERR_RESULT("amount must be positive"); } @@ -5528,7 +5495,7 @@ UniValue tokencancelbid(const UniValue& params, bool fHelp) { result.push_back(Pair("result", "success")); result.push_back(Pair("hex", hex)); - } else result.push_back(Pair("error", "couldnt cancel bid")); + } else ERR_RESULT("couldnt cancel bid"); return(result); } @@ -5549,7 +5516,7 @@ UniValue tokenfillbid(const UniValue& params, bool fHelp) { result.push_back(Pair("result", "success")); result.push_back(Pair("hex", hex)); - } else result.push_back(Pair("error", "couldnt fill bid")); + } else ERR_RESULT("couldnt fill bid"); return(result); } @@ -5572,7 +5539,7 @@ UniValue tokenask(const UniValue& params, bool fHelp) { result.push_back(Pair("result", "success")); result.push_back(Pair("hex", hex)); - } else result.push_back(Pair("error", "couldnt create ask")); + } else ERR_RESULT("couldnt create ask"); } else { ERR_RESULT("price and numtokens must be positive"); } @@ -5600,7 +5567,7 @@ UniValue tokenswapask(const UniValue& params, bool fHelp) { result.push_back(Pair("result", "success")); result.push_back(Pair("hex", hex)); - } else result.push_back(Pair("error", "couldnt create swap")); + } else ERR_RESULT("couldnt create swap"); } else { ERR_RESULT("price and numtokens must be positive"); } @@ -5623,7 +5590,7 @@ UniValue tokencancelask(const UniValue& params, bool fHelp) { result.push_back(Pair("result", "success")); result.push_back(Pair("hex", hex)); - } else result.push_back(Pair("error", "couldnt cancel bid")); + } else ERR_RESULT("couldnt cancel bid"); return(result); } @@ -5642,11 +5609,14 @@ UniValue tokenfillask(const UniValue& params, bool fHelp) fillunits = atol(params[2].get_str().c_str()); hex = FillSell(0,tokenid,zeroid,asktxid,fillunits); if (fillunits > 0) { - if ( hex.size() > 0) - { + if (CCerror != "") { + ERR_RESULT(CCerror); + } else if ( hex.size() > 0) { result.push_back(Pair("result", "success")); result.push_back(Pair("hex", hex)); - } else ERR_RESULT("couldnt fill bid"); + } else { + ERR_RESULT("couldnt fill bid"); + } } else { ERR_RESULT("fillunits must be positive"); } From 79887a0987e71877e81b1d88343a5a95af0eb6d9 Mon Sep 17 00:00:00 2001 From: Scott Sadler Date: Thu, 16 Aug 2018 18:52:04 -0300 Subject: [PATCH 57/74] replace malloc in CC with calloc --- src/cryptoconditions/src/cryptoconditions.c | 6 +----- src/cryptoconditions/src/ed25519.c | 6 +++--- src/cryptoconditions/src/eval.c | 2 +- src/cryptoconditions/src/json_rpc.c | 5 +---- src/cryptoconditions/src/prefix.c | 2 +- src/cryptoconditions/src/utils.c | 12 ++++++------ 6 files changed, 13 insertions(+), 20 deletions(-) diff --git a/src/cryptoconditions/src/cryptoconditions.c b/src/cryptoconditions/src/cryptoconditions.c index 3c0e9ea2c..b58d7a70c 100644 --- a/src/cryptoconditions/src/cryptoconditions.c +++ b/src/cryptoconditions/src/cryptoconditions.c @@ -29,11 +29,7 @@ #include "src/json_rpc.c" #include -#ifdef __LP64__ #include -#else -#include // Index into CTransaction.vjoinsplit -#endif struct CCType *CCTypeRegistry[] = { @@ -199,7 +195,7 @@ CC *fulfillmentToCC(Fulfillment_t *ffill) { CC *cc_readFulfillmentBinary(const unsigned char *ffill_bin, size_t ffill_bin_len) { CC *cond = 0; - unsigned char *buf = malloc(ffill_bin_len); + unsigned char *buf = calloc(1,ffill_bin_len); Fulfillment_t *ffill = 0; asn_dec_rval_t rval = ber_decode(0, &asn_DEF_Fulfillment, (void **)&ffill, ffill_bin, ffill_bin_len); if (rval.code != RC_OK) { diff --git a/src/cryptoconditions/src/ed25519.c b/src/cryptoconditions/src/ed25519.c index 6cdd80d1d..d7ebb085e 100644 --- a/src/cryptoconditions/src/ed25519.c +++ b/src/cryptoconditions/src/ed25519.c @@ -62,7 +62,7 @@ static int ed25519Sign(CC *cond, CCVisitor visitor) { if (cond->type->typeId != CC_Ed25519Type.typeId) return 1; CCEd25519SigningData *signing = (CCEd25519SigningData*) visitor.context; if (0 != memcmp(cond->publicKey, signing->pk, 32)) return 1; - if (!cond->signature) cond->signature = malloc(64); + if (!cond->signature) cond->signature = calloc(1,64); ed25519_sign(cond->signature, visitor.msg, visitor.msgLength, signing->pk, signing->skpk); signing->nSigned++; @@ -141,9 +141,9 @@ static void ed25519ToJSON(const CC *cond, cJSON *params) { static CC *ed25519FromFulfillment(const Fulfillment_t *ffill) { CC *cond = cc_new(CC_Ed25519); - cond->publicKey = malloc(32); + cond->publicKey = calloc(1,32); memcpy(cond->publicKey, ffill->choice.ed25519Sha256.publicKey.buf, 32); - cond->signature = malloc(64); + cond->signature = calloc(1,64); memcpy(cond->signature, ffill->choice.ed25519Sha256.signature.buf, 64); return cond; } diff --git a/src/cryptoconditions/src/eval.c b/src/cryptoconditions/src/eval.c index a2bac4c51..df0f1af5d 100644 --- a/src/cryptoconditions/src/eval.c +++ b/src/cryptoconditions/src/eval.c @@ -68,7 +68,7 @@ static CC *evalFromFulfillment(const Fulfillment_t *ffill) { OCTET_STRING_t octets = eval->code; cond->codeLength = octets.size; - cond->code = malloc(octets.size); + cond->code = calloc(1,octets.size); memcpy(cond->code, octets.buf, octets.size); return cond; diff --git a/src/cryptoconditions/src/json_rpc.c b/src/cryptoconditions/src/json_rpc.c index 63b5909da..73377af50 100644 --- a/src/cryptoconditions/src/json_rpc.c +++ b/src/cryptoconditions/src/json_rpc.c @@ -17,11 +17,8 @@ #include "internal.h" #include -#ifdef __LP64__ #include -#else -#include // Index into CTransaction.vjoinsplit -#endif + static cJSON *jsonCondition(CC *cond) { cJSON *root = cJSON_CreateObject(); diff --git a/src/cryptoconditions/src/prefix.c b/src/cryptoconditions/src/prefix.c index 97a9d1074..bebebba6e 100644 --- a/src/cryptoconditions/src/prefix.c +++ b/src/cryptoconditions/src/prefix.c @@ -26,7 +26,7 @@ struct CCType CC_PrefixType; static int prefixVisitChildren(CC *cond, CCVisitor visitor) { size_t prefixedLength = cond->prefixLength + visitor.msgLength; - unsigned char *prefixed = malloc(prefixedLength); + unsigned char *prefixed = calloc(1,prefixedLength); memcpy(prefixed, cond->prefix, cond->prefixLength); memcpy(prefixed + cond->prefixLength, visitor.msg, visitor.msgLength); visitor.msg = prefixed; diff --git a/src/cryptoconditions/src/utils.c b/src/cryptoconditions/src/utils.c index 623331ff7..c98c6d17d 100644 --- a/src/cryptoconditions/src/utils.c +++ b/src/cryptoconditions/src/utils.c @@ -39,7 +39,7 @@ static int mod_table[] = {0, 2, 1}; void build_decoding_table() { - decoding_table = malloc(256); + decoding_table = calloc(1,256); for (int i = 0; i < 64; i++) decoding_table[(unsigned char) encoding_table[i]] = i; } @@ -49,7 +49,7 @@ unsigned char *base64_encode(const unsigned char *data, size_t input_length) { size_t output_length = 4 * ((input_length + 2) / 3); - unsigned char *encoded_data = malloc(output_length + 1); + unsigned char *encoded_data = calloc(1,output_length + 1); if (encoded_data == NULL) return NULL; for (int i = 0, j = 0; i < input_length;) { @@ -90,7 +90,7 @@ unsigned char *base64_decode(const unsigned char *data_, size_t input_length = strlen(data_); int rem = input_length % 4; - unsigned char *data = malloc(input_length + (4-rem)); + unsigned char *data = calloc(1,input_length + (4-rem)); strcpy(data, data_); // for unpadded b64 @@ -111,7 +111,7 @@ unsigned char *base64_decode(const unsigned char *data_, if (data[input_length - 1] == '=') (*output_length)--; if (data[input_length - 2] == '=') (*output_length)--; - unsigned char *decoded_data = malloc(*output_length); + unsigned char *decoded_data = calloc(1,*output_length); if (decoded_data == NULL) return NULL; for (int i = 0, j = 0; i < input_length;) { @@ -217,7 +217,7 @@ unsigned char *hashFingerprintContents(asn_TYPE_descriptor_t *asnType, void *fp) fprintf(stderr, "Encoding fingerprint failed\n"); return 0; } - unsigned char *hash = malloc(32); + unsigned char *hash = calloc(1,32); sha256(buf, rc.encoded, hash); return hash; } @@ -225,7 +225,7 @@ unsigned char *hashFingerprintContents(asn_TYPE_descriptor_t *asnType, void *fp) char* cc_hex_encode(const uint8_t *bin, size_t len) { - char* hex = malloc(len*2+1); + char* hex = calloc(1,len*2+1); if (bin == NULL) return hex; char map[16] = "0123456789ABCDEF"; for (int i=0; i Date: Fri, 17 Aug 2018 13:24:32 -0300 Subject: [PATCH 58/74] fix crash #1 on osx --- src/cryptoconditions/src/internal.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cryptoconditions/src/internal.h b/src/cryptoconditions/src/internal.h index e027176ee..5a9da13c0 100644 --- a/src/cryptoconditions/src/internal.h +++ b/src/cryptoconditions/src/internal.h @@ -56,8 +56,8 @@ typedef struct CCType { /* * Globals */ -struct CCType *CCTypeRegistry[32]; -int CCTypeRegistryLength; +extern struct CCType *CCTypeRegistry[16]; +extern int CCTypeRegistryLength; /* From bc3299692696f425219929a91a7e236a1918625c Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 17 Aug 2018 23:02:49 -1100 Subject: [PATCH 59/74] Reduce faucetget opreturn size, add rewards recover funds mode --- src/cc/faucet.cpp | 7 +++-- src/cc/rewards.cpp | 77 ++++++++++++++++++++++++++++++---------------- 2 files changed, 55 insertions(+), 29 deletions(-) diff --git a/src/cc/faucet.cpp b/src/cc/faucet.cpp index 0ab51ff13..1ac601e64 100644 --- a/src/cc/faucet.cpp +++ b/src/cc/faucet.cpp @@ -170,7 +170,7 @@ int64_t AddFaucetInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPub std::string FaucetGet(uint64_t txfee) { - CMutableTransaction mtx,tmpmtx; CPubKey mypk,faucetpk; int64_t inputs,CCchange=0,nValue=FAUCETSIZE; struct CCcontract_info *cp,C; std::string rawhex; int32_t i,j,len; uint8_t buf[32768]; bits256 hash; + CMutableTransaction mtx,tmpmtx; CPubKey mypk,faucetpk; int64_t inputs,CCchange=0,nValue=FAUCETSIZE; struct CCcontract_info *cp,C; std::string rawhex; uint32_t j; int32_t i,len; uint8_t buf[32768]; bits256 hash; cp = CCinit(&C,EVAL_FAUCET); if ( txfee == 0 ) txfee = 10000; @@ -184,10 +184,11 @@ std::string FaucetGet(uint64_t txfee) mtx.vout.push_back(MakeCC1vout(EVAL_FAUCET,CCchange,faucetpk)); mtx.vout.push_back(CTxOut(nValue,CScript() << ParseHex(HexStr(mypk)) << OP_CHECKSIG)); fprintf(stderr,"start at %u\n",(uint32_t)time(NULL)); - for (i=0; i<1000000; i++) + j = rand() & 0xfffffff; + for (i=0; i<1000000; i++,j++) { tmpmtx = mtx; - rawhex = FinalizeCCTx(-1LL,cp,tmpmtx,mypk,txfee,CScript() << OP_RETURN << E_MARSHAL(ss << (uint8_t)EVAL_FAUCET << (uint8_t)'G' << mypk << i)); + rawhex = FinalizeCCTx(-1LL,cp,tmpmtx,mypk,txfee,CScript() << OP_RETURN << E_MARSHAL(ss << (uint8_t)EVAL_FAUCET << (uint8_t)'G' << j)); if ( (len= (int32_t)rawhex.size()) > 0 && len < 65536 ) { len >>= 1; diff --git a/src/cc/rewards.cpp b/src/cc/rewards.cpp index 2f924e993..5bb7fec1b 100644 --- a/src/cc/rewards.cpp +++ b/src/cc/rewards.cpp @@ -241,17 +241,27 @@ bool RewardsValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &t case 'U': //vin.0: locked funds CC vout.0 from lock //vin.1+: funding CC vout.0 from 'F' and 'A' and 'U' - //vout.0: funding CC change + //vout.0: funding CC change or recover normal payout //vout.1: normal output to unlock address //vout.n-1: opreturn 'U' sbits fundingtxid + if ( eval->GetTxUnconfirmed(tx.vin[0].prevout.hash,vinTx,hashBlock) == 0 ) + return eval->Invalid("always should find vin.0, but didnt"); for (i=0; iismyvin)(tx.vin[i].scriptSig) == 0 ) return eval->Invalid("unexpected normal vin for unlock"); } - if ( eval->GetTxUnconfirmed(tx.vin[0].prevout.hash,vinTx,hashBlock) == 0 ) - return eval->Invalid("always should find vin.0, but didnt"); - else if ( vinTx.vout[0].scriptPubKey.IsPayToCryptoCondition() == 0 ) + if ( numvouts == 1 && numvins == 1 ) + { + if ( tx.vout[0].scriptPubKey.IsPayToCryptoCondition() != 0 ) + return eval->Invalid("unlock recover tx vout.0 is not normal output"); + else if ( tx.vout[0].scriptPubKey != vinTx.vout[1].scriptPubKey ) + return eval->Invalid("unlock recover tx vout.0 mismatched scriptPubKey"); + else if ( tx.vout[0].nValue > vinTx.vout[0].nValue ) + return eval->Invalid("unlock recover tx vout.0 mismatched amounts"); + else return(true); + } + if ( vinTx.vout[0].scriptPubKey.IsPayToCryptoCondition() == 0 ) return eval->Invalid("lock tx vout.0 is normal output"); else if ( tx.vout.size() < 3 ) return eval->Invalid("unlock tx not enough vouts"); @@ -541,9 +551,9 @@ std::string RewardsAddfunding(uint64_t txfee,char *planstr,uint256 fundingtxid,i std::string RewardsLock(uint64_t txfee,char *planstr,uint256 fundingtxid,int64_t deposit) { CMutableTransaction mtx; CPubKey mypk,rewardspk; CScript opret; uint64_t lockedfunds,sbits,funding,APR,minseconds,maxseconds,mindeposit; struct CCcontract_info *cp,C; - if ( deposit < 0 ) + if ( deposit < txfee ) { - fprintf(stderr,"negative parameter error\n"); + fprintf(stderr,"deposit amount less than txfee\n"); return(""); } cp = CCinit(&C,EVAL_REWARDS); @@ -614,31 +624,46 @@ std::string RewardsUnlock(uint64_t txfee,char *planstr,uint256 fundingtxid,uint2 return(""); } } - if ( amount > 0) { - reward= RewardsCalc(amount,mtx.vin[0].prevout.hash,APR,minseconds,maxseconds,mindeposit); - if (scriptPubKey.size() > 0) { - if (reward > txfee) { - if ( (inputs= AddRewardsInputs(ignore,0,cp,mtx,rewardspk,reward+txfee,30,sbits,fundingtxid)) > 0 ) { - if ( inputs >= (reward + 2*txfee) ) - CCchange = (inputs - (reward + txfee)); - fprintf(stderr,"inputs %.8f CCchange %.8f amount %.8f reward %.8f\n",(double)inputs/COIN,(double)CCchange/COIN,(double)amount/COIN,(double)reward/COIN); - mtx.vout.push_back(MakeCC1vout(cp->evalcode,CCchange,rewardspk)); - mtx.vout.push_back(CTxOut(amount+reward,scriptPubKey)); - return(FinalizeCCTx(-1LL,cp,mtx,mypk,txfee,EncodeRewardsOpRet('U',sbits,fundingtxid))); + if ( amount > txfee ) + { + reward = RewardsCalc(amount,mtx.vin[0].prevout.hash,APR,minseconds,maxseconds,mindeposit); + if ( scriptPubKey.size() > 0 ) + { + if ( reward > txfee ) + { + if ( (inputs= AddRewardsInputs(ignore,0,cp,mtx,rewardspk,reward+txfee,30,sbits,fundingtxid)) > 0 ) + { + if ( inputs >= (reward + 2*txfee) ) + CCchange = (inputs - (reward + txfee)); + fprintf(stderr,"inputs %.8f CCchange %.8f amount %.8f reward %.8f\n",(double)inputs/COIN,(double)CCchange/COIN,(double)amount/COIN,(double)reward/COIN); + mtx.vout.push_back(MakeCC1vout(cp->evalcode,CCchange,rewardspk)); + mtx.vout.push_back(CTxOut(amount+reward,scriptPubKey)); + return(FinalizeCCTx(-1LL,cp,mtx,mypk,txfee,EncodeRewardsOpRet('U',sbits,fundingtxid))); + } + else + { + mtx.vout.push_back(CTxOut(amount-txfee,scriptPubKey)); + //CCerror = "cant find enough rewards inputs"; + fprintf(stderr,"not enough rewards funds to payout %.8f, recover mode tx\n",(double)(rewards+txfee)/COIN); + return(FinalizeCCTx(-1LL,cp,mtx,mypk,txfee,opret)); + } } - CCerror = "cant find enough rewards inputs"; - fprintf(stderr,"%s\n", CCerror.c_str()); - } else { + else + { CCerror = strprintf("reward %.8f is <= the transaction fee", reward); fprintf(stderr,"%s\n", CCerror.c_str()); - } - } else { + } + } + else + { CCerror = "invalid scriptPubKey"; fprintf(stderr,"%s\n", CCerror.c_str()); - } - } else { - CCerror = "amount must be positive"; - fprintf(stderr,"%s\n", CCerror.c_str()); + } + } + else + { + CCerror = "amount must be more than txfee"; + fprintf(stderr,"%s\n", CCerror.c_str()); } fprintf(stderr,"amount %.8f -> reward %.8f\n",(double)amount/COIN,(double)reward/COIN); return(""); From 276c654852c43c953183e93e73b8dd4bcd00fb7f Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 17 Aug 2018 23:40:12 -1100 Subject: [PATCH 60/74] -s --- src/cc/rewards.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/rewards.cpp b/src/cc/rewards.cpp index 5bb7fec1b..efb47fdb3 100644 --- a/src/cc/rewards.cpp +++ b/src/cc/rewards.cpp @@ -644,7 +644,7 @@ std::string RewardsUnlock(uint64_t txfee,char *planstr,uint256 fundingtxid,uint2 { mtx.vout.push_back(CTxOut(amount-txfee,scriptPubKey)); //CCerror = "cant find enough rewards inputs"; - fprintf(stderr,"not enough rewards funds to payout %.8f, recover mode tx\n",(double)(rewards+txfee)/COIN); + fprintf(stderr,"not enough rewards funds to payout %.8f, recover mode tx\n",(double)(reward+txfee)/COIN); return(FinalizeCCTx(-1LL,cp,mtx,mypk,txfee,opret)); } } From 9c5c9f0b9d7667630a1ff9079594bc868a5f8d2d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 18 Aug 2018 00:11:27 -1100 Subject: [PATCH 61/74] +prints --- src/cc/CCutils.cpp | 2 +- src/cc/eval.cpp | 2 +- src/cryptoconditions/src/internal.h | 2 +- src/cryptoconditions/src/utils.c | 1 + 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/cc/CCutils.cpp b/src/cc/CCutils.cpp index 8cb06ab25..785e9d952 100644 --- a/src/cc/CCutils.cpp +++ b/src/cc/CCutils.cpp @@ -260,7 +260,7 @@ bool ProcessCC(struct CCcontract_info *cp,Eval* eval, std::vector param //txid = ctx.GetHash(); //if ( txid == cp->prevtxid ) // return(true); - //fprintf(stderr,"process CC %02x\n",cp->evalcode); + fprintf(stderr,"process CC %02x\n",cp->evalcode); if ( paramsNull.size() != 0 ) // Don't expect params return eval->Invalid("Cannot have params"); else if ( ctx.vout.size() == 0 ) diff --git a/src/cc/eval.cpp b/src/cc/eval.cpp index 95f5c33de..949728be4 100644 --- a/src/cc/eval.cpp +++ b/src/cc/eval.cpp @@ -38,7 +38,7 @@ bool RunCCEval(const CC *cond, const CTransaction &tx, unsigned int nIn) pthread_mutex_lock(&KOMODO_CC_mutex); bool out = eval->Dispatch(cond, tx, nIn); pthread_mutex_unlock(&KOMODO_CC_mutex); - //fprintf(stderr,"out %d vs %d isValid\n",(int32_t)out,(int32_t)eval->state.IsValid()); + fprintf(stderr,"out %d vs %d isValid\n",(int32_t)out,(int32_t)eval->state.IsValid()); assert(eval->state.IsValid() == out); if (eval->state.IsValid()) return true; diff --git a/src/cryptoconditions/src/internal.h b/src/cryptoconditions/src/internal.h index 5a9da13c0..8082f9b75 100644 --- a/src/cryptoconditions/src/internal.h +++ b/src/cryptoconditions/src/internal.h @@ -56,7 +56,7 @@ typedef struct CCType { /* * Globals */ -extern struct CCType *CCTypeRegistry[16]; +extern struct CCType *CCTypeRegistry[]; extern int CCTypeRegistryLength; diff --git a/src/cryptoconditions/src/utils.c b/src/cryptoconditions/src/utils.c index c98c6d17d..25783ddfc 100644 --- a/src/cryptoconditions/src/utils.c +++ b/src/cryptoconditions/src/utils.c @@ -137,6 +137,7 @@ unsigned char *base64_decode(const unsigned char *data_, void base64_cleanup() { free(decoding_table); + decoding_table = 0; } From 007cc1f99686876edf97c481135836a20b690016 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 18 Aug 2018 00:33:08 -1100 Subject: [PATCH 62/74] Remove trailing / in depends --- depends/packages/googletest.mk | 2 +- depends/packages/libevent.mk | 2 +- depends/packages/libgmp.mk | 4 ++-- depends/packages/librustzcash.mk | 2 +- depends/packages/libsodium.mk | 2 +- depends/packages/zeromq.mk | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/depends/packages/googletest.mk b/depends/packages/googletest.mk index 1275593f5..409c83a1b 100644 --- a/depends/packages/googletest.mk +++ b/depends/packages/googletest.mk @@ -1,6 +1,6 @@ package=googletest $(package)_version=1.8.0 -$(package)_download_path=https://github.com/google/$(package)/archive/ +$(package)_download_path=https://github.com/google/$(package)/archive $(package)_file_name=$(package)-$($(package)_version).tar.gz $(package)_download_file=release-$($(package)_version).tar.gz $(package)_sha256_hash=58a6f4277ca2bc8565222b3bbd58a177609e9c488e8a72649359ba51450db7d8 diff --git a/depends/packages/libevent.mk b/depends/packages/libevent.mk index 2a1125fda..ffe6f7e79 100644 --- a/depends/packages/libevent.mk +++ b/depends/packages/libevent.mk @@ -1,6 +1,6 @@ package=libevent $(package)_version=2.1.8 -$(package)_download_path=https://github.com/libevent/libevent/archive/ +$(package)_download_path=https://github.com/libevent/libevent/archive $(package)_file_name=$(package)-$($(package)_version).tar.gz $(package)_download_file=release-$($(package)_version)-stable.tar.gz $(package)_sha256_hash=316ddb401745ac5d222d7c529ef1eada12f58f6376a66c1118eee803cb70f83d diff --git a/depends/packages/libgmp.mk b/depends/packages/libgmp.mk index d8e41573a..c62fa18ed 100644 --- a/depends/packages/libgmp.mk +++ b/depends/packages/libgmp.mk @@ -1,7 +1,7 @@ package=libgmp ifeq ($(host_os),mingw32) -$(package)_download_path=https://github.com/joshuayabut/$(package)/archive/ +$(package)_download_path=https://github.com/joshuayabut/$(package)/archive $(package)_file_name=$(package)-$($(package)_git_commit).tar.gz $(package)_download_file=$($(package)_git_commit).tar.gz $(package)_sha256_hash=193836c1acc9dc00fe2521205d7bbe1ba13263f6cbef6f02584bf6f8b34b108f @@ -9,7 +9,7 @@ $(package)_git_commit=053c03b1cab347671d936f43ef66b48ab5e380ee $(package)_dependencies= $(package)_config_opts=--enable-cxx --disable-shared else ifeq ($(build_os),darwin) -$(package)_download_path=https://github.com/ca333/$(package)/archive/ +$(package)_download_path=https://github.com/ca333/$(package)/archive $(package)_file_name=$(package)-$($(package)_git_commit).tar.gz $(package)_download_file=$($(package)_git_commit).tar.gz $(package)_sha256_hash=59b2c2b5d58fdf5943bfde1fa709e9eb53e7e072c9699d28dc1c2cbb3c8cc32c diff --git a/depends/packages/librustzcash.mk b/depends/packages/librustzcash.mk index 20126776a..689082f8f 100644 --- a/depends/packages/librustzcash.mk +++ b/depends/packages/librustzcash.mk @@ -1,6 +1,6 @@ package=librustzcash $(package)_version=0.1 -$(package)_download_path=https://github.com/zcash/$(package)/archive/ +$(package)_download_path=https://github.com/zcash/$(package)/archive $(package)_file_name=$(package)-$($(package)_git_commit).tar.gz $(package)_download_file=$($(package)_git_commit).tar.gz $(package)_sha256_hash=a5760a90d4a1045c8944204f29fa2a3cf2f800afee400f88bf89bbfe2cce1279 diff --git a/depends/packages/libsodium.mk b/depends/packages/libsodium.mk index efa5d90de..67e096fae 100644 --- a/depends/packages/libsodium.mk +++ b/depends/packages/libsodium.mk @@ -9,7 +9,7 @@ $(package)_config_opts= else package=libsodium $(package)_version=1.0.15 -$(package)_download_path=https://download.libsodium.org/libsodium/releases/ +$(package)_download_path=https://download.libsodium.org/libsodium/releases $(package)_file_name=$(package)-$($(package)_version).tar.gz $(package)_sha256_hash=fb6a9e879a2f674592e4328c5d9f79f082405ee4bb05cb6e679b90afe9e178f4 $(package)_dependencies= diff --git a/depends/packages/zeromq.mk b/depends/packages/zeromq.mk index 850cce778..66e491ffb 100644 --- a/depends/packages/zeromq.mk +++ b/depends/packages/zeromq.mk @@ -1,6 +1,6 @@ ifeq ($(host_os),mingw32) $(package)_version=4.2.2-1 -$(package)_download_path=https://github.com/ca333/libzmq/archive/ +$(package)_download_path=https://github.com/ca333/libzmq/archive $(package)_download_file=v$($(package)_version).tar.gz $(package)_file_name=libzmq-$($(package)_version).tar.gz $(package)_sha256_hash=0e225b85ce11be23bf7eb7d3f25c6686728bf30d5c31f61c12d37bb646c69962 From 6252e12f176b6d3f083a81a34bed1f0042298415 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 18 Aug 2018 00:54:53 -1100 Subject: [PATCH 63/74] +print --- src/script/interpreter.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index 4295d4ddc..e33930624 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -952,7 +952,7 @@ bool EvalScript( if (stack.size() < 2) return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION); - +fprintf(stderr,"check cryptocondition\n"); int fResult = checker.CheckCryptoCondition(stacktop(-1), stacktop(-2), script, consensusBranchId); if (fResult == -1) { return set_error(serror, SCRIPT_ERR_CRYPTOCONDITION_INVALID_FULFILLMENT); @@ -1313,14 +1313,14 @@ int TransactionSignatureChecker::CheckCryptoCondition( } catch (logic_error ex) { return 0; } - //int32_t z; uint8_t *ptr; - //ptr = (uint8_t *)scriptCode.data(); - //for (z=0; zCheckEvalCondition(cond); @@ -1328,7 +1328,7 @@ int TransactionSignatureChecker::CheckCryptoCondition( int out = cc_verify(cond, (const unsigned char*)&sighash, 32, 0, condBin.data(), condBin.size(), eval, (void*)this); - //fprintf(stderr,"out.%d from cc_verify\n",(int32_t)out); + fprintf(stderr,"out.%d from cc_verify\n",(int32_t)out); cc_free(cond); return out; } From 64836d75a01a5fc106e17eeec10bfae3ddea6dcf Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 18 Aug 2018 01:11:31 -1100 Subject: [PATCH 64/74] +print --- src/script/interpreter.cpp | 1 + src/script/serverchecker.cpp | 1 + 2 files changed, 2 insertions(+) diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index e33930624..e12e3a457 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -1323,6 +1323,7 @@ int TransactionSignatureChecker::CheckCryptoCondition( fprintf(stderr," sighash nIn.%d nHashType.%d %.8f id.%d\n",(int32_t)nIn,(int32_t)nHashType,(double)amount/COIN,(int32_t)consensusBranchId); VerifyEval eval = [] (CC *cond, void *checker) { + fprintf(stderr,"checker.%p\n",(TransactionSignatureChecker*)checker); return ((TransactionSignatureChecker*)checker)->CheckEvalCondition(cond); }; diff --git a/src/script/serverchecker.cpp b/src/script/serverchecker.cpp index 4de69001a..4451ab485 100644 --- a/src/script/serverchecker.cpp +++ b/src/script/serverchecker.cpp @@ -102,5 +102,6 @@ bool ServerTransactionSignatureChecker::VerifySignature(const std::vector Date: Sat, 18 Aug 2018 01:27:42 -1100 Subject: [PATCH 65/74] +print --- src/cryptoconditions/src/cryptoconditions.c | 5 +++++ src/script/interpreter.cpp | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/cryptoconditions/src/cryptoconditions.c b/src/cryptoconditions/src/cryptoconditions.c index b58d7a70c..011995566 100644 --- a/src/cryptoconditions/src/cryptoconditions.c +++ b/src/cryptoconditions/src/cryptoconditions.c @@ -232,12 +232,15 @@ int cc_verify(const struct CC *cond, const unsigned char *msg, size_t msgLength, const unsigned char *condBin, size_t condBinLength, VerifyEval verifyEval, void *evalContext) { unsigned char targetBinary[1000]; + fprintf(stderr,"in cc_verify cond.%p msg.%p[%d] dohash.%d condbin.%p[%d]\n",cond,msg,(int32_t)msgLength,doHashMsg,condBin,(int32_t)condBinLength); const size_t binLength = cc_conditionBinary(cond, targetBinary); if (0 != memcmp(condBin, targetBinary, binLength)) { + fprintf(stderr,"cc_verify error A\n"); return 0; } if (!cc_ed25519VerifyTree(cond, msg, msgLength)) { + fprintf(stderr,"cc_verify error B\n"); return 0; } @@ -246,10 +249,12 @@ int cc_verify(const struct CC *cond, const unsigned char *msg, size_t msgLength, else memcpy(msgHash, msg, 32); if (!cc_secp256k1VerifyTreeMsg32(cond, msgHash)) { + fprintf(stderr,"cc_verify error C\n"); return 0; } if (!cc_verifyEval(cond, verifyEval, evalContext)) { + fprintf(stderr,"cc_verify error D\n"); return 0; } return 1; diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index e12e3a457..c9bf1b1ab 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -1326,7 +1326,7 @@ int TransactionSignatureChecker::CheckCryptoCondition( fprintf(stderr,"checker.%p\n",(TransactionSignatureChecker*)checker); return ((TransactionSignatureChecker*)checker)->CheckEvalCondition(cond); }; - + fprintf(stderr,"non-checker path\n"); int out = cc_verify(cond, (const unsigned char*)&sighash, 32, 0, condBin.data(), condBin.size(), eval, (void*)this); fprintf(stderr,"out.%d from cc_verify\n",(int32_t)out); From dc71c17e6f387359a6cb4830362b89c81043dc6b Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 18 Aug 2018 01:35:48 -1100 Subject: [PATCH 66/74] +prints --- src/cryptoconditions/src/cryptoconditions.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/cryptoconditions/src/cryptoconditions.c b/src/cryptoconditions/src/cryptoconditions.c index 011995566..488581e2a 100644 --- a/src/cryptoconditions/src/cryptoconditions.c +++ b/src/cryptoconditions/src/cryptoconditions.c @@ -117,14 +117,20 @@ uint32_t fromAsnSubtypes(const ConditionTypes_t types) { size_t cc_conditionBinary(const CC *cond, unsigned char *buf) { + fprintf(stderr,"inside cc_conditionBinary\n"); Condition_t *asn = calloc(1, sizeof(Condition_t)); + fprintf(stderr,"asn.%p\n",asn); asnCondition(cond, asn); + fprintf(stderr,"call derencode\n"); asn_enc_rval_t rc = der_encode_to_buffer(&asn_DEF_Condition, asn, buf, 1000); + fprintf(stderr,"back from derencode\n"); if (rc.encoded == -1) { fprintf(stderr, "CONDITION NOT ENCODED\n"); return 0; } + fprintf(stderr,"call ASN_STRUCT_FREE\n"); ASN_STRUCT_FREE(asn_DEF_Condition, asn); + fprintf(stderr,"return rc.encoded %d\n",(int32_t)rc.encoded); return rc.encoded; } From ebd4cace15b5e86eed68488bb4565b31d1d307f0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 18 Aug 2018 01:36:50 -1100 Subject: [PATCH 67/74] +print --- src/cryptoconditions/src/cryptoconditions.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/cryptoconditions/src/cryptoconditions.c b/src/cryptoconditions/src/cryptoconditions.c index 488581e2a..0ee535e2d 100644 --- a/src/cryptoconditions/src/cryptoconditions.c +++ b/src/cryptoconditions/src/cryptoconditions.c @@ -244,25 +244,29 @@ int cc_verify(const struct CC *cond, const unsigned char *msg, size_t msgLength, fprintf(stderr,"cc_verify error A\n"); return 0; } - + fprintf(stderr,"after memcmp\n"); if (!cc_ed25519VerifyTree(cond, msg, msgLength)) { fprintf(stderr,"cc_verify error B\n"); return 0; } + fprintf(stderr,"after cc_ed25519VerifyTree\n"); unsigned char msgHash[32]; if (doHashMsg) sha256(msg, msgLength, msgHash); else memcpy(msgHash, msg, 32); + fprintf(stderr,"after memcpy/sha256\n"); if (!cc_secp256k1VerifyTreeMsg32(cond, msgHash)) { fprintf(stderr,"cc_verify error C\n"); return 0; } + fprintf(stderr,"after cc_secp256k1VerifyTreeMsg32\n"); if (!cc_verifyEval(cond, verifyEval, evalContext)) { fprintf(stderr,"cc_verify error D\n"); return 0; } + fprintf(stderr,"return 1\n"); return 1; } From 0545c2cd9555d1c86b69b81cf6289ff9f07869fc Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 18 Aug 2018 01:42:35 -1100 Subject: [PATCH 68/74] Next layer --- src/cryptoconditions/src/cryptoconditions.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/cryptoconditions/src/cryptoconditions.c b/src/cryptoconditions/src/cryptoconditions.c index 0ee535e2d..9ccb987fb 100644 --- a/src/cryptoconditions/src/cryptoconditions.c +++ b/src/cryptoconditions/src/cryptoconditions.c @@ -153,12 +153,15 @@ void asnCondition(const CC *cond, Condition_t *asn) { // This may look a little weird - we dont have a reference here to the correct // union choice for the condition type, so we just assign everything to the threshold // type. This works out nicely since the union choices have the same binary interface. - + fprintf(stderr,"asnCondition type.%p\n",asn->type); CompoundSha256Condition_t *choice = &asn->choice.thresholdSha256; choice->cost = cc_getCost(cond); + fprintf(stderr,"after cost\n"); choice->fingerprint.buf = cond->type->fingerprint(cond); choice->fingerprint.size = 32; + fprintf(stderr,"after fingerprint\n"); choice->subtypes = asnSubtypes(cond->type->getSubtypes(cond)); + fprintf(stderr,"after asnSubtypes\n"); } From 9178b67d65e83cfbed524cec46d8485dbbbde9f7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 18 Aug 2018 01:48:16 -1100 Subject: [PATCH 69/74] Fix --- src/cryptoconditions/src/cryptoconditions.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cryptoconditions/src/cryptoconditions.c b/src/cryptoconditions/src/cryptoconditions.c index 9ccb987fb..c132b4870 100644 --- a/src/cryptoconditions/src/cryptoconditions.c +++ b/src/cryptoconditions/src/cryptoconditions.c @@ -153,7 +153,7 @@ void asnCondition(const CC *cond, Condition_t *asn) { // This may look a little weird - we dont have a reference here to the correct // union choice for the condition type, so we just assign everything to the threshold // type. This works out nicely since the union choices have the same binary interface. - fprintf(stderr,"asnCondition type.%p\n",asn->type); + fprintf(stderr,"asnCondition type.%p\n",cond->type); CompoundSha256Condition_t *choice = &asn->choice.thresholdSha256; choice->cost = cc_getCost(cond); fprintf(stderr,"after cost\n"); From a57cea0bee671a68b2eda52d76d3a71f505d4869 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 18 Aug 2018 02:54:51 -1100 Subject: [PATCH 70/74] Fingerprint prints --- src/cryptoconditions/src/anon.c | 1 + src/cryptoconditions/src/cryptoconditions.c | 3 +-- src/cryptoconditions/src/ed25519.c | 1 + src/cryptoconditions/src/eval.c | 1 + src/cryptoconditions/src/prefix.c | 1 + src/cryptoconditions/src/preimage.c | 1 + src/cryptoconditions/src/secp256k1.c | 1 + src/cryptoconditions/src/threshold.c | 1 + 8 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/cryptoconditions/src/anon.c b/src/cryptoconditions/src/anon.c index 43e96ae44..8c2b9cea6 100644 --- a/src/cryptoconditions/src/anon.c +++ b/src/cryptoconditions/src/anon.c @@ -55,6 +55,7 @@ static void anonToJSON(const CC *cond, cJSON *params) { static unsigned char *anonFingerprint(const CC *cond) { unsigned char *out = calloc(1, 32); + fprintf(stderr,"anon fingerprint %p %p\n",out,cond->fingerprint); memcpy(out, cond->fingerprint, 32); return out; } diff --git a/src/cryptoconditions/src/cryptoconditions.c b/src/cryptoconditions/src/cryptoconditions.c index c132b4870..fe277904e 100644 --- a/src/cryptoconditions/src/cryptoconditions.c +++ b/src/cryptoconditions/src/cryptoconditions.c @@ -71,8 +71,7 @@ char *cc_conditionUri(const CC *cond) { unsigned char *encoded = base64_encode(fp, 32); unsigned char *out = calloc(1, 1000); - sprintf(out, "ni:///sha-256;%s?fpt=%s&cost=%lu", - encoded, cc_typeName(cond), cc_getCost(cond)); + sprintf(out, "ni:///sha-256;%s?fpt=%s&cost=%lu",encoded, cc_typeName(cond), cc_getCost(cond)); if (cond->type->getSubtypes) { appendUriSubtypes(cond->type->getSubtypes(cond), out); diff --git a/src/cryptoconditions/src/ed25519.c b/src/cryptoconditions/src/ed25519.c index d7ebb085e..8d4046241 100644 --- a/src/cryptoconditions/src/ed25519.c +++ b/src/cryptoconditions/src/ed25519.c @@ -27,6 +27,7 @@ struct CCType CC_Ed25519Type; static unsigned char *ed25519Fingerprint(const CC *cond) { Ed25519FingerprintContents_t *fp = calloc(1, sizeof(Ed25519FingerprintContents_t)); + fprintf(stderr,"ed25519 fingerprint %p %p\n",fp,cond->publicKey); OCTET_STRING_fromBuf(&fp->publicKey, cond->publicKey, 32); return hashFingerprintContents(&asn_DEF_Ed25519FingerprintContents, fp); } diff --git a/src/cryptoconditions/src/eval.c b/src/cryptoconditions/src/eval.c index df0f1af5d..a3e773699 100644 --- a/src/cryptoconditions/src/eval.c +++ b/src/cryptoconditions/src/eval.c @@ -27,6 +27,7 @@ struct CCType CC_EvalType; static unsigned char *evalFingerprint(const CC *cond) { unsigned char *hash = calloc(1, 32); + fprintf(stderr,"evalfingerprint %p %p\n",hash,cond->code); sha256(cond->code, cond->codeLength, hash); return hash; } diff --git a/src/cryptoconditions/src/prefix.c b/src/cryptoconditions/src/prefix.c index bebebba6e..ec961a939 100644 --- a/src/cryptoconditions/src/prefix.c +++ b/src/cryptoconditions/src/prefix.c @@ -39,6 +39,7 @@ static int prefixVisitChildren(CC *cond, CCVisitor visitor) { static unsigned char *prefixFingerprint(const CC *cond) { PrefixFingerprintContents_t *fp = calloc(1, sizeof(PrefixFingerprintContents_t)); + fprintf(stderr,"prefixfinger %p %p\n",fp,cond->prefix); asnCondition(cond->subcondition, &fp->subcondition); // TODO: check asnCondition for safety fp->maxMessageLength = cond->maxMessageLength; OCTET_STRING_fromBuf(&fp->prefix, cond->prefix, cond->prefixLength); diff --git a/src/cryptoconditions/src/preimage.c b/src/cryptoconditions/src/preimage.c index 8902817dd..3b1a1cf2e 100644 --- a/src/cryptoconditions/src/preimage.c +++ b/src/cryptoconditions/src/preimage.c @@ -46,6 +46,7 @@ static unsigned long preimageCost(const CC *cond) { static unsigned char *preimageFingerprint(const CC *cond) { unsigned char *hash = calloc(1, 32); + fprintf(stderr,"preimage %p %p\n",hash,cond->preimage); sha256(cond->preimage, cond->preimageLength, hash); return hash; } diff --git a/src/cryptoconditions/src/secp256k1.c b/src/cryptoconditions/src/secp256k1.c index 78b9c4e9e..cbf4dfd32 100644 --- a/src/cryptoconditions/src/secp256k1.c +++ b/src/cryptoconditions/src/secp256k1.c @@ -73,6 +73,7 @@ void initVerify() { static unsigned char *secp256k1Fingerprint(const CC *cond) { Secp256k1FingerprintContents_t *fp = calloc(1, sizeof(Secp256k1FingerprintContents_t)); + fprintf(stderr,"secpfinger %p %p\n",fp,cond->publicKey); OCTET_STRING_fromBuf(&fp->publicKey, cond->publicKey, SECP256K1_PK_SIZE); return hashFingerprintContents(&asn_DEF_Secp256k1FingerprintContents, fp); } diff --git a/src/cryptoconditions/src/threshold.c b/src/cryptoconditions/src/threshold.c index 88d4e7f50..0ac2b0dad 100644 --- a/src/cryptoconditions/src/threshold.c +++ b/src/cryptoconditions/src/threshold.c @@ -86,6 +86,7 @@ static int cmpConditionBin(const void *a, const void *b) { static unsigned char *thresholdFingerprint(const CC *cond) { /* Create fingerprint */ ThresholdFingerprintContents_t *fp = calloc(1, sizeof(ThresholdFingerprintContents_t)); + fprintf(stderr,"thresholdfinger %p\n",fp); fp->threshold = cond->threshold; for (int i=0; isize; i++) { Condition_t *asnCond = asnConditionNew(cond->subconditions[i]); From b626aafeb041db7f68faea47c23478e834bec15c Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 18 Aug 2018 03:01:37 -1100 Subject: [PATCH 71/74] Smaller buf --- src/cryptoconditions/src/internal.h | 2 +- src/cryptoconditions/src/secp256k1.c | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/cryptoconditions/src/internal.h b/src/cryptoconditions/src/internal.h index 8082f9b75..3010a0bb2 100644 --- a/src/cryptoconditions/src/internal.h +++ b/src/cryptoconditions/src/internal.h @@ -28,7 +28,7 @@ extern "C" { #endif -#define BUF_SIZE 1024 * 1024 +#define BUF_SIZE 65536 // does it really need to be 1 MB?? 1024 * 1024 typedef char bool; diff --git a/src/cryptoconditions/src/secp256k1.c b/src/cryptoconditions/src/secp256k1.c index cbf4dfd32..75d7f2690 100644 --- a/src/cryptoconditions/src/secp256k1.c +++ b/src/cryptoconditions/src/secp256k1.c @@ -73,8 +73,9 @@ void initVerify() { static unsigned char *secp256k1Fingerprint(const CC *cond) { Secp256k1FingerprintContents_t *fp = calloc(1, sizeof(Secp256k1FingerprintContents_t)); - fprintf(stderr,"secpfinger %p %p\n",fp,cond->publicKey); + fprintf(stderr,"secpfinger %p %p size %d vs %d\n",fp,cond->publicKey,(int32_t)sizeof(Secp256k1FingerprintContents_t),(int32_t)SECP256K1_PK_SIZE); OCTET_STRING_fromBuf(&fp->publicKey, cond->publicKey, SECP256K1_PK_SIZE); + fprintf(stderr,"got octet\n"); return hashFingerprintContents(&asn_DEF_Secp256k1FingerprintContents, fp); } From b4795ed684e6cff5ada8bada1b40f3ab750d766d Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 18 Aug 2018 03:07:53 -1100 Subject: [PATCH 72/74] -prints --- src/cc/CCutils.cpp | 2 +- src/cc/eval.cpp | 2 +- src/cryptoconditions/src/cryptoconditions.c | 17 +---------------- src/cryptoconditions/src/ed25519.c | 2 +- src/cryptoconditions/src/eval.c | 2 +- src/cryptoconditions/src/prefix.c | 2 +- src/cryptoconditions/src/preimage.c | 2 +- src/cryptoconditions/src/secp256k1.c | 3 +-- src/cryptoconditions/src/threshold.c | 2 +- src/script/interpreter.cpp | 12 ++++++------ 10 files changed, 15 insertions(+), 31 deletions(-) diff --git a/src/cc/CCutils.cpp b/src/cc/CCutils.cpp index 785e9d952..8cb06ab25 100644 --- a/src/cc/CCutils.cpp +++ b/src/cc/CCutils.cpp @@ -260,7 +260,7 @@ bool ProcessCC(struct CCcontract_info *cp,Eval* eval, std::vector param //txid = ctx.GetHash(); //if ( txid == cp->prevtxid ) // return(true); - fprintf(stderr,"process CC %02x\n",cp->evalcode); + //fprintf(stderr,"process CC %02x\n",cp->evalcode); if ( paramsNull.size() != 0 ) // Don't expect params return eval->Invalid("Cannot have params"); else if ( ctx.vout.size() == 0 ) diff --git a/src/cc/eval.cpp b/src/cc/eval.cpp index 949728be4..b6fcf57dd 100644 --- a/src/cc/eval.cpp +++ b/src/cc/eval.cpp @@ -38,7 +38,7 @@ bool RunCCEval(const CC *cond, const CTransaction &tx, unsigned int nIn) pthread_mutex_lock(&KOMODO_CC_mutex); bool out = eval->Dispatch(cond, tx, nIn); pthread_mutex_unlock(&KOMODO_CC_mutex); - fprintf(stderr,"out %d vs %d isValid\n",(int32_t)out,(int32_t)eval->state.IsValid()); + //fprintf(stderr,"out %d vs %d isValid\n",(int32_t)out,(int32_t)eval->state.IsValid()); assert(eval->state.IsValid() == out); if (eval->state.IsValid()) return true; diff --git a/src/cryptoconditions/src/cryptoconditions.c b/src/cryptoconditions/src/cryptoconditions.c index fe277904e..c9a4b27df 100644 --- a/src/cryptoconditions/src/cryptoconditions.c +++ b/src/cryptoconditions/src/cryptoconditions.c @@ -116,20 +116,14 @@ uint32_t fromAsnSubtypes(const ConditionTypes_t types) { size_t cc_conditionBinary(const CC *cond, unsigned char *buf) { - fprintf(stderr,"inside cc_conditionBinary\n"); Condition_t *asn = calloc(1, sizeof(Condition_t)); - fprintf(stderr,"asn.%p\n",asn); asnCondition(cond, asn); - fprintf(stderr,"call derencode\n"); asn_enc_rval_t rc = der_encode_to_buffer(&asn_DEF_Condition, asn, buf, 1000); - fprintf(stderr,"back from derencode\n"); if (rc.encoded == -1) { fprintf(stderr, "CONDITION NOT ENCODED\n"); return 0; } - fprintf(stderr,"call ASN_STRUCT_FREE\n"); ASN_STRUCT_FREE(asn_DEF_Condition, asn); - fprintf(stderr,"return rc.encoded %d\n",(int32_t)rc.encoded); return rc.encoded; } @@ -152,15 +146,11 @@ void asnCondition(const CC *cond, Condition_t *asn) { // This may look a little weird - we dont have a reference here to the correct // union choice for the condition type, so we just assign everything to the threshold // type. This works out nicely since the union choices have the same binary interface. - fprintf(stderr,"asnCondition type.%p\n",cond->type); CompoundSha256Condition_t *choice = &asn->choice.thresholdSha256; choice->cost = cc_getCost(cond); - fprintf(stderr,"after cost\n"); choice->fingerprint.buf = cond->type->fingerprint(cond); choice->fingerprint.size = 32; - fprintf(stderr,"after fingerprint\n"); choice->subtypes = asnSubtypes(cond->type->getSubtypes(cond)); - fprintf(stderr,"after asnSubtypes\n"); } @@ -240,35 +230,30 @@ int cc_verify(const struct CC *cond, const unsigned char *msg, size_t msgLength, const unsigned char *condBin, size_t condBinLength, VerifyEval verifyEval, void *evalContext) { unsigned char targetBinary[1000]; - fprintf(stderr,"in cc_verify cond.%p msg.%p[%d] dohash.%d condbin.%p[%d]\n",cond,msg,(int32_t)msgLength,doHashMsg,condBin,(int32_t)condBinLength); + //fprintf(stderr,"in cc_verify cond.%p msg.%p[%d] dohash.%d condbin.%p[%d]\n",cond,msg,(int32_t)msgLength,doHashMsg,condBin,(int32_t)condBinLength); const size_t binLength = cc_conditionBinary(cond, targetBinary); if (0 != memcmp(condBin, targetBinary, binLength)) { fprintf(stderr,"cc_verify error A\n"); return 0; } - fprintf(stderr,"after memcmp\n"); if (!cc_ed25519VerifyTree(cond, msg, msgLength)) { fprintf(stderr,"cc_verify error B\n"); return 0; } - fprintf(stderr,"after cc_ed25519VerifyTree\n"); unsigned char msgHash[32]; if (doHashMsg) sha256(msg, msgLength, msgHash); else memcpy(msgHash, msg, 32); - fprintf(stderr,"after memcpy/sha256\n"); if (!cc_secp256k1VerifyTreeMsg32(cond, msgHash)) { fprintf(stderr,"cc_verify error C\n"); return 0; } - fprintf(stderr,"after cc_secp256k1VerifyTreeMsg32\n"); if (!cc_verifyEval(cond, verifyEval, evalContext)) { fprintf(stderr,"cc_verify error D\n"); return 0; } - fprintf(stderr,"return 1\n"); return 1; } diff --git a/src/cryptoconditions/src/ed25519.c b/src/cryptoconditions/src/ed25519.c index 8d4046241..4fb3bbb8d 100644 --- a/src/cryptoconditions/src/ed25519.c +++ b/src/cryptoconditions/src/ed25519.c @@ -27,7 +27,7 @@ struct CCType CC_Ed25519Type; static unsigned char *ed25519Fingerprint(const CC *cond) { Ed25519FingerprintContents_t *fp = calloc(1, sizeof(Ed25519FingerprintContents_t)); - fprintf(stderr,"ed25519 fingerprint %p %p\n",fp,cond->publicKey); + //fprintf(stderr,"ed25519 fingerprint %p %p\n",fp,cond->publicKey); OCTET_STRING_fromBuf(&fp->publicKey, cond->publicKey, 32); return hashFingerprintContents(&asn_DEF_Ed25519FingerprintContents, fp); } diff --git a/src/cryptoconditions/src/eval.c b/src/cryptoconditions/src/eval.c index a3e773699..544f6dd54 100644 --- a/src/cryptoconditions/src/eval.c +++ b/src/cryptoconditions/src/eval.c @@ -27,7 +27,7 @@ struct CCType CC_EvalType; static unsigned char *evalFingerprint(const CC *cond) { unsigned char *hash = calloc(1, 32); - fprintf(stderr,"evalfingerprint %p %p\n",hash,cond->code); + //fprintf(stderr,"evalfingerprint %p %p\n",hash,cond->code); sha256(cond->code, cond->codeLength, hash); return hash; } diff --git a/src/cryptoconditions/src/prefix.c b/src/cryptoconditions/src/prefix.c index ec961a939..626fc5992 100644 --- a/src/cryptoconditions/src/prefix.c +++ b/src/cryptoconditions/src/prefix.c @@ -39,7 +39,7 @@ static int prefixVisitChildren(CC *cond, CCVisitor visitor) { static unsigned char *prefixFingerprint(const CC *cond) { PrefixFingerprintContents_t *fp = calloc(1, sizeof(PrefixFingerprintContents_t)); - fprintf(stderr,"prefixfinger %p %p\n",fp,cond->prefix); + //fprintf(stderr,"prefixfinger %p %p\n",fp,cond->prefix); asnCondition(cond->subcondition, &fp->subcondition); // TODO: check asnCondition for safety fp->maxMessageLength = cond->maxMessageLength; OCTET_STRING_fromBuf(&fp->prefix, cond->prefix, cond->prefixLength); diff --git a/src/cryptoconditions/src/preimage.c b/src/cryptoconditions/src/preimage.c index 3b1a1cf2e..7c8e56996 100644 --- a/src/cryptoconditions/src/preimage.c +++ b/src/cryptoconditions/src/preimage.c @@ -46,7 +46,7 @@ static unsigned long preimageCost(const CC *cond) { static unsigned char *preimageFingerprint(const CC *cond) { unsigned char *hash = calloc(1, 32); - fprintf(stderr,"preimage %p %p\n",hash,cond->preimage); + //fprintf(stderr,"preimage %p %p\n",hash,cond->preimage); sha256(cond->preimage, cond->preimageLength, hash); return hash; } diff --git a/src/cryptoconditions/src/secp256k1.c b/src/cryptoconditions/src/secp256k1.c index 75d7f2690..c1eb82765 100644 --- a/src/cryptoconditions/src/secp256k1.c +++ b/src/cryptoconditions/src/secp256k1.c @@ -73,9 +73,8 @@ void initVerify() { static unsigned char *secp256k1Fingerprint(const CC *cond) { Secp256k1FingerprintContents_t *fp = calloc(1, sizeof(Secp256k1FingerprintContents_t)); - fprintf(stderr,"secpfinger %p %p size %d vs %d\n",fp,cond->publicKey,(int32_t)sizeof(Secp256k1FingerprintContents_t),(int32_t)SECP256K1_PK_SIZE); + //fprintf(stderr,"secpfinger %p %p size %d vs %d\n",fp,cond->publicKey,(int32_t)sizeof(Secp256k1FingerprintContents_t),(int32_t)SECP256K1_PK_SIZE); OCTET_STRING_fromBuf(&fp->publicKey, cond->publicKey, SECP256K1_PK_SIZE); - fprintf(stderr,"got octet\n"); return hashFingerprintContents(&asn_DEF_Secp256k1FingerprintContents, fp); } diff --git a/src/cryptoconditions/src/threshold.c b/src/cryptoconditions/src/threshold.c index 0ac2b0dad..13c3fdab3 100644 --- a/src/cryptoconditions/src/threshold.c +++ b/src/cryptoconditions/src/threshold.c @@ -86,7 +86,7 @@ static int cmpConditionBin(const void *a, const void *b) { static unsigned char *thresholdFingerprint(const CC *cond) { /* Create fingerprint */ ThresholdFingerprintContents_t *fp = calloc(1, sizeof(ThresholdFingerprintContents_t)); - fprintf(stderr,"thresholdfinger %p\n",fp); + //fprintf(stderr,"thresholdfinger %p\n",fp); fp->threshold = cond->threshold; for (int i=0; isize; i++) { Condition_t *asnCond = asnConditionNew(cond->subconditions[i]); diff --git a/src/script/interpreter.cpp b/src/script/interpreter.cpp index c9bf1b1ab..c2e02ad25 100644 --- a/src/script/interpreter.cpp +++ b/src/script/interpreter.cpp @@ -952,7 +952,7 @@ bool EvalScript( if (stack.size() < 2) return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION); -fprintf(stderr,"check cryptocondition\n"); +//fprintf(stderr,"check cryptocondition\n"); int fResult = checker.CheckCryptoCondition(stacktop(-1), stacktop(-2), script, consensusBranchId); if (fResult == -1) { return set_error(serror, SCRIPT_ERR_CRYPTOCONDITION_INVALID_FULFILLMENT); @@ -1313,7 +1313,7 @@ int TransactionSignatureChecker::CheckCryptoCondition( } catch (logic_error ex) { return 0; } - int32_t z; uint8_t *ptr; + /*int32_t z; uint8_t *ptr; ptr = (uint8_t *)scriptCode.data(); for (z=0; zCheckEvalCondition(cond); }; - fprintf(stderr,"non-checker path\n"); + //fprintf(stderr,"non-checker path\n"); int out = cc_verify(cond, (const unsigned char*)&sighash, 32, 0, condBin.data(), condBin.size(), eval, (void*)this); - fprintf(stderr,"out.%d from cc_verify\n",(int32_t)out); + //fprintf(stderr,"out.%d from cc_verify\n",(int32_t)out); cc_free(cond); return out; } From 7b257028f8be580b1219c7fabd23adf54d4a75b7 Mon Sep 17 00:00:00 2001 From: jl777 Date: Sat, 18 Aug 2018 03:09:36 -1100 Subject: [PATCH 73/74] Test --- src/cryptoconditions/src/cryptoconditions.c | 2 +- src/script/serverchecker.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cryptoconditions/src/cryptoconditions.c b/src/cryptoconditions/src/cryptoconditions.c index c9a4b27df..b9b08af20 100644 --- a/src/cryptoconditions/src/cryptoconditions.c +++ b/src/cryptoconditions/src/cryptoconditions.c @@ -251,7 +251,7 @@ int cc_verify(const struct CC *cond, const unsigned char *msg, size_t msgLength, } if (!cc_verifyEval(cond, verifyEval, evalContext)) { - fprintf(stderr,"cc_verify error D\n"); + //fprintf(stderr,"cc_verify error D\n"); return 0; } return 1; diff --git a/src/script/serverchecker.cpp b/src/script/serverchecker.cpp index 4451ab485..e82fd3a81 100644 --- a/src/script/serverchecker.cpp +++ b/src/script/serverchecker.cpp @@ -102,6 +102,6 @@ bool ServerTransactionSignatureChecker::VerifySignature(const std::vector Date: Sat, 18 Aug 2018 03:19:28 -1100 Subject: [PATCH 74/74] Reduce BUF_SIZE --- src/cryptoconditions/src/internal.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cryptoconditions/src/internal.h b/src/cryptoconditions/src/internal.h index 3010a0bb2..41080186e 100644 --- a/src/cryptoconditions/src/internal.h +++ b/src/cryptoconditions/src/internal.h @@ -28,7 +28,7 @@ extern "C" { #endif -#define BUF_SIZE 65536 // does it really need to be 1 MB?? 1024 * 1024 +#define BUF_SIZE 4096 typedef char bool;