From d587c96cfc9aaf92c853ffda2c31b8ad509340f2 Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 7 Aug 2018 04:46:54 -1100 Subject: [PATCH 01/38] Minimum rewardsfunding --- 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 afa025851..d9de1ebdb 100644 --- a/src/cc/rewards.cpp +++ b/src/cc/rewards.cpp @@ -412,7 +412,7 @@ UniValue RewardsList() std::string RewardsCreateFunding(uint64_t txfee,char *planstr,int64_t funds,int64_t APR,int64_t minseconds,int64_t maxseconds,int64_t mindeposit) { CMutableTransaction mtx; CPubKey mypk,rewardspk; CScript opret; uint64_t sbits,a,b,c,d; struct CCcontract_info *cp,C; - if ( funds < 0 || mindeposit < 0 || minseconds < 0 || maxseconds < 0 ) + if ( funds < COIN || mindeposit < 0 || minseconds < 0 || maxseconds < 0 ) { fprintf(stderr,"negative parameter error\n"); return(0); From 112803d8e12488edc9f7b3fc59b0843c1487b66b Mon Sep 17 00:00:00 2001 From: jl777 Date: Tue, 7 Aug 2018 21:25:51 -1100 Subject: [PATCH 02/38] Require sbits/fundingtxid matches for rewards vins --- src/cc/rewards.cpp | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/src/cc/rewards.cpp b/src/cc/rewards.cpp index d9de1ebdb..6c5975e51 100644 --- a/src/cc/rewards.cpp +++ b/src/cc/rewards.cpp @@ -137,18 +137,23 @@ uint8_t DecodeRewardsOpRet(uint256 txid,const CScript &scriptPubKey,uint64_t &sb return(0); } -uint64_t IsRewardsvout(struct CCcontract_info *cp,const CTransaction& tx,int32_t v) +uint64_t IsRewardsvout(struct CCcontract_info *cp,const CTransaction& tx,int32_t v,uint64_t refsbits,uint256 reffundingtxid) { - char destaddr[64]; - if ( tx.vout[v].scriptPubKey.IsPayToCryptoCondition() != 0 ) + char destaddr[64]; uint64_t sbits; uint256 fundingtxid,txid; uint8_t funcid; int32_t numvouts; + if ( tx.vout[v].scriptPubKey.IsPayToCryptoCondition() != 0 && (numvouts= (int32_t)tx.vout.size()) > 0 ) { - if ( Getscriptaddress(destaddr,tx.vout[v].scriptPubKey) > 0 && strcmp(destaddr,cp->unspendableCCaddr) == 0 ) - return(tx.vout[v].nValue); + txid = tx.GetHash(); + if ( (funcid= DecodeRewardsOpRet(txid,tx.vout[numvouts-1].scriptPubKey,sbits,fundingtxid)) != 0 && sbits == refsbits && (fundingtxid == reffundingtxid || txid == reffundingtxid) ) + { + + if ( Getscriptaddress(destaddr,tx.vout[v].scriptPubKey) > 0 && strcmp(destaddr,cp->unspendableCCaddr) == 0 ) + return(tx.vout[v].nValue); + } } return(0); } -bool RewardsExactAmounts(struct CCcontract_info *cp,Eval *eval,const CTransaction &tx,uint64_t txfee) +bool RewardsExactAmounts(struct CCcontract_info *cp,Eval *eval,const CTransaction &tx,uint64_t txfee,uint64_t refsbits,uint256 reffundingtxid) { static uint256 zerohash; CTransaction vinTx; uint256 hashBlock; int32_t i,numvins,numvouts; uint64_t inputs=0,outputs=0,assetoshis; @@ -164,7 +169,7 @@ bool RewardsExactAmounts(struct CCcontract_info *cp,Eval *eval,const CTransactio { if ( hashBlock == zerohash ) return eval->Invalid("cant rewards from mempool"); - if ( (assetoshis= IsRewardsvout(cp,vinTx,tx.vin[i].prevout.n)) != 0 ) + if ( (assetoshis= IsRewardsvout(cp,vinTx,tx.vin[i].prevout.n,refsbits,reffundingtxid)) != 0 ) inputs += assetoshis; } } @@ -172,7 +177,7 @@ bool RewardsExactAmounts(struct CCcontract_info *cp,Eval *eval,const CTransactio for (i=0; iismyvin)(tx.vin[i].scriptSig) == 0 ) return eval->Invalid("unexpected normal vin for unlock"); } - if ( RewardsExactAmounts(cp,eval,tx,txfee+tx.vout[1].nValue) == 0 ) + if ( RewardsExactAmounts(cp,eval,tx,txfee+tx.vout[1].nValue,sbits,fundingtxid) == 0 ) return false; else if ( eval->GetTxUnconfirmed(tx.vin[0].prevout.hash,vinTx,hashBlock) == 0 ) return eval->Invalid("always should find vin.0, but didnt"); @@ -264,7 +269,7 @@ bool RewardsValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &t } // 'L' vs 'F' and 'A' -uint64_t AddRewardsInputs(CScript &scriptPubKey,int32_t fundsflag,struct CCcontract_info *cp,CMutableTransaction &mtx,CPubKey pk,uint64_t total,int32_t maxinputs) +uint64_t AddRewardsInputs(CScript &scriptPubKey,int32_t fundsflag,struct CCcontract_info *cp,CMutableTransaction &mtx,CPubKey pk,uint64_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 j,vout,n = 0; uint8_t funcid; std::vector > unspentOutputs; @@ -286,6 +291,8 @@ uint64_t AddRewardsInputs(CScript &scriptPubKey,int32_t fundsflag,struct CCcontr { if ( (funcid= DecodeRewardsOpRet(txid,tx.vout[tx.vout.size()-1].scriptPubKey,sbits,fundingtxid)) != 0 ) { + 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; @@ -323,7 +330,7 @@ uint64_t RewardsPlanFunds(uint64_t refsbits,struct CCcontract_info *cp,CPubKey p { if ( (funcid == 'F' && reffundingtxid == txid) || reffundingtxid == fundingtxid ) { - if ( refsbits == sbits && (nValue= IsRewardsvout(cp,tx,vout)) > 0 ) + if ( refsbits == sbits && (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"); @@ -520,7 +527,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); + amount = AddRewardsInputs(scriptPubKey,0,cp,mtx,rewardspk,(1LL << 30),1,sbits,fundingtxid); else { GetCCaddress(cp,coinaddr,rewardspk); @@ -542,7 +549,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)) > 0 ) + if ( (inputs= AddRewardsInputs(ignore,1,cp,mtx,rewardspk,reward+txfee,30,sbits,fundingtxid)) > 0 ) { if ( inputs >= (reward + 2*txfee) ) CCchange = (inputs - (reward + txfee)); From aca80695b1aee53138edd62e5db438838b5d687c Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 8 Aug 2018 00:10:51 -1100 Subject: [PATCH 03/38] -print --- src/komodo.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo.h b/src/komodo.h index e89dea2e4..dff8b5ab6 100644 --- a/src/komodo.h +++ b/src/komodo.h @@ -427,7 +427,7 @@ void komodo_stateupdate(int32_t height,uint8_t notarypubs[][33],uint8_t numnotar errs++; if ( fwrite(opretbuf,1,olen,fp) != olen ) errs++; -printf("create ht.%d R opret[%d] sp.%p\n",height,olen,sp); +//printf("create ht.%d R opret[%d] sp.%p\n",height,olen,sp); //komodo_opreturn(height,opretvalue,opretbuf,olen,txhash,vout); komodo_eventadd_opreturn(sp,symbol,height,txhash,opretvalue,vout,opretbuf,olen); } From 84b0bd5230705641c292d740a5ca46726f4129fc Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 8 Aug 2018 10:40:25 -1100 Subject: [PATCH 04/38] Dont count PoW diff blocks for isPoS count --- src/komodo_bitcoind.h | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 89e79ccbd..372317050 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -1411,7 +1411,7 @@ arith_uint256 komodo_PoWtarget(int32_t *percPoSp,arith_uint256 target,int32_t he return(bnTarget); } -int32_t komodo_is_PoSblock(int32_t slowflag,int32_t height,CBlock *pblock,arith_uint256 bnTarget) +int32_t komodo_is_PoSblock(int32_t slowflag,int32_t height,CBlock *pblock,arith_uint256 bnTarget,arith_uint256 bhash) { CBlockIndex *previndex; char voutaddr[64],destaddr[64]; uint256 txid; uint32_t txtime,prevtime=0; int32_t vout,txn_count,eligible=0,isPoS = 0; uint64_t value; CTxDestination voutaddress; if ( ASSETCHAINS_STAKED == 100 && height <= 10 ) @@ -1448,7 +1448,17 @@ int32_t komodo_is_PoSblock(int32_t slowflag,int32_t height,CBlock *pblock,arith_ isPoS = 1; // close enough for a pre-filter //else fprintf(stderr,"komodo_is_PoSblock ht.%d (%s) != (%s) or %.8f != %.8f\n",height,destaddr,voutaddr,dstr(value),dstr(pblock->vtx[txn_count-1].vout[0].nValue)); } else fprintf(stderr,"komodo_is_PoSblock ht.%d couldnt extract voutaddress\n",height);*/ - } //else return(-1); + } + if ( slowflag != 0 && isPoS != 0 ) + { + bnTarget = komodo_PoWtarget(&PoSperc,bnTarget,height,ASSETCHAINS_STAKED); + if ( bhash < bnTarget ) + { + fprintf(stderr,"ht.%d isPoS but meets PoW diff!\n",height); + isPoS = 0; + } + } + //else return(-1); } //fprintf(stderr,"slow.%d ht.%d isPoS.%d\n",slowflag,height,isPoS); return(isPoS); @@ -1528,7 +1538,7 @@ int32_t komodo_checkPOW(int32_t slowflag,CBlock *pblock,int32_t height) } if ( ASSETCHAINS_STAKED != 0 && height >= 2 ) // must PoS or have at least 16x better PoW { - if ( (is_PoSblock= komodo_is_PoSblock(slowflag,height,pblock,bnTarget)) == 0 ) + if ( (is_PoSblock= komodo_is_PoSblock(slowflag,height,pblock,bnTarget,bhash)) == 0 ) { if ( ASSETCHAINS_STAKED == 100 && height > 100 ) // only PoS allowed! POSTEST64 return(-1); From 83f41bb0f9db920487167bd6401eb512114b5273 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 8 Aug 2018 10:41:26 -1100 Subject: [PATCH 05/38] PoSperc --- src/komodo_bitcoind.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 372317050..fc405d432 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -1413,7 +1413,7 @@ arith_uint256 komodo_PoWtarget(int32_t *percPoSp,arith_uint256 target,int32_t he int32_t komodo_is_PoSblock(int32_t slowflag,int32_t height,CBlock *pblock,arith_uint256 bnTarget,arith_uint256 bhash) { - CBlockIndex *previndex; char voutaddr[64],destaddr[64]; uint256 txid; uint32_t txtime,prevtime=0; int32_t vout,txn_count,eligible=0,isPoS = 0; uint64_t value; CTxDestination voutaddress; + CBlockIndex *previndex; char voutaddr[64],destaddr[64]; uint256 txid; uint32_t txtime,prevtime=0; int32_t vout,PoSperc,txn_count,eligible=0,isPoS = 0; uint64_t value; CTxDestination voutaddress; if ( ASSETCHAINS_STAKED == 100 && height <= 10 ) return(1); txn_count = pblock->vtx.size(); From 11b390d86cb51b03a20daf987f626aac82459245 Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 8 Aug 2018 22:59:21 -1100 Subject: [PATCH 06/38] Catch mined PoS lookalike blocks --- src/komodo_bitcoind.h | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index fc405d432..87bb19807 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -1434,25 +1434,17 @@ int32_t komodo_is_PoSblock(int32_t slowflag,int32_t height,CBlock *pblock,arith_ { if ( ASSETCHAINS_STAKED < 100 ) fprintf(stderr,"komodo_is_PoSblock PoS failure ht.%d eligible.%u vs blocktime.%u, lag.%d -> check to see if it is PoW block\n",height,eligible,(uint32_t)pblock->nTime,(int32_t)(eligible - pblock->nTime)); - } else isPoS = 1; + } else isPoS = 2; } - if ( slowflag == 0 ) // maybe previous block is not seen yet, do the best approx + if ( slowflag == 0 && isPoS == 0 ) // maybe previous block is not seen yet, do the best approx { if ( komodo_isPoS(pblock) != 0 ) isPoS = 1; - /*txtime = komodo_txtime(&value,txid,vout,destaddr); - if ( ExtractDestination(pblock->vtx[txn_count-1].vout[0].scriptPubKey,voutaddress) ) - { - strcpy(voutaddr,CBitcoinAddress(voutaddress).ToString().c_str()); - if ( strcmp(destaddr,voutaddr) == 0 && pblock->vtx[txn_count-1].vout[0].nValue == value ) - isPoS = 1; // close enough for a pre-filter - //else fprintf(stderr,"komodo_is_PoSblock ht.%d (%s) != (%s) or %.8f != %.8f\n",height,destaddr,voutaddr,dstr(value),dstr(pblock->vtx[txn_count-1].vout[0].nValue)); - } else fprintf(stderr,"komodo_is_PoSblock ht.%d couldnt extract voutaddress\n",height);*/ } if ( slowflag != 0 && isPoS != 0 ) { bnTarget = komodo_PoWtarget(&PoSperc,bnTarget,height,ASSETCHAINS_STAKED); - if ( bhash < bnTarget ) + if ( bhash < bnTarget || isPoS != 2 ) { fprintf(stderr,"ht.%d isPoS but meets PoW diff!\n",height); isPoS = 0; @@ -1461,7 +1453,7 @@ int32_t komodo_is_PoSblock(int32_t slowflag,int32_t height,CBlock *pblock,arith_ //else return(-1); } //fprintf(stderr,"slow.%d ht.%d isPoS.%d\n",slowflag,height,isPoS); - return(isPoS); + return(isPoS != 0); } int64_t komodo_checkcommission(CBlock *pblock,int32_t height) From efb8981cb9d9ff63e3aa499ae4bc26652af319ef Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 8 Aug 2018 23:41:59 -1100 Subject: [PATCH 07/38] Segid cache --- src/chain.h | 3 ++- src/komodo_bitcoind.h | 44 ++++++++++++++++++++++++++++++++++++++----- src/main.cpp | 4 ++++ 3 files changed, 45 insertions(+), 6 deletions(-) diff --git a/src/chain.h b/src/chain.h index d882083e6..394b4a6bd 100644 --- a/src/chain.h +++ b/src/chain.h @@ -121,7 +121,7 @@ public: //! height of the entry in the chain. The genesis block has height 0 int nHeight; - int64_t newcoins,zfunds; + int64_t newcoins,zfunds; int8_t segid; // jl777 fields //! Which # file this block is stored in (blk?????.dat) int nFile; @@ -182,6 +182,7 @@ public: { phashBlock = NULL; newcoins = zfunds = 0; + segid = -2; pprev = NULL; pskip = NULL; nHeight = 0; diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 87bb19807..96c76245f 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -1140,6 +1140,8 @@ int8_t komodo_segid(int32_t height) CTxDestination voutaddress; CBlock block; CBlockIndex *pindex; uint64_t value; uint32_t txtime; char voutaddr[64],destaddr[64]; int32_t txn_count,vout; uint256 txid; int8_t segid = -1; if ( height > 0 && (pindex= komodo_chainactive(height)) != 0 ) { + if ( pindex->segid >= -1 ) + return(pindex->segid); if ( komodo_blockload(block,pindex) == 0 ) { txn_count = block.vtx.size(); @@ -1413,9 +1415,15 @@ arith_uint256 komodo_PoWtarget(int32_t *percPoSp,arith_uint256 target,int32_t he int32_t komodo_is_PoSblock(int32_t slowflag,int32_t height,CBlock *pblock,arith_uint256 bnTarget,arith_uint256 bhash) { - CBlockIndex *previndex; char voutaddr[64],destaddr[64]; uint256 txid; uint32_t txtime,prevtime=0; int32_t vout,PoSperc,txn_count,eligible=0,isPoS = 0; uint64_t value; CTxDestination voutaddress; + CBlockIndex *previndex,*pindex; char voutaddr[64],destaddr[64]; uint256 txid; uint32_t txtime,prevtime=0; int32_t vout,PoSperc,txn_count,eligible=0,isPoS = 0; uint64_t value; CTxDestination voutaddress; if ( ASSETCHAINS_STAKED == 100 && height <= 10 ) return(1); + if ( (pindex= mapBlockIndex[pblock->GetHash()]) != 0 && pindex->segid >= -1 ) + { + if ( pindex->segid == -1 ) + return(0); + else return(1); + } txn_count = pblock->vtx.size(); if ( txn_count > 1 && pblock->vtx[txn_count-1].vin.size() == 1 && pblock->vtx[txn_count-1].vout.size() == 1 ) { @@ -1429,12 +1437,28 @@ int32_t komodo_is_PoSblock(int32_t slowflag,int32_t height,CBlock *pblock,arith_ if ( prevtime != 0 ) { if ( komodo_isPoS(pblock) != 0 ) + { eligible = komodo_stake(1,bnTarget,height,txid,vout,pblock->nTime,prevtime+27,(char *)""); + } if ( eligible == 0 || eligible > pblock->nTime ) { if ( ASSETCHAINS_STAKED < 100 ) fprintf(stderr,"komodo_is_PoSblock PoS failure ht.%d eligible.%u vs blocktime.%u, lag.%d -> check to see if it is PoW block\n",height,eligible,(uint32_t)pblock->nTime,(int32_t)(eligible - pblock->nTime)); - } else isPoS = 2; + if ( slowflag != 0 && pindex != 0 ) + pindex->segid = -1; + } + else + { + isPoS = 2; // 2 means staking utxo validated + if ( slowflag != 0 ) + { + if ( pindex != 0 && height > 100 ) + { + if ( pindex->segid == -2 ) + pindex->segid = komodo_segid(height); + } else fprintf(stderr,"unexpected null pindex for slowflag set ht.%d\n",height); + } + } } if ( slowflag == 0 && isPoS == 0 ) // maybe previous block is not seen yet, do the best approx { @@ -1443,12 +1467,20 @@ int32_t komodo_is_PoSblock(int32_t slowflag,int32_t height,CBlock *pblock,arith_ } if ( slowflag != 0 && isPoS != 0 ) { - bnTarget = komodo_PoWtarget(&PoSperc,bnTarget,height,ASSETCHAINS_STAKED); - if ( bhash < bnTarget || isPoS != 2 ) + if ( isPoS != 2 ) { - fprintf(stderr,"ht.%d isPoS but meets PoW diff!\n",height); + fprintf(stderr,"ht.%d isPoS.%d utxo not validated -> must be PoW fake\n",height,isPoS); isPoS = 0; } + else + { + bnTarget = komodo_PoWtarget(&PoSperc,bnTarget,height,ASSETCHAINS_STAKED); + if ( bhash < bnTarget ) + { + fprintf(stderr,"ht.%d isPoS but meets PoW diff!\n",height); + isPoS = 0; + } + } } //else return(-1); } @@ -1484,6 +1516,8 @@ bool KOMODO_TEST_ASSETCHAIN_SKIP_POW = 0; int32_t komodo_checkPOW(int32_t slowflag,CBlock *pblock,int32_t height) { uint256 hash; arith_uint256 bnTarget,bhash; bool fNegative,fOverflow; uint8_t *script,pubkey33[33],pubkeys[64][33]; int32_t i,possible,PoSperc,is_PoSblock=0,n,failed = 0,notaryid = -1; int64_t checktoshis,value; CBlockIndex *pprev; + if ( KOMODO_TEST_ASSETCHAIN_SKIP_POW == 0 && Params().NetworkIDString() == "regtest" ) + KOMODO_TEST_ASSETCHAIN_SKIP_POW = 1; if ( !CheckEquihashSolution(pblock, Params()) ) { fprintf(stderr,"komodo_checkPOW slowflag.%d ht.%d CheckEquihashSolution failed\n",slowflag,height); diff --git a/src/main.cpp b/src/main.cpp index b42f85ce7..6dcd6b13b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3368,6 +3368,10 @@ bool static DisconnectTip(CValidationState &state, bool fBare = false) { assert(view.Flush()); DisconnectNotarisations(block); } + pindexDelete->segid = -2; + pindexDelete->newcoins = 0; + pindexDelete->zfunds = 0; + LogPrint("bench", "- Disconnect block: %.2fms\n", (GetTimeMicros() - nStart) * 0.001); uint256 anchorAfterDisconnect = pcoinsTip->GetBestAnchor(); // Write the chain state to disk, if necessary. From b70126d400c0967d4bd1ab315006ea176d52c13b Mon Sep 17 00:00:00 2001 From: jl777 Date: Wed, 8 Aug 2018 23:48:23 -1100 Subject: [PATCH 08/38] Add no cache flag and calculate entropy based on raw segued --- src/komodo_bitcoind.h | 21 +++++---------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 96c76245f..eee9a5067 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -1135,12 +1135,12 @@ uint32_t komodo_segid32(char *coinaddr) return(addrhash.uints[0]); } -int8_t komodo_segid(int32_t height) +int8_t komodo_segid(int32_t nocache,int32_t height) { CTxDestination voutaddress; CBlock block; CBlockIndex *pindex; uint64_t value; uint32_t txtime; char voutaddr[64],destaddr[64]; int32_t txn_count,vout; uint256 txid; int8_t segid = -1; if ( height > 0 && (pindex= komodo_chainactive(height)) != 0 ) { - if ( pindex->segid >= -1 ) + if ( nocache == 0 && pindex->segid >= -1 ) return(pindex->segid); if ( komodo_blockload(block,pindex) == 0 ) { @@ -1175,7 +1175,7 @@ int32_t komodo_segids(uint8_t *hashbuf,int32_t height,int32_t n) memset(hashbuf,0xff,n); for (i=0; i prevtime+480 ) coinage *= ((blocktime+iter+segid*2) - (prevtime+400)); - //if ( nHeight >= 2500 && blocktime+iter+segid*2 > prevtime+180 ) - // coinage *= ((blocktime+iter+segid*2) - (prevtime+60)); coinage256 = arith_uint256(coinage+1); hashval = ratio * (UintToArith256(hash) / coinage256); - //if ( nHeight >= 900 && nHeight < 916 ) - // hashval = (hashval / coinage256); if ( hashval <= bnTarget ) { winner = 1; @@ -1310,7 +1299,7 @@ arith_uint256 komodo_PoWtarget(int32_t *percPoSp,arith_uint256 target,int32_t he continue; if ( (pindex= komodo_chainactive(ht)) != 0 ) { - if ( komodo_segid(ht) >= 0 ) + if ( komodo_segid(0,ht) >= 0 ) { n++; percPoS++; @@ -1455,7 +1444,7 @@ int32_t komodo_is_PoSblock(int32_t slowflag,int32_t height,CBlock *pblock,arith_ if ( pindex != 0 && height > 100 ) { if ( pindex->segid == -2 ) - pindex->segid = komodo_segid(height); + pindex->segid = komodo_segid(1,height); } else fprintf(stderr,"unexpected null pindex for slowflag set ht.%d\n",height); } } From a3b5f801ca81f19eec04b4f3a58a8c695a28f9ea Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Aug 2018 00:14:35 -1100 Subject: [PATCH 09/38] Update comments --- src/komodo_bitcoind.h | 26 ++------------------------ 1 file changed, 2 insertions(+), 24 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index eee9a5067..3e3257f08 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -1105,7 +1105,6 @@ int32_t komodo_validate_interest(const CTransaction &tx,int32_t txheight,uint32_ commission must be in coinbase.vout[1] and must be >= 10000 sats PoS stake must be without txfee and in the last tx in the block at vout[0] */ -//#define KOMODO_POWMINMULT 16 uint64_t komodo_commission(const CBlock *pblock) { @@ -1299,7 +1298,7 @@ arith_uint256 komodo_PoWtarget(int32_t *percPoSp,arith_uint256 target,int32_t he continue; if ( (pindex= komodo_chainactive(ht)) != 0 ) { - if ( komodo_segid(0,ht) >= 0 ) + if ( komodo_segid(0,ht) >= 0 ) // if using segid cache is unstable consensus, need to directly call komodo_stake() here { n++; percPoS++; @@ -1314,26 +1313,6 @@ arith_uint256 komodo_PoWtarget(int32_t *percPoSp,arith_uint256 target,int32_t he m++; } } - /*if ( (pindex= komodo_chainactive(ht)) != 0 ) - { - bnTarget.SetCompact(pindex->nBits,&fNegative,&fOverflow); - bnTarget = (bnTarget / arith_uint256(KOMODO_POWMINMULT)); - hashval = UintToArith256(pindex->GetBlockHash()); - if ( hashval <= bnTarget ) // PoW is never as easy as PoS/16, some PoS will be counted as PoW - { - if ( ASSETCHAINS_STAKED < 100 ) - fprintf(stderr,"1"); - sum += hashval; - n++; - } - else - { - n++; - percPoS++; - if ( ASSETCHAINS_STAKED < 100 ) - fprintf(stderr,"0"); - } - }*/ if ( ASSETCHAINS_STAKED < 100 && (i % 10) == 9 ) fprintf(stderr," %d, ",percPoS); } @@ -1342,7 +1321,6 @@ arith_uint256 komodo_PoWtarget(int32_t *percPoSp,arith_uint256 target,int32_t he if ( ASSETCHAINS_STAKED < 100 ) fprintf(stderr," -> %d%% percPoS vs goalperc.%d ht.%d\n",percPoS,goalperc,height); *percPoSp = percPoS; - //target = (target / arith_uint256(KOMODO_POWMINMULT)); if ( m > 0 ) { ave = (sum / arith_uint256(m)); @@ -1547,7 +1525,7 @@ int32_t komodo_checkPOW(int32_t slowflag,CBlock *pblock,int32_t height) { if ( KOMODO_TEST_ASSETCHAIN_SKIP_POW ) return(0); - if ( ASSETCHAINS_STAKED == 0 ) // komodo_is_PoSblock will check bnTarget + if ( ASSETCHAINS_STAKED == 0 ) // komodo_is_PoSblock will check bnTarget for staked chains return(-1); } } From c6d212db1c1cc67d800591e45f81de6b29524e65 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Aug 2018 02:31:27 -1100 Subject: [PATCH 10/38] Test --- src/komodo_bitcoind.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 3e3257f08..eba33c301 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -1298,7 +1298,7 @@ arith_uint256 komodo_PoWtarget(int32_t *percPoSp,arith_uint256 target,int32_t he continue; if ( (pindex= komodo_chainactive(ht)) != 0 ) { - if ( komodo_segid(0,ht) >= 0 ) // if using segid cache is unstable consensus, need to directly call komodo_stake() here + if ( komodo_segid(0,ht) >= 0 ) { n++; percPoS++; @@ -1422,7 +1422,10 @@ int32_t komodo_is_PoSblock(int32_t slowflag,int32_t height,CBlock *pblock,arith_ if ( pindex != 0 && height > 100 ) { if ( pindex->segid == -2 ) + { pindex->segid = komodo_segid(1,height); + fprintf(stderr,"set segid.%d <- %d\n",pindex->segid); + } } else fprintf(stderr,"unexpected null pindex for slowflag set ht.%d\n",height); } } From 5d3f12159d351366fa2a991653534405d2b27260 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Aug 2018 02:32:34 -1100 Subject: [PATCH 11/38] Test --- src/komodo_bitcoind.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index eba33c301..de1b3352e 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -1424,7 +1424,7 @@ int32_t komodo_is_PoSblock(int32_t slowflag,int32_t height,CBlock *pblock,arith_ if ( pindex->segid == -2 ) { pindex->segid = komodo_segid(1,height); - fprintf(stderr,"set segid.%d <- %d\n",pindex->segid); + fprintf(stderr,"set segid.%d <- %d\n",height,pindex->segid); } } else fprintf(stderr,"unexpected null pindex for slowflag set ht.%d\n",height); } From 549ca5a62592b85797d952ca77375838f58fb4d3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Aug 2018 02:38:16 -1100 Subject: [PATCH 12/38] Test --- src/komodo_bitcoind.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index de1b3352e..4b7f15190 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -1155,6 +1155,7 @@ int8_t komodo_segid(int32_t nocache,int32_t height) if ( strcmp(destaddr,voutaddr) == 0 && block.vtx[txn_count-1].vout[0].nValue == value ) { segid = komodo_segid32(voutaddr) & 0x3f; + fprintf(stderr,"komodo_segid.(%s) -> %02x\n",segid); } } else fprintf(stderr,"komodo_segid ht.%d couldnt extract voutaddress\n",height); } @@ -1412,7 +1413,10 @@ int32_t komodo_is_PoSblock(int32_t slowflag,int32_t height,CBlock *pblock,arith_ if ( ASSETCHAINS_STAKED < 100 ) fprintf(stderr,"komodo_is_PoSblock PoS failure ht.%d eligible.%u vs blocktime.%u, lag.%d -> check to see if it is PoW block\n",height,eligible,(uint32_t)pblock->nTime,(int32_t)(eligible - pblock->nTime)); if ( slowflag != 0 && pindex != 0 ) + { pindex->segid = -1; + fprintf(stderr,"A set segid.%d <- %d\n",height,pindex->segid); + } } else { @@ -1424,7 +1428,7 @@ int32_t komodo_is_PoSblock(int32_t slowflag,int32_t height,CBlock *pblock,arith_ if ( pindex->segid == -2 ) { pindex->segid = komodo_segid(1,height); - fprintf(stderr,"set segid.%d <- %d\n",height,pindex->segid); + fprintf(stderr,"B set segid.%d <- %d\n",height,pindex->segid); } } else fprintf(stderr,"unexpected null pindex for slowflag set ht.%d\n",height); } From a03223780511abfb48c0b83487bd404ee54c8a41 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Aug 2018 02:43:42 -1100 Subject: [PATCH 13/38] Test --- src/komodo_bitcoind.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 4b7f15190..ceddcee50 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -1155,7 +1155,7 @@ int8_t komodo_segid(int32_t nocache,int32_t height) if ( strcmp(destaddr,voutaddr) == 0 && block.vtx[txn_count-1].vout[0].nValue == value ) { segid = komodo_segid32(voutaddr) & 0x3f; - fprintf(stderr,"komodo_segid.(%s) -> %02x\n",segid); + fprintf(stderr,"komodo_segid.(%d) -> %02x\n",height,segid); } } else fprintf(stderr,"komodo_segid ht.%d couldnt extract voutaddress\n",height); } From e77d279f0c60bd80fb9905fe26be11906af95901 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Aug 2018 02:49:15 -1100 Subject: [PATCH 14/38] Test --- src/komodo_bitcoind.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index ceddcee50..767b3f4ce 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -1155,7 +1155,7 @@ int8_t komodo_segid(int32_t nocache,int32_t height) if ( strcmp(destaddr,voutaddr) == 0 && block.vtx[txn_count-1].vout[0].nValue == value ) { segid = komodo_segid32(voutaddr) & 0x3f; - fprintf(stderr,"komodo_segid.(%d) -> %02x\n",height,segid); + //fprintf(stderr,"komodo_segid.(%d) -> %02x\n",height,segid); } } else fprintf(stderr,"komodo_segid ht.%d couldnt extract voutaddress\n",height); } @@ -1383,7 +1383,7 @@ arith_uint256 komodo_PoWtarget(int32_t *percPoSp,arith_uint256 target,int32_t he int32_t komodo_is_PoSblock(int32_t slowflag,int32_t height,CBlock *pblock,arith_uint256 bnTarget,arith_uint256 bhash) { - CBlockIndex *previndex,*pindex; char voutaddr[64],destaddr[64]; uint256 txid; uint32_t txtime,prevtime=0; int32_t vout,PoSperc,txn_count,eligible=0,isPoS = 0; uint64_t value; CTxDestination voutaddress; + CBlockIndex *previndex,*pindex; char voutaddr[64],destaddr[64]; uint256 txid; uint32_t txtime,prevtime=0; int32_t vout,PoSperc,txn_count,eligible=0,isPoS = 0,segid; uint64_t value; CTxDestination voutaddress; if ( ASSETCHAINS_STAKED == 100 && height <= 10 ) return(1); if ( (pindex= mapBlockIndex[pblock->GetHash()]) != 0 && pindex->segid >= -1 ) @@ -1425,9 +1425,9 @@ int32_t komodo_is_PoSblock(int32_t slowflag,int32_t height,CBlock *pblock,arith_ { if ( pindex != 0 && height > 100 ) { - if ( pindex->segid == -2 ) + if ( pindex->segid == -2 && (segid= komodo_segid(1,height)) >= 0 ) { - pindex->segid = komodo_segid(1,height); + pindex->segid = segid; fprintf(stderr,"B set segid.%d <- %d\n",height,pindex->segid); } } else fprintf(stderr,"unexpected null pindex for slowflag set ht.%d\n",height); From 8f97da8ea443c95723bbc6e03a550f63f577334c Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Aug 2018 02:52:14 -1100 Subject: [PATCH 15/38] Test --- src/komodo_bitcoind.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 767b3f4ce..501d14da5 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -1439,7 +1439,7 @@ int32_t komodo_is_PoSblock(int32_t slowflag,int32_t height,CBlock *pblock,arith_ if ( komodo_isPoS(pblock) != 0 ) isPoS = 1; } - if ( slowflag != 0 && isPoS != 0 ) + if ( slowflag != 0 && isPoS != 0 && height > 12500 ) { if ( isPoS != 2 ) { From 435ef4fde25e36e044d1555959e8f741ca03c70b Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Aug 2018 02:59:45 -1100 Subject: [PATCH 16/38] Test --- src/komodo_bitcoind.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 501d14da5..02d24fbd7 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -1386,12 +1386,13 @@ int32_t komodo_is_PoSblock(int32_t slowflag,int32_t height,CBlock *pblock,arith_ CBlockIndex *previndex,*pindex; char voutaddr[64],destaddr[64]; uint256 txid; uint32_t txtime,prevtime=0; int32_t vout,PoSperc,txn_count,eligible=0,isPoS = 0,segid; uint64_t value; CTxDestination voutaddress; if ( ASSETCHAINS_STAKED == 100 && height <= 10 ) return(1); - if ( (pindex= mapBlockIndex[pblock->GetHash()]) != 0 && pindex->segid >= -1 ) + pindex = mapBlockIndex[pblock->GetHash()]; + /*if ( pindex != 0 && pindex->segid >= -1 ) { if ( pindex->segid == -1 ) return(0); else return(1); - } + }*/ txn_count = pblock->vtx.size(); if ( txn_count > 1 && pblock->vtx[txn_count-1].vin.size() == 1 && pblock->vtx[txn_count-1].vout.size() == 1 ) { From 15bec8194bec86cb7378e4d589a2fa531790e017 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Aug 2018 03:07:53 -1100 Subject: [PATCH 17/38] Test --- src/komodo_bitcoind.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 02d24fbd7..561174be7 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -1387,12 +1387,12 @@ int32_t komodo_is_PoSblock(int32_t slowflag,int32_t height,CBlock *pblock,arith_ if ( ASSETCHAINS_STAKED == 100 && height <= 10 ) return(1); pindex = mapBlockIndex[pblock->GetHash()]; - /*if ( pindex != 0 && pindex->segid >= -1 ) + if ( pindex != 0 && pindex->segid >= -1 ) { if ( pindex->segid == -1 ) return(0); else return(1); - }*/ + } txn_count = pblock->vtx.size(); if ( txn_count > 1 && pblock->vtx[txn_count-1].vin.size() == 1 && pblock->vtx[txn_count-1].vout.size() == 1 ) { @@ -1531,7 +1531,7 @@ int32_t komodo_checkPOW(int32_t slowflag,CBlock *pblock,int32_t height) } else if ( possible == 0 || ASSETCHAINS_SYMBOL[0] != 0 ) { - if ( KOMODO_TEST_ASSETCHAIN_SKIP_POW ) + if ( KOMODO_TEST_ASSETCHAIN_SKIP_POW || (strcmp(ASSETCHAINS_SYMBOL,"MGNX") == 0 && height < 12500) ) return(0); if ( ASSETCHAINS_STAKED == 0 ) // komodo_is_PoSblock will check bnTarget for staked chains return(-1); From ad0f453e27545685af52fcd262620c2f11603fb3 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Aug 2018 03:10:53 -1100 Subject: [PATCH 18/38] Test --- src/komodo_bitcoind.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 561174be7..9b9bc7c4d 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -1531,7 +1531,7 @@ int32_t komodo_checkPOW(int32_t slowflag,CBlock *pblock,int32_t height) } else if ( possible == 0 || ASSETCHAINS_SYMBOL[0] != 0 ) { - if ( KOMODO_TEST_ASSETCHAIN_SKIP_POW || (strcmp(ASSETCHAINS_SYMBOL,"MGNX") == 0 && height < 12500) ) + if ( KOMODO_TEST_ASSETCHAIN_SKIP_POW ) return(0); if ( ASSETCHAINS_STAKED == 0 ) // komodo_is_PoSblock will check bnTarget for staked chains return(-1); @@ -1545,7 +1545,7 @@ int32_t komodo_checkPOW(int32_t slowflag,CBlock *pblock,int32_t height) return(-1); else { - if ( slowflag == 0 ) // need all past 100 blocks to calculate PoW target + if ( slowflag == 0 || (strcmp(ASSETCHAINS_SYMBOL,"MGNX") == 0 && height < 12500) ) // need all past 100 blocks to calculate PoW target return(0); if ( slowflag != 0 ) bnTarget = komodo_PoWtarget(&PoSperc,bnTarget,height,ASSETCHAINS_STAKED); From 703faba6690b390eaebb1dcd9378b8cece67ea21 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Aug 2018 03:16:38 -1100 Subject: [PATCH 19/38] Remove MGNX exemption --- src/komodo_bitcoind.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 9b9bc7c4d..483f29d71 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -1411,12 +1411,12 @@ int32_t komodo_is_PoSblock(int32_t slowflag,int32_t height,CBlock *pblock,arith_ } if ( eligible == 0 || eligible > pblock->nTime ) { - if ( ASSETCHAINS_STAKED < 100 ) + if ( 0 && ASSETCHAINS_STAKED < 100 ) fprintf(stderr,"komodo_is_PoSblock PoS failure ht.%d eligible.%u vs blocktime.%u, lag.%d -> check to see if it is PoW block\n",height,eligible,(uint32_t)pblock->nTime,(int32_t)(eligible - pblock->nTime)); if ( slowflag != 0 && pindex != 0 ) { pindex->segid = -1; - fprintf(stderr,"A set segid.%d <- %d\n",height,pindex->segid); + fprintf(stderr,"PoW block detected set segid.%d <- %d\n",height,pindex->segid); } } else @@ -1440,7 +1440,7 @@ int32_t komodo_is_PoSblock(int32_t slowflag,int32_t height,CBlock *pblock,arith_ if ( komodo_isPoS(pblock) != 0 ) isPoS = 1; } - if ( slowflag != 0 && isPoS != 0 && height > 12500 ) + if ( slowflag != 0 && isPoS != 0 ) { if ( isPoS != 2 ) { @@ -1545,7 +1545,7 @@ int32_t komodo_checkPOW(int32_t slowflag,CBlock *pblock,int32_t height) return(-1); else { - if ( slowflag == 0 || (strcmp(ASSETCHAINS_SYMBOL,"MGNX") == 0 && height < 12500) ) // need all past 100 blocks to calculate PoW target + if ( slowflag == 0 )//|| (strcmp(ASSETCHAINS_SYMBOL,"MGNX") == 0 && height < 13000) ) // need all past 100 blocks to calculate PoW target return(0); if ( slowflag != 0 ) bnTarget = komodo_PoWtarget(&PoSperc,bnTarget,height,ASSETCHAINS_STAKED); From 6a8820f597a13839bc588ea19da395d03a6fa1c5 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Aug 2018 03:19:18 -1100 Subject: [PATCH 20/38] Test --- src/komodo_bitcoind.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 483f29d71..5e3913b23 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -1424,9 +1424,9 @@ int32_t komodo_is_PoSblock(int32_t slowflag,int32_t height,CBlock *pblock,arith_ isPoS = 2; // 2 means staking utxo validated if ( slowflag != 0 ) { - if ( pindex != 0 && height > 100 ) + if ( height > 100 ) { - if ( pindex->segid == -2 && (segid= komodo_segid(1,height)) >= 0 ) + if ( pindex != 0 && pindex->segid == -2 && (segid= komodo_segid(1,height)) >= 0 ) { pindex->segid = segid; fprintf(stderr,"B set segid.%d <- %d\n",height,pindex->segid); From eea0a57b3c366b922feebc2811f45bbcd34aabbf Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Aug 2018 03:20:05 -1100 Subject: [PATCH 21/38] Test --- src/komodo_bitcoind.h | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 5e3913b23..3285f2616 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -1422,15 +1422,12 @@ int32_t komodo_is_PoSblock(int32_t slowflag,int32_t height,CBlock *pblock,arith_ else { isPoS = 2; // 2 means staking utxo validated - if ( slowflag != 0 ) + if ( slowflag != 0 && height > 100 ) { - if ( height > 100 ) + if ( pindex != 0 && pindex->segid == -2 && (segid= komodo_segid(1,height)) >= 0 ) { - if ( pindex != 0 && pindex->segid == -2 && (segid= komodo_segid(1,height)) >= 0 ) - { - pindex->segid = segid; - fprintf(stderr,"B set segid.%d <- %d\n",height,pindex->segid); - } + pindex->segid = segid; + fprintf(stderr,"B set segid.%d <- %d\n",height,pindex->segid); } else fprintf(stderr,"unexpected null pindex for slowflag set ht.%d\n",height); } } From e4ec9bab3edeee439298da02dd5606208723760e Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Aug 2018 03:23:21 -1100 Subject: [PATCH 22/38] 13000 MGNX height exemption --- src/komodo_bitcoind.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 3285f2616..19c9b15bd 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -1542,7 +1542,7 @@ int32_t komodo_checkPOW(int32_t slowflag,CBlock *pblock,int32_t height) return(-1); else { - if ( slowflag == 0 )//|| (strcmp(ASSETCHAINS_SYMBOL,"MGNX") == 0 && height < 13000) ) // need all past 100 blocks to calculate PoW target + if ( slowflag == 0 || (strcmp(ASSETCHAINS_SYMBOL,"MGNX") == 0 && height < 13000) ) // need all past 100 blocks to calculate PoW target return(0); if ( slowflag != 0 ) bnTarget = komodo_PoWtarget(&PoSperc,bnTarget,height,ASSETCHAINS_STAKED); From efceba00d9acef94a022e591dc922b4dd4272300 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Aug 2018 03:26:04 -1100 Subject: [PATCH 23/38] Test --- src/komodo_bitcoind.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 19c9b15bd..463901570 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -1534,6 +1534,8 @@ int32_t komodo_checkPOW(int32_t slowflag,CBlock *pblock,int32_t height) return(-1); } } + if ( strcmp(ASSETCHAINS_SYMBOL,"MGNX") == 0 && height < 13000 ) + return(0); if ( ASSETCHAINS_STAKED != 0 && height >= 2 ) // must PoS or have at least 16x better PoW { if ( (is_PoSblock= komodo_is_PoSblock(slowflag,height,pblock,bnTarget,bhash)) == 0 ) @@ -1542,7 +1544,7 @@ int32_t komodo_checkPOW(int32_t slowflag,CBlock *pblock,int32_t height) return(-1); else { - if ( slowflag == 0 || (strcmp(ASSETCHAINS_SYMBOL,"MGNX") == 0 && height < 13000) ) // need all past 100 blocks to calculate PoW target + if ( slowflag == 0 ) // need all past 100 blocks to calculate PoW target return(0); if ( slowflag != 0 ) bnTarget = komodo_PoWtarget(&PoSperc,bnTarget,height,ASSETCHAINS_STAKED); From 81915d9fce766617846073d2337e20720cdca84a Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Aug 2018 06:47:24 -1100 Subject: [PATCH 24/38] Fix rewards unlock help trigger --- src/wallet/rpcwallet.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index c2e486a05..d522ba536 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -5044,7 +5044,7 @@ UniValue rewardsaddfunding(const UniValue& params, bool fHelp) UniValue rewardsunlock(const UniValue& params, bool fHelp) { UniValue result(UniValue::VOBJ); std::string hex; char *name; uint256 fundingtxid,txid; - if ( fHelp || params.size() > 3 ) + if ( fHelp || params.size() > 3 || params.size() < 2 ) throw runtime_error("rewardsunlock name fundingtxid [txid]\n"); if ( ensure_CCrequirements() < 0 ) throw runtime_error("to use CC contracts, you need to launch daemon with valid -pubkey= for an address in your wallet\n"); From eccd52f4cc0798c1990ff41fca9c58e424d58f50 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Aug 2018 18:59:18 -1100 Subject: [PATCH 25/38] Check for duplicate utxo in available coins --- src/cc/CCtx.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/cc/CCtx.cpp b/src/cc/CCtx.cpp index 666132590..072f86877 100644 --- a/src/cc/CCtx.cpp +++ b/src/cc/CCtx.cpp @@ -272,6 +272,11 @@ uint64_t AddNormalinputs(CMutableTransaction &mtx,CPubKey mypk,uint64_t total,in break; if ( i != mtx.vin.size() ) continue; + for (i=0; i Date: Thu, 9 Aug 2018 19:06:05 -1100 Subject: [PATCH 26/38] segid print --- src/komodo_bitcoind.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 463901570..53dd21802 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -1424,11 +1424,12 @@ int32_t komodo_is_PoSblock(int32_t slowflag,int32_t height,CBlock *pblock,arith_ isPoS = 2; // 2 means staking utxo validated if ( slowflag != 0 && height > 100 ) { + segid = -3; if ( pindex != 0 && pindex->segid == -2 && (segid= komodo_segid(1,height)) >= 0 ) { pindex->segid = segid; fprintf(stderr,"B set segid.%d <- %d\n",height,pindex->segid); - } else fprintf(stderr,"unexpected null pindex for slowflag set ht.%d\n",height); + } else fprintf(stderr,"unexpected null pindex for slowflag set ht.%d segid.%d:%d\n",height,pindex!=0?pindex->segid:-3,segid); } } } From 9e432c97adf3c7b411ca5d6739a2573dfe98ea6e Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Aug 2018 19:08:20 -1100 Subject: [PATCH 27/38] -print --- src/komodo_bitcoind.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index 53dd21802..ac76958c4 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -1429,7 +1429,7 @@ int32_t komodo_is_PoSblock(int32_t slowflag,int32_t height,CBlock *pblock,arith_ { pindex->segid = segid; fprintf(stderr,"B set segid.%d <- %d\n",height,pindex->segid); - } else fprintf(stderr,"unexpected null pindex for slowflag set ht.%d segid.%d:%d\n",height,pindex!=0?pindex->segid:-3,segid); + } //else fprintf(stderr,"unexpected null pindex for slowflag set ht.%d segid.%d:%d\n",height,pindex!=0?pindex->segid:-3,segid); } } } From 278a61fd5e61309d1f8a0c1d5c73877295aa5a89 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Aug 2018 19:23:40 -1100 Subject: [PATCH 28/38] uint64_t -> int64_t for coin values other than three --- src/cc/CCfaucet.h | 2 +- src/cc/CCinclude.h | 6 +++--- src/cc/dice.cpp | 4 ++-- src/cc/faucet.cpp | 14 +++++++------- src/cc/rewards.cpp | 14 +++++++------- 5 files changed, 20 insertions(+), 20 deletions(-) diff --git a/src/cc/CCfaucet.h b/src/cc/CCfaucet.h index b875bd133..f9b933255 100644 --- a/src/cc/CCfaucet.h +++ b/src/cc/CCfaucet.h @@ -24,7 +24,7 @@ bool FaucetValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx); // CCcustom -std::string FaucetFund(uint64_t txfee,uint64_t funds); +std::string FaucetFund(uint64_t txfee,int64_t funds); std::string FaucetGet(uint64_t txfee); UniValue FaucetInfo(); diff --git a/src/cc/CCinclude.h b/src/cc/CCinclude.h index a59a2325c..6a1a25b35 100644 --- a/src/cc/CCinclude.h +++ b/src/cc/CCinclude.h @@ -81,7 +81,7 @@ char *pubkey33_str(char *dest,uint8_t *pubkey33); uint256 Parseuint256(char *hexstr); CPubKey pubkey2pk(std::vector pubkey); bool GetCCaddress(struct CCcontract_info *cp,char *destaddr,CPubKey pk); -bool ConstrainVout(CTxOut vout,int32_t CCflag,char *cmpaddr,uint64_t nValue); +bool ConstrainVout(CTxOut vout,int32_t CCflag,char *cmpaddr,int64_t nValue); bool PreventCC(Eval* eval,const CTransaction &tx,int32_t preventCCvins,int32_t numvins,int32_t preventCCvouts,int32_t numvouts); bool Getscriptaddress(char *destaddr,const CScript &scriptPubKey); std::vector Mypubkey(); @@ -92,8 +92,8 @@ int64_t CCduration(int32_t &numblocks,uint256 txid); std::string FinalizeCCTx(uint64_t skipmask,struct CCcontract_info *cp,CMutableTransaction &mtx,CPubKey mypk,uint64_t txfee,CScript opret); void SetCCunspents(std::vector > &unspentOutputs,char *coinaddr); void SetCCtxids(std::vector > &addressIndex,char *coinaddr); -uint64_t AddNormalinputs(CMutableTransaction &mtx,CPubKey mypk,uint64_t total,int32_t maxinputs); -uint64_t CCutxovalue(char *coinaddr,uint256 utxotxid,int32_t utxovout); +int64_t AddNormalinputs(CMutableTransaction &mtx,CPubKey mypk,int64_t total,int32_t maxinputs); +int64_t CCutxovalue(char *coinaddr,uint256 utxotxid,int32_t utxovout); // curve25519 and sha256 bits256 curve25519_shared(bits256 privkey,bits256 otherpub); diff --git a/src/cc/dice.cpp b/src/cc/dice.cpp index 8d8600fb6..e35f367f3 100644 --- a/src/cc/dice.cpp +++ b/src/cc/dice.cpp @@ -604,9 +604,9 @@ uint64_t AddDiceInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPubK return(totalinputs); } -uint64_t DicePlanFunds(uint64_t &entropyval,uint256 &entropytxid,uint64_t refsbits,struct CCcontract_info *cp,CPubKey dicepk,uint256 reffundingtxid) +int64_t DicePlanFunds(uint64_t &entropyval,uint256 &entropytxid,uint64_t refsbits,struct CCcontract_info *cp,CPubKey dicepk,uint256 reffundingtxid) { - char coinaddr[64],str[65]; uint64_t sbits,nValue,totalinputs = 0; uint256 hash,txid,proof,hashBlock,fundingtxid; CScript fundingPubKey; CTransaction tx,vinTx; int32_t vout,first=0,n=0; uint8_t funcid; + char coinaddr[64],str[65]; uint64_t sbits; int64_t nValue,totalinputs = 0; uint256 hash,txid,proof,hashBlock,fundingtxid; CScript fundingPubKey; CTransaction tx,vinTx; int32_t vout,first=0,n=0; uint8_t funcid; std::vector > unspentOutputs; if ( GetTransaction(reffundingtxid,tx,hashBlock,false) != 0 && tx.vout.size() > 1 && ConstrainVout(tx.vout[0],1,cp->unspendableCCaddr,0) != 0 ) { diff --git a/src/cc/faucet.cpp b/src/cc/faucet.cpp index b8b3b62cb..403b56c3e 100644 --- a/src/cc/faucet.cpp +++ b/src/cc/faucet.cpp @@ -28,7 +28,7 @@ // start of consensus code -uint64_t IsFaucetvout(struct CCcontract_info *cp,const CTransaction& tx,int32_t v) +int64_t IsFaucetvout(struct CCcontract_info *cp,const CTransaction& tx,int32_t v) { char destaddr[64]; if ( tx.vout[v].scriptPubKey.IsPayToCryptoCondition() != 0 ) @@ -42,7 +42,7 @@ uint64_t IsFaucetvout(struct CCcontract_info *cp,const CTransaction& tx,int32_t bool FaucetExactAmounts(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx,int32_t minage,uint64_t txfee) { static uint256 zerohash; - CTransaction vinTx; uint256 hashBlock,activehash; int32_t i,numvins,numvouts; uint64_t inputs=0,outputs=0,assetoshis; + CTransaction vinTx; uint256 hashBlock,activehash; int32_t i,numvins,numvouts; int64_t inputs=0,outputs=0,assetoshis; numvins = tx.vin.size(); numvouts = tx.vout.size(); for (i=0; i origpubkey; CTransaction vintx; int32_t vout,n = 0; + char coinaddr[64]; int64_t nValue,price,totalinputs = 0; uint256 txid,hashBlock; std::vector origpubkey; CTransaction vintx; int32_t vout,n = 0; std::vector > unspentOutputs; GetCCaddress(cp,coinaddr,pk); SetCCunspents(unspentOutputs,coinaddr); @@ -154,7 +154,7 @@ uint64_t AddFaucetInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPu std::string FaucetGet(uint64_t txfee) { - CMutableTransaction mtx; CPubKey mypk,faucetpk; CScript opret; uint64_t inputs,CCchange=0,nValue=COIN; struct CCcontract_info *cp,C; + CMutableTransaction mtx; CPubKey mypk,faucetpk; CScript opret; int64_t inputs,CCchange=0,nValue=COIN; struct CCcontract_info *cp,C; cp = CCinit(&C,EVAL_FAUCET); if ( txfee == 0 ) txfee = 10000; @@ -172,7 +172,7 @@ std::string FaucetGet(uint64_t txfee) return(0); } -std::string FaucetFund(uint64_t txfee,uint64_t funds) +std::string FaucetFund(uint64_t txfee,int64_t funds) { CMutableTransaction mtx; CPubKey mypk,faucetpk; CScript opret; struct CCcontract_info *cp,C; cp = CCinit(&C,EVAL_FAUCET); @@ -191,7 +191,7 @@ std::string FaucetFund(uint64_t txfee,uint64_t funds) UniValue FaucetInfo() { UniValue result(UniValue::VOBJ); char numstr[64]; - CMutableTransaction mtx; CPubKey faucetpk; struct CCcontract_info *cp,C; uint64_t funding; + CMutableTransaction mtx; CPubKey faucetpk; struct CCcontract_info *cp,C; int64_t funding; result.push_back(Pair("result","success")); result.push_back(Pair("name","Faucet")); cp = CCinit(&C,EVAL_FAUCET); diff --git a/src/cc/rewards.cpp b/src/cc/rewards.cpp index 6c5975e51..442f0e460 100644 --- a/src/cc/rewards.cpp +++ b/src/cc/rewards.cpp @@ -66,7 +66,7 @@ */ -uint64_t RewardsCalc(uint64_t amount,uint256 txid,uint64_t APR,uint64_t minseconds,uint64_t maxseconds,uint64_t mindeposit) +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); @@ -137,7 +137,7 @@ uint8_t DecodeRewardsOpRet(uint256 txid,const CScript &scriptPubKey,uint64_t &sb return(0); } -uint64_t IsRewardsvout(struct CCcontract_info *cp,const CTransaction& tx,int32_t v,uint64_t refsbits,uint256 reffundingtxid) +int64_t IsRewardsvout(struct CCcontract_info *cp,const CTransaction& tx,int32_t v,uint64_t refsbits,uint256 reffundingtxid) { char destaddr[64]; uint64_t sbits; uint256 fundingtxid,txid; uint8_t funcid; int32_t numvouts; if ( tx.vout[v].scriptPubKey.IsPayToCryptoCondition() != 0 && (numvouts= (int32_t)tx.vout.size()) > 0 ) @@ -156,7 +156,7 @@ uint64_t IsRewardsvout(struct CCcontract_info *cp,const CTransaction& tx,int32_t bool RewardsExactAmounts(struct CCcontract_info *cp,Eval *eval,const CTransaction &tx,uint64_t txfee,uint64_t refsbits,uint256 reffundingtxid) { static uint256 zerohash; - CTransaction vinTx; uint256 hashBlock; int32_t i,numvins,numvouts; uint64_t inputs=0,outputs=0,assetoshis; + CTransaction vinTx; uint256 hashBlock; int32_t i,numvins,numvouts; int64_t inputs=0,outputs=0,assetoshis; numvins = tx.vin.size(); numvouts = tx.vout.size(); for (i=0; i > unspentOutputs; @@ -314,9 +314,9 @@ uint64_t AddRewardsInputs(CScript &scriptPubKey,int32_t fundsflag,struct CCcontr return(totalinputs); } -uint64_t RewardsPlanFunds(uint64_t refsbits,struct CCcontract_info *cp,CPubKey pk,uint256 reffundingtxid) +int64_t RewardsPlanFunds(uint64_t refsbits,struct CCcontract_info *cp,CPubKey pk,uint256 reffundingtxid) { - char coinaddr[64]; uint64_t sbits,nValue,totalinputs = 0; uint256 txid,hashBlock,fundingtxid; CTransaction tx; int32_t vout; uint8_t funcid; + 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; GetCCaddress(cp,coinaddr,pk); SetCCunspents(unspentOutputs,coinaddr); @@ -513,7 +513,7 @@ std::string RewardsLock(uint64_t txfee,char *planstr,uint256 fundingtxid,int64_t std::string RewardsUnlock(uint64_t txfee,char *planstr,uint256 fundingtxid,uint256 locktxid) { - CMutableTransaction mtx; CTransaction tx; char coinaddr[64]; CPubKey mypk,rewardspk; CScript opret,scriptPubKey,ignore; uint256 hashBlock; uint64_t funding,sbits,reward=0,amount=0,inputs,CCchange=0,APR,minseconds,maxseconds,mindeposit; struct CCcontract_info *cp,C; + CMutableTransaction mtx; CTransaction tx; char coinaddr[64]; CPubKey mypk,rewardspk; CScript opret,scriptPubKey,ignore; uint256 hashBlock; uint64_t sbits,APR,minseconds,maxseconds,mindeposit; int64_t funding,reward=0,amount=0,inputs,CCchange=0; struct CCcontract_info *cp,C; cp = CCinit(&C,EVAL_REWARDS); if ( txfee == 0 ) txfee = 10000; From c4a4cd05ecb25144d21c0e72ca9ff1b2b836f38f Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Aug 2018 19:25:25 -1100 Subject: [PATCH 29/38] Fix --- src/cc/CCtx.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/cc/CCtx.cpp b/src/cc/CCtx.cpp index 072f86877..4bc081e15 100644 --- a/src/cc/CCtx.cpp +++ b/src/cc/CCtx.cpp @@ -23,7 +23,7 @@ By using -addressindex=1, it allows tracking of all the CC addresses */ -bool SignTx(CMutableTransaction &mtx,int32_t vini,uint64_t utxovalue,const CScript scriptPubKey) +bool SignTx(CMutableTransaction &mtx,int32_t vini,int64_t utxovalue,const CScript scriptPubKey) { #ifdef ENABLE_WALLET CTransaction txNewConst(mtx); SignatureData sigdata; const CKeyStore& keystore = *pwalletMain; @@ -41,7 +41,7 @@ bool SignTx(CMutableTransaction &mtx,int32_t vini,uint64_t utxovalue,const CScri std::string FinalizeCCTx(uint64_t CCmask,struct CCcontract_info *cp,CMutableTransaction &mtx,CPubKey mypk,uint64_t txfee,CScript opret) { auto consensusBranchId = CurrentEpochBranchId(chainActive.Height() + 1, Params().GetConsensus()); - CTransaction vintx; std::string hex; uint256 hashBlock; uint64_t mask=0,nmask=0,vinimask=0,utxovalues[64],change,normalinputs=0,totaloutputs=0,normaloutputs=0,totalinputs=0; int32_t i,utxovout,n,err = 0; char myaddr[64],destaddr[64],unspendable[64]; uint8_t *privkey,myprivkey[32],unspendablepriv[32],*msg32 = 0; CC *mycond=0,*othercond=0,*cond; CPubKey unspendablepk; + CTransaction vintx; std::string hex; uint256 hashBlock; uint64_t mask=0,nmask=0,vinimask=0; int64_t utxovalues[64],change,normalinputs=0,totaloutputs=0,normaloutputs=0,totalinputs=0; int32_t i,utxovout,n,err = 0; char myaddr[64],destaddr[64],unspendable[64]; uint8_t *privkey,myprivkey[32],unspendablepriv[32],*msg32 = 0; CC *mycond=0,*othercond=0,*cond; CPubKey unspendablepk; n = mtx.vout.size(); for (i=0; i > &addressIndex } } -uint64_t CCutxovalue(char *coinaddr,uint256 utxotxid,int32_t utxovout) +int64_t CCutxovalue(char *coinaddr,uint256 utxotxid,int32_t utxovout) { uint256 txid; std::vector > unspentOutputs; SetCCunspents(unspentOutputs,coinaddr); @@ -201,7 +201,7 @@ uint64_t CCutxovalue(char *coinaddr,uint256 utxotxid,int32_t utxovout) return(0); } -int32_t CC_vinselect(int32_t *aboveip,int64_t *abovep,int32_t *belowip,int64_t *belowp,struct CC_utxo utxos[],int32_t numunspents,uint64_t value) +int32_t CC_vinselect(int32_t *aboveip,int64_t *abovep,int32_t *belowip,int64_t *belowp,struct CC_utxo utxos[],int32_t numunspents,int64_t value) { int32_t i,abovei,belowi; int64_t above,below,gap,atx_value; abovei = belowi = -1; @@ -252,9 +252,9 @@ int32_t CC_vinselect(int32_t *aboveip,int64_t *abovep,int32_t *belowip,int64_t * //return(abovei >= 0 && above < (below>>1) ? abovei : belowi); } -uint64_t AddNormalinputs(CMutableTransaction &mtx,CPubKey mypk,uint64_t total,int32_t maxinputs) +int64_t AddNormalinputs(CMutableTransaction &mtx,CPubKey mypk,int64_t total,int32_t maxinputs) { - int32_t abovei,belowi,ind,vout,i,n = 0,maxutxos=1024; int64_t above,below; uint64_t remains,nValue,totalinputs = 0; uint256 txid,hashBlock; std::vector vecOutputs; CTransaction tx; struct CC_utxo *utxos,*up; + int32_t abovei,belowi,ind,vout,i,n = 0,maxutxos=1024; int64_t above,below; int64_t remains,nValue,totalinputs = 0; uint256 txid,hashBlock; std::vector vecOutputs; CTransaction tx; struct CC_utxo *utxos,*up; #ifdef ENABLE_WALLET const CKeyStore& keystore = *pwalletMain; assert(pwalletMain != NULL); From 59da6d30dd7bf503a4e14c7fac94bf117e852a81 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Aug 2018 19:31:25 -1100 Subject: [PATCH 30/38] REWARDSCC_MAXAPR and use int64_t for all coin values --- src/cc/CCauction.h | 4 ++-- src/cc/CClotto.h | 2 +- src/cc/CCrewards.h | 1 + src/cc/CCutils.cpp | 4 ++-- src/cc/auction.cpp | 18 +++++++++--------- src/cc/fsm.cpp | 12 ++++++------ src/cc/lotto.cpp | 14 +++++++------- src/cc/rewards.cpp | 7 +++++++ 8 files changed, 35 insertions(+), 27 deletions(-) diff --git a/src/cc/CCauction.h b/src/cc/CCauction.h index 52cd03d14..855cdf72e 100644 --- a/src/cc/CCauction.h +++ b/src/cc/CCauction.h @@ -23,8 +23,8 @@ bool AuctionValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx); -std::string AuctionPost(uint64_t txfee,uint256 itemhash,uint64_t minbid,char *title,char *description); -std::string AuctionBid(uint64_t txfee,uint256 itemhash,uint64_t amount); +std::string AuctionPost(uint64_t txfee,uint256 itemhash,int64_t minbid,char *title,char *description); +std::string AuctionBid(uint64_t txfee,uint256 itemhash,int64_t amount); std::string AuctionDeliver(uint64_t txfee,uint256 itemhash,uint256 bidtxid); #endif diff --git a/src/cc/CClotto.h b/src/cc/CClotto.h index a0354252e..41e3cb5b1 100644 --- a/src/cc/CClotto.h +++ b/src/cc/CClotto.h @@ -23,7 +23,7 @@ bool LottoValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx); -std::string LottoTicket(uint64_t txfee,uint64_t numtickets); +std::string LottoTicket(uint64_t txfee,int64_t numtickets); std::string LottoWinner(uint64_t txfee); #endif diff --git a/src/cc/CCrewards.h b/src/cc/CCrewards.h index e7db9d4a9..26819e9b9 100644 --- a/src/cc/CCrewards.h +++ b/src/cc/CCrewards.h @@ -20,6 +20,7 @@ #include "CCinclude.h" #define EVAL_REWARDS 0xe5 +#define REWARDSCC_MAXAPR (COIN/4) bool RewardsValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx); UniValue RewardsInfo(uint256 rewardid); diff --git a/src/cc/CCutils.cpp b/src/cc/CCutils.cpp index 240e5b7e0..8cb06ab25 100644 --- a/src/cc/CCutils.cpp +++ b/src/cc/CCutils.cpp @@ -156,7 +156,7 @@ bool GetCCaddress(struct CCcontract_info *cp,char *destaddr,CPubKey pk) return(destaddr[0] != 0); } -bool ConstrainVout(CTxOut vout,int32_t CCflag,char *cmpaddr,uint64_t nValue) +bool ConstrainVout(CTxOut vout,int32_t CCflag,char *cmpaddr,int64_t nValue) { char destaddr[64]; if ( vout.scriptPubKey.IsPayToCryptoCondition() != CCflag ) @@ -255,7 +255,7 @@ CPubKey GetUnspendable(struct CCcontract_info *cp,uint8_t *unspendablepriv) bool ProcessCC(struct CCcontract_info *cp,Eval* eval, std::vector paramsNull,const CTransaction &ctx, unsigned int nIn) { - CTransaction createTx; uint256 assetid,assetid2,hashBlock; uint8_t funcid; int32_t i,n; uint64_t amount; std::vector origpubkey; + CTransaction createTx; uint256 assetid,assetid2,hashBlock; uint8_t funcid; int32_t i,n; int64_t amount; std::vector origpubkey; // there is a chance CC tx is valid in mempool, but invalid when in block, so we cant filter duplicate requests. if any of the vins are spent, for example //txid = ctx.GetHash(); //if ( txid == cp->prevtxid ) diff --git a/src/cc/auction.cpp b/src/cc/auction.cpp index 7d8512ede..8265dfc45 100644 --- a/src/cc/auction.cpp +++ b/src/cc/auction.cpp @@ -21,7 +21,7 @@ // start of consensus code -uint64_t IsAuctionvout(struct CCcontract_info *cp,const CTransaction& tx,int32_t v) +int64_t IsAuctionvout(struct CCcontract_info *cp,const CTransaction& tx,int32_t v) { char destaddr[64]; if ( tx.vout[v].scriptPubKey.IsPayToCryptoCondition() != 0 ) @@ -35,7 +35,7 @@ uint64_t IsAuctionvout(struct CCcontract_info *cp,const CTransaction& tx,int32_t bool AuctionExactAmounts(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx,int32_t minage,uint64_t txfee) { static uint256 zerohash; - CTransaction vinTx; uint256 hashBlock,activehash; int32_t i,numvins,numvouts; uint64_t inputs=0,outputs=0,assetoshis; + CTransaction vinTx; uint256 hashBlock,activehash; int32_t i,numvins,numvouts; int64_t inputs=0,outputs=0,assetoshis; numvins = tx.vin.size(); numvouts = tx.vout.size(); for (i=0; i origpubkey; CTransaction vintx; int32_t n = 0; + char coinaddr[64]; int64_t nValue,price,totalinputs = 0; uint256 txid,hashBlock; std::vector origpubkey; CTransaction vintx; int32_t n = 0; std::vector > unspentOutputs; GetCCaddress(cp,coinaddr,pk); SetCCunspents(unspentOutputs,coinaddr); @@ -147,9 +147,9 @@ uint64_t AddAuctionInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CP return(totalinputs); } -std::string AuctionBid(uint64_t txfee,uint256 itemhash,uint64_t amount) +std::string AuctionBid(uint64_t txfee,uint256 itemhash,int64_t amount) { - CMutableTransaction mtx; CPubKey mypk,Auctionpk; CScript opret; uint64_t inputs,CCchange=0,nValue=COIN; struct CCcontract_info *cp,C; + CMutableTransaction mtx; CPubKey mypk,Auctionpk; CScript opret; int64_t inputs,CCchange=0,nValue=COIN; struct CCcontract_info *cp,C; cp = CCinit(&C,EVAL_AUCTION); if ( txfee == 0 ) txfee = 10000; @@ -169,7 +169,7 @@ std::string AuctionBid(uint64_t txfee,uint256 itemhash,uint64_t amount) std::string AuctionDeliver(uint64_t txfee,uint256 itemhash,uint256 bidtxid) { - CMutableTransaction mtx; CPubKey mypk,Auctionpk; CScript opret; uint64_t inputs,CCchange=0,nValue=COIN; struct CCcontract_info *cp,C; + CMutableTransaction mtx; CPubKey mypk,Auctionpk; CScript opret; int64_t inputs,CCchange=0,nValue=COIN; struct CCcontract_info *cp,C; cp = CCinit(&C,EVAL_AUCTION); if ( txfee == 0 ) txfee = 10000; @@ -187,9 +187,9 @@ std::string AuctionDeliver(uint64_t txfee,uint256 itemhash,uint256 bidtxid) return(0); } -std::string AuctionPost(uint64_t txfee,uint256 itemhash,uint64_t minbid,char *title,char *description) +std::string AuctionPost(uint64_t txfee,uint256 itemhash,int64_t minbid,char *title,char *description) { - CMutableTransaction mtx; CPubKey mypk,Auctionpk; uint64_t funds = 0; CScript opret; struct CCcontract_info *cp,C; + CMutableTransaction mtx; CPubKey mypk,Auctionpk; int64_t funds = 0; CScript opret; struct CCcontract_info *cp,C; cp = CCinit(&C,EVAL_AUCTION); if ( txfee == 0 ) txfee = 10000; diff --git a/src/cc/fsm.cpp b/src/cc/fsm.cpp index e3e112bf6..6141d8a4a 100644 --- a/src/cc/fsm.cpp +++ b/src/cc/fsm.cpp @@ -21,7 +21,7 @@ // start of consensus code -uint64_t IsFSMvout(struct CCcontract_info *cp,const CTransaction& tx,int32_t v) +int64_t IsFSMvout(struct CCcontract_info *cp,const CTransaction& tx,int32_t v) { char destaddr[64]; if ( tx.vout[v].scriptPubKey.IsPayToCryptoCondition() != 0 ) @@ -35,7 +35,7 @@ uint64_t IsFSMvout(struct CCcontract_info *cp,const CTransaction& tx,int32_t v) bool FSMExactAmounts(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx,int32_t minage,uint64_t txfee) { static uint256 zerohash; - CTransaction vinTx; uint256 hashBlock,activehash; int32_t i,numvins,numvouts; uint64_t inputs=0,outputs=0,assetoshis; + CTransaction vinTx; uint256 hashBlock,activehash; int32_t i,numvins,numvouts; int64_t inputs=0,outputs=0,assetoshis; numvins = tx.vin.size(); numvouts = tx.vout.size(); for (i=0; i origpubkey; CTransaction vintx; int32_t n = 0; + char coinaddr[64]; int64_t nValue,price,totalinputs = 0; uint256 txid,hashBlock; std::vector origpubkey; CTransaction vintx; int32_t n = 0; std::vector > unspentOutputs; GetCCaddress(cp,coinaddr,pk); SetCCunspents(unspentOutputs,coinaddr); @@ -154,7 +154,7 @@ std::string FSMList() std::string FSMCreate(uint64_t txfee,std::string name,std::string states) { - CMutableTransaction mtx; CPubKey mypk,fsmpk; CScript opret; uint64_t inputs,CCchange=0,nValue=COIN; struct CCcontract_info *cp,C; + CMutableTransaction mtx; CPubKey mypk,fsmpk; CScript opret; int64_t inputs,CCchange=0,nValue=COIN; struct CCcontract_info *cp,C; cp = CCinit(&C,EVAL_FSM); if ( txfee == 0 ) txfee = 10000; @@ -174,7 +174,7 @@ std::string FSMCreate(uint64_t txfee,std::string name,std::string states) std::string FSMInfo(uint256 fsmtxid) { - CMutableTransaction mtx; CPubKey mypk,fsmpk; uint64_t funds = 0; CScript opret; struct CCcontract_info *cp,C; + CMutableTransaction mtx; CPubKey mypk,fsmpk; int64_t funds = 0; CScript opret; struct CCcontract_info *cp,C; cp = CCinit(&C,EVAL_FSM); mypk = pubkey2pk(Mypubkey()); fsmpk = GetUnspendable(cp,0); diff --git a/src/cc/lotto.cpp b/src/cc/lotto.cpp index 0ed223c25..0d03d5e15 100644 --- a/src/cc/lotto.cpp +++ b/src/cc/lotto.cpp @@ -21,7 +21,7 @@ // start of consensus code -uint64_t IsLottovout(struct CCcontract_info *cp,const CTransaction& tx,int32_t v) +int64_t IsLottovout(struct CCcontract_info *cp,const CTransaction& tx,int32_t v) { char destaddr[64]; if ( tx.vout[v].scriptPubKey.IsPayToCryptoCondition() != 0 ) @@ -35,7 +35,7 @@ uint64_t IsLottovout(struct CCcontract_info *cp,const CTransaction& tx,int32_t v bool LottoExactAmounts(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx,int32_t minage,uint64_t txfee) { static uint256 zerohash; - CTransaction vinTx; uint256 hashBlock,activehash; int32_t i,numvins,numvouts; uint64_t inputs=0,outputs=0,assetoshis; + CTransaction vinTx; uint256 hashBlock,activehash; int32_t i,numvins,numvouts; int64_t inputs=0,outputs=0,assetoshis; numvins = tx.vin.size(); numvouts = tx.vout.size(); for (i=0; i origpubkey; CTransaction vintx; int32_t n = 0; + char coinaddr[64]; int64_t nValue,price,totalinputs = 0; uint256 txid,hashBlock; std::vector origpubkey; CTransaction vintx; int32_t n = 0; std::vector > unspentOutputs; GetCCaddress(cp,coinaddr,pk); SetCCunspents(unspentOutputs,coinaddr); @@ -147,9 +147,9 @@ uint64_t AddLottoInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPub return(totalinputs); } -std::string LottoTicket(uint64_t txfee,uint64_t numtickets) +std::string LottoTicket(uint64_t txfee,int64_t numtickets) { - CMutableTransaction mtx; CPubKey mypk,Lottopk; CScript opret; uint64_t inputs,CCchange=0,nValue=COIN; struct CCcontract_info *cp,C; + CMutableTransaction mtx; CPubKey mypk,Lottopk; CScript opret; int64_t inputs,CCchange=0,nValue=COIN; struct CCcontract_info *cp,C; cp = CCinit(&C,EVAL_LOTTO); if ( txfee == 0 ) txfee = 10000; @@ -169,7 +169,7 @@ std::string LottoTicket(uint64_t txfee,uint64_t numtickets) std::string LottoWinner(uint64_t txfee) { - CMutableTransaction mtx; CPubKey mypk,Lottopk; uint64_t winnings = 0; CScript opret; struct CCcontract_info *cp,C; + CMutableTransaction mtx; CPubKey mypk,Lottopk; int64_t winnings = 0; CScript opret; struct CCcontract_info *cp,C; cp = CCinit(&C,EVAL_LOTTO); if ( txfee == 0 ) txfee = 10000; diff --git a/src/cc/rewards.cpp b/src/cc/rewards.cpp index 442f0e460..64d95c846 100644 --- a/src/cc/rewards.cpp +++ b/src/cc/rewards.cpp @@ -205,6 +205,8 @@ bool RewardsValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &t return eval->Invalid("cant find fundingtxid"); else if ( fundingTx.vout.size() > 0 && DecodeRewardsFundingOpRet(fundingTx.vout[fundingTx.vout.size()-1].scriptPubKey,sbits,APR,minseconds,maxseconds,mindeposit) != 'F' ) return eval->Invalid("fundingTx not valid"); + if ( APR > REWARDSCC_MAXAPR ) + return eval->Invalid("excessive APR"); switch ( funcid ) { case 'F': @@ -424,6 +426,11 @@ std::string RewardsCreateFunding(uint64_t txfee,char *planstr,int64_t funds,int6 fprintf(stderr,"negative parameter error\n"); return(0); } + if ( APR > REWARDSCC_MAXAPR ) + { + fprintf(stderr,"25% APR is maximum\n"); + return(0); + } cp = CCinit(&C,EVAL_REWARDS); if ( txfee == 0 ) txfee = 10000; From 984a9dc30a4e2609af080364e00a288e9c2b4614 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Aug 2018 19:33:02 -1100 Subject: [PATCH 31/38] %% --- 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 64d95c846..c84c73591 100644 --- a/src/cc/rewards.cpp +++ b/src/cc/rewards.cpp @@ -13,7 +13,7 @@ * * ******************************************************************************/ -#include "CCinclude.h" +#include "CCrewards.h" /* The rewards CC contract is initially for OOT, which needs this functionality. However, many of the attributes can be parameterized to allow different rewards programs to run. Multiple rewards plans could even run on the same blockchain, though the user would need to choose which one to lock funds into. @@ -428,7 +428,7 @@ std::string RewardsCreateFunding(uint64_t txfee,char *planstr,int64_t funds,int6 } if ( APR > REWARDSCC_MAXAPR ) { - fprintf(stderr,"25% APR is maximum\n"); + fprintf(stderr,"25%% APR is maximum\n"); return(0); } cp = CCinit(&C,EVAL_REWARDS); From 0d84fb208ec4b3a0a35f09b43711b4d96f3ccf84 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Aug 2018 19:38:55 -1100 Subject: [PATCH 32/38] Error check add inputs loop --- src/cc/CCtx.cpp | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/cc/CCtx.cpp b/src/cc/CCtx.cpp index 4bc081e15..a22b4fd7d 100644 --- a/src/cc/CCtx.cpp +++ b/src/cc/CCtx.cpp @@ -249,7 +249,6 @@ int32_t CC_vinselect(int32_t *aboveip,int64_t *abovep,int32_t *belowip,int64_t * else if ( abovei >= 0 ) return(abovei); else return(belowi); - //return(abovei >= 0 && above < (below>>1) ? abovei : belowi); } int64_t AddNormalinputs(CMutableTransaction &mtx,CPubKey mypk,int64_t total,int32_t maxinputs) @@ -283,19 +282,13 @@ int64_t AddNormalinputs(CMutableTransaction &mtx,CPubKey mypk,int64_t total,int3 up->txid = txid; up->nValue = out.tx->vout[out.i].nValue; up->vout = vout; - /*mtx.vin.push_back(CTxIn(txid,vout,CScript())); - nValue = out.tx->vout[out.i].nValue; - totalinputs += nValue; - n++; - if ( totalinputs >= total || n >= maxinputs ) - break;*/ if ( n >= maxutxos ) break; } } } remains = total; - for (i=0; i0; i++) { below = above = 0; abovei = belowi = -1; From 2b6315fd1370a6a95d5e89e4c707500c2f51f6c0 Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Aug 2018 20:24:33 -1100 Subject: [PATCH 33/38] Fix utxo selection --- src/cc/CCtx.cpp | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/src/cc/CCtx.cpp b/src/cc/CCtx.cpp index a22b4fd7d..65adc6655 100644 --- a/src/cc/CCtx.cpp +++ b/src/cc/CCtx.cpp @@ -266,16 +266,22 @@ int64_t AddNormalinputs(CMutableTransaction &mtx,CPubKey mypk,int64_t total,int3 { txid = out.tx->GetHash(); vout = out.i; - for (i=0; i 0 ) + { + for (i=0; i 0 ) + { + for (i=0; itxid,up->vout,CScript())); totalinputs += up->nValue; remains -= up->nValue; + utxos[ind] = utxos[--n]; + memset(&utxos[n],0,sizeof(utxos[n])); if ( totalinputs >= total || (i+1) >= maxinputs ) break; } From 0c3cdfb4f3f712b7371d4b550d84e09c59dc2f0b Mon Sep 17 00:00:00 2001 From: jl777 Date: Thu, 9 Aug 2018 22:45:53 -1100 Subject: [PATCH 34/38] MAX APR to 25*COIN == 25% --- src/cc/CCrewards.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cc/CCrewards.h b/src/cc/CCrewards.h index 26819e9b9..ef675797c 100644 --- a/src/cc/CCrewards.h +++ b/src/cc/CCrewards.h @@ -20,7 +20,7 @@ #include "CCinclude.h" #define EVAL_REWARDS 0xe5 -#define REWARDSCC_MAXAPR (COIN/4) +#define REWARDSCC_MAXAPR (COIN * 25) bool RewardsValidate(struct CCcontract_info *cp,Eval* eval,const CTransaction &tx); UniValue RewardsInfo(uint256 rewardid); From 309ee4e3a168f8a68e3b0ff1c3ea0e5ae63b936d Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 10 Aug 2018 05:13:14 -1100 Subject: [PATCH 35/38] Return string in faucet --- 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 403b56c3e..1adec8af8 100644 --- a/src/cc/faucet.cpp +++ b/src/cc/faucet.cpp @@ -169,7 +169,7 @@ std::string FaucetGet(uint64_t txfee) mtx.vout.push_back(CTxOut(nValue,CScript() << ParseHex(HexStr(mypk)) << OP_CHECKSIG)); return(FinalizeCCTx(-1LL,cp,mtx,mypk,txfee,opret)); } else fprintf(stderr,"cant find faucet inputs\n"); - return(0); + return(""); } std::string FaucetFund(uint64_t txfee,int64_t funds) @@ -185,7 +185,7 @@ std::string FaucetFund(uint64_t txfee,int64_t funds) mtx.vout.push_back(MakeCC1vout(EVAL_FAUCET,funds,faucetpk)); return(FinalizeCCTx(0,cp,mtx,mypk,txfee,opret)); } - return(0); + return(""); } UniValue FaucetInfo() From 1ed46fb8378c594600cc2fdf2866f7af75581b3a Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 10 Aug 2018 05:16:48 -1100 Subject: [PATCH 36/38] return("") for std::string --- src/cc/auction.cpp | 6 +++--- src/cc/dice.cpp | 38 +++++++++++++++++++------------------- src/cc/fsm.cpp | 6 +++--- src/cc/lotto.cpp | 4 ++-- src/cc/rewards.cpp | 30 +++++++++++++++--------------- 5 files changed, 42 insertions(+), 42 deletions(-) diff --git a/src/cc/auction.cpp b/src/cc/auction.cpp index 8265dfc45..7b5f106d0 100644 --- a/src/cc/auction.cpp +++ b/src/cc/auction.cpp @@ -164,7 +164,7 @@ std::string AuctionBid(uint64_t txfee,uint256 itemhash,int64_t amount) mtx.vout.push_back(CTxOut(nValue,CScript() << ParseHex(HexStr(mypk)) << OP_CHECKSIG)); return(FinalizeCCTx(-1LL,cp,mtx,mypk,txfee,opret)); } else fprintf(stderr,"cant find Auction inputs\n"); - return(0); + return(""); } std::string AuctionDeliver(uint64_t txfee,uint256 itemhash,uint256 bidtxid) @@ -184,7 +184,7 @@ std::string AuctionDeliver(uint64_t txfee,uint256 itemhash,uint256 bidtxid) mtx.vout.push_back(CTxOut(nValue,CScript() << ParseHex(HexStr(mypk)) << OP_CHECKSIG)); return(FinalizeCCTx(-1LL,cp,mtx,mypk,txfee,opret)); } else fprintf(stderr,"cant find Auction inputs\n"); - return(0); + return(""); } std::string AuctionPost(uint64_t txfee,uint256 itemhash,int64_t minbid,char *title,char *description) @@ -200,7 +200,7 @@ std::string AuctionPost(uint64_t txfee,uint256 itemhash,int64_t minbid,char *tit mtx.vout.push_back(MakeCC1vout(EVAL_AUCTION,funds,Auctionpk)); return(FinalizeCCTx(0,cp,mtx,mypk,txfee,opret)); } - return(0); + return(""); } diff --git a/src/cc/dice.cpp b/src/cc/dice.cpp index e35f367f3..0dbad5cd6 100644 --- a/src/cc/dice.cpp +++ b/src/cc/dice.cpp @@ -805,11 +805,11 @@ std::string DiceCreateFunding(uint64_t txfee,char *planstr,int64_t funds,int64_t if ( funds < 0 || minbet < 0 || maxbet < 0 || maxodds < 1 || timeoutblocks < 0 || timeoutblocks > 1440 ) { fprintf(stderr,"negative parameter error\n"); - return(0); + return(""); } memset(&zero,0,sizeof(zero)); if ( (cp= Diceinit(fundingPubKey,zero,&C,planstr,txfee,mypk,dicepk,sbits,a,b,c,d)) == 0 ) - return(0); + return(""); if ( AddNormalinputs(mtx,mypk,funds+3*txfee,60) > 0 ) { mtx.vout.push_back(MakeCC1vout(cp->evalcode,funds,dicepk)); @@ -818,7 +818,7 @@ std::string DiceCreateFunding(uint64_t txfee,char *planstr,int64_t funds,int64_t return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeDiceFundingOpRet('F',sbits,minbet,maxbet,maxodds,timeoutblocks))); } fprintf(stderr,"cant find enough inputs\n"); - return(0); + return(""); } std::string DiceAddfunding(uint64_t txfee,char *planstr,uint256 fundingtxid,int64_t amount) @@ -827,10 +827,10 @@ std::string DiceAddfunding(uint64_t txfee,char *planstr,uint256 fundingtxid,int6 if ( amount < 0 ) { fprintf(stderr,"negative parameter error\n"); - return(0); + return(""); } if ( (cp= Diceinit(fundingPubKey,fundingtxid,&C,planstr,txfee,mypk,dicepk,sbits,minbet,maxbet,maxodds,timeoutblocks)) == 0 ) - return(0); + return(""); scriptPubKey = CScript() << ParseHex(HexStr(mypk)) << OP_CHECKSIG; if ( 0 ) { @@ -854,7 +854,7 @@ std::string DiceAddfunding(uint64_t txfee,char *planstr,uint256 fundingtxid,int6 return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeDiceOpRet('E',sbits,fundingtxid,hentropy,zeroid))); } else fprintf(stderr,"cant find enough inputs\n"); } else fprintf(stderr,"only fund creator can add more funds (entropy)\n"); - return(0); + return(""); } std::string DiceBet(uint64_t txfee,char *planstr,uint256 fundingtxid,int64_t bet,int32_t odds) @@ -863,21 +863,21 @@ std::string DiceBet(uint64_t txfee,char *planstr,uint256 fundingtxid,int64_t bet if ( bet < 0 || odds < 1 ) { fprintf(stderr,"negative parameter error\n"); - return(0); + return(""); } if ( (cp= Diceinit(fundingPubKey,fundingtxid,&C,planstr,txfee,mypk,dicepk,sbits,minbet,maxbet,maxodds,timeoutblocks)) == 0 ) - return(0); + return(""); if ( bet < minbet || bet > maxbet || odds > maxodds ) { fprintf(stderr,"Dice plan %s illegal bet %.8f: minbet %.8f maxbet %.8f or odds %d vs max.%d\n",planstr,(double)bet/COIN,(double)minbet/COIN,(double)maxbet/COIN,(int32_t)odds,(int32_t)maxodds); - return(0); + return(""); } if ( (funding= DicePlanFunds(entropyval,entropytxid,sbits,cp,dicepk,fundingtxid)) >= 2*bet*odds+txfee && entropyval != 0 ) { if ( myIsutxo_spentinmempool(entropytxid,0) != 0 ) { fprintf(stderr,"entropy txid is spent\n"); - return(0); + return(""); } mtx.vin.push_back(CTxIn(entropytxid,0,CScript())); if ( AddNormalinputs(mtx,mypk,bet+2*txfee+odds,60) > 0 ) @@ -892,7 +892,7 @@ std::string DiceBet(uint64_t txfee,char *planstr,uint256 fundingtxid,int64_t bet if ( entropyval == 0 && funding != 0 ) fprintf(stderr,"cant find dice entropy inputs\n"); else fprintf(stderr,"cant find dice inputs\n"); - return(0); + return(""); } std::string DiceBetFinish(int32_t *resultp,uint64_t txfee,char *planstr,uint256 fundingtxid,uint256 bettxid,int32_t winlosetimeout) @@ -903,7 +903,7 @@ std::string DiceBetFinish(int32_t *resultp,uint64_t txfee,char *planstr,uint256 if ( (cp= Diceinit(fundingPubKey,fundingtxid,&C,planstr,txfee,mypk,dicepk,sbits,minbet,maxbet,maxodds,timeoutblocks)) == 0 ) { fprintf(stderr,"Diceinit error\n"); - return("0"); + return(""); } fundingpk = DiceFundingPk(fundingPubKey); if ( winlosetimeout != 0 ) @@ -918,7 +918,7 @@ std::string DiceBetFinish(int32_t *resultp,uint64_t txfee,char *planstr,uint256 if ( AddNormalinputs(mtx,mypk,txfee,1) == 0 ) { fprintf(stderr,"no txfee inputs for win/lose\n"); - return("0"); + return(""); } if ( GetTransaction(bettxid,betTx,hashBlock,false) != 0 && GetTransaction(betTx.vin[0].prevout.hash,entropyTx,hashBlock,false) != 0 ) { @@ -932,7 +932,7 @@ std::string DiceBetFinish(int32_t *resultp,uint64_t txfee,char *planstr,uint256 if ( myIsutxo_spentinmempool(bettxid,0) != 0 || myIsutxo_spentinmempool(bettxid,1) != 0 ) { fprintf(stderr,"bettxid already spent\n"); - return("0"); + return(""); } //fprintf(stderr,"iswin.%d matches\n",iswin); mtx.vin.push_back(CTxIn(bettxid,0,CScript())); @@ -942,7 +942,7 @@ std::string DiceBetFinish(int32_t *resultp,uint64_t txfee,char *planstr,uint256 funcid = 'T'; if ( DiceVerifyTimeout(betTx,timeoutblocks) == 0 ) // hasnt timed out yet { - return("0"); + return(""); } else { @@ -958,7 +958,7 @@ std::string DiceBetFinish(int32_t *resultp,uint64_t txfee,char *planstr,uint256 if ( odds < 1 || odds > maxodds ) { fprintf(stderr,"illegal odds.%d vs maxodds.%d\n",(int32_t)odds,(int32_t)maxodds); - return("0"); + return(""); } CCchange = betTx.vout[0].nValue; fundsneeded = txfee + odds*betTx.vout[1].nValue; @@ -973,7 +973,7 @@ std::string DiceBetFinish(int32_t *resultp,uint64_t txfee,char *planstr,uint256 else { fprintf(stderr,"not enough inputs for %.8f\n",(double)fundsneeded/COIN); - return("0"); + return(""); } } else @@ -994,12 +994,12 @@ std::string DiceBetFinish(int32_t *resultp,uint64_t txfee,char *planstr,uint256 { *resultp = -1; fprintf(stderr,"iswin.%d winlosetimeout.%d\n",iswin,winlosetimeout); - return("0"); + return(""); } } *resultp = -1; fprintf(stderr,"couldnt find bettx or entropytx\n"); - return("0"); + return(""); } double DiceStatus(uint64_t txfee,char *planstr,uint256 fundingtxid,uint256 bettxid) diff --git a/src/cc/fsm.cpp b/src/cc/fsm.cpp index 6141d8a4a..04c620e99 100644 --- a/src/cc/fsm.cpp +++ b/src/cc/fsm.cpp @@ -149,7 +149,7 @@ int64_t AddFSMInputs(struct CCcontract_info *cp,CMutableTransaction &mtx,CPubKey std::string FSMList() { - return(0); + return(""); } std::string FSMCreate(uint64_t txfee,std::string name,std::string states) @@ -169,7 +169,7 @@ std::string FSMCreate(uint64_t txfee,std::string name,std::string states) mtx.vout.push_back(CTxOut(nValue,CScript() << ParseHex(HexStr(mypk)) << OP_CHECKSIG)); return(FinalizeCCTx(-1LL,cp,mtx,mypk,txfee,opret)); } else fprintf(stderr,"cant find fsm inputs\n"); - return(0); + return(""); } std::string FSMInfo(uint256 fsmtxid) @@ -178,7 +178,7 @@ std::string FSMInfo(uint256 fsmtxid) cp = CCinit(&C,EVAL_FSM); mypk = pubkey2pk(Mypubkey()); fsmpk = GetUnspendable(cp,0); - return(0); + return(""); } diff --git a/src/cc/lotto.cpp b/src/cc/lotto.cpp index 0d03d5e15..e20cb3505 100644 --- a/src/cc/lotto.cpp +++ b/src/cc/lotto.cpp @@ -164,7 +164,7 @@ std::string LottoTicket(uint64_t txfee,int64_t numtickets) mtx.vout.push_back(CTxOut(nValue,CScript() << ParseHex(HexStr(mypk)) << OP_CHECKSIG)); return(FinalizeCCTx(-1LL,cp,mtx,mypk,txfee,opret)); } else fprintf(stderr,"cant find Lotto inputs\n"); - return(0); + return(""); } std::string LottoWinner(uint64_t txfee) @@ -180,7 +180,7 @@ std::string LottoWinner(uint64_t txfee) mtx.vout.push_back(MakeCC1vout(EVAL_LOTTO,winnings,Lottopk)); return(FinalizeCCTx(0,cp,mtx,mypk,txfee,opret)); } - return(0); + return(""); } diff --git a/src/cc/rewards.cpp b/src/cc/rewards.cpp index c84c73591..896284245 100644 --- a/src/cc/rewards.cpp +++ b/src/cc/rewards.cpp @@ -424,12 +424,12 @@ std::string RewardsCreateFunding(uint64_t txfee,char *planstr,int64_t funds,int6 if ( funds < COIN || mindeposit < 0 || minseconds < 0 || maxseconds < 0 ) { fprintf(stderr,"negative parameter error\n"); - return(0); + return(""); } if ( APR > REWARDSCC_MAXAPR ) { fprintf(stderr,"25%% APR is maximum\n"); - return(0); + return(""); } cp = CCinit(&C,EVAL_REWARDS); if ( txfee == 0 ) @@ -440,7 +440,7 @@ std::string RewardsCreateFunding(uint64_t txfee,char *planstr,int64_t funds,int6 if ( RewardsPlanExists(cp,sbits,rewardspk,a,b,c,d) != 0 ) { fprintf(stderr,"Rewards plan (%s) already exists\n",planstr); - return(0); + return(""); } if ( AddNormalinputs(mtx,mypk,funds+2*txfee,64) > 0 ) { @@ -449,7 +449,7 @@ std::string RewardsCreateFunding(uint64_t txfee,char *planstr,int64_t funds,int6 return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeRewardsFundingOpRet('F',sbits,APR,minseconds,maxseconds,mindeposit))); } fprintf(stderr,"cant find enough inputs\n"); - return(0); + return(""); } std::string RewardsAddfunding(uint64_t txfee,char *planstr,uint256 fundingtxid,int64_t amount) @@ -458,7 +458,7 @@ std::string RewardsAddfunding(uint64_t txfee,char *planstr,uint256 fundingtxid,i if ( amount < 0 ) { fprintf(stderr,"negative parameter error\n"); - return(0); + return(""); } cp = CCinit(&C,EVAL_REWARDS); if ( txfee == 0 ) @@ -469,7 +469,7 @@ std::string RewardsAddfunding(uint64_t txfee,char *planstr,uint256 fundingtxid,i if ( RewardsPlanExists(cp,sbits,rewardspk,a,b,c,d) == 0 ) { fprintf(stderr,"Rewards plan %s doesnt exist\n",planstr); - return(0); + return(""); } sbits = stringbits(planstr); if ( AddNormalinputs(mtx,mypk,amount+txfee,64) > 0 ) @@ -478,7 +478,7 @@ std::string RewardsAddfunding(uint64_t txfee,char *planstr,uint256 fundingtxid,i return(FinalizeCCTx(0,cp,mtx,mypk,txfee,EncodeRewardsOpRet('A',sbits,fundingtxid))); } else fprintf(stderr,"cant find enough inputs\n"); fprintf(stderr,"cant find fundingtxid\n"); - return(0); + return(""); } std::string RewardsLock(uint64_t txfee,char *planstr,uint256 fundingtxid,int64_t deposit) @@ -487,7 +487,7 @@ std::string RewardsLock(uint64_t txfee,char *planstr,uint256 fundingtxid,int64_t if ( deposit < 0 ) { fprintf(stderr,"negative parameter error\n"); - return(0); + return(""); } cp = CCinit(&C,EVAL_REWARDS); if ( txfee == 0 ) @@ -498,12 +498,12 @@ std::string RewardsLock(uint64_t txfee,char *planstr,uint256 fundingtxid,int64_t if ( RewardsPlanExists(cp,sbits,rewardspk,APR,minseconds,maxseconds,mindeposit) == 0 ) { fprintf(stderr,"Rewards plan %s doesnt exist\n",planstr); - return(0); + return(""); } if ( deposit < mindeposit ) { fprintf(stderr,"Rewards plan %s deposit %.8f < mindeposit %.8f\n",planstr,(double)deposit/COIN,(double)mindeposit/COIN); - return(0); + return(""); } if ( (funding= RewardsPlanFunds(sbits,cp,rewardspk,fundingtxid)) >= deposit ) // arbitrary cmpval { @@ -515,7 +515,7 @@ std::string RewardsLock(uint64_t txfee,char *planstr,uint256 fundingtxid,int64_t } else fprintf(stderr,"cant find enough inputs %.8f note enough for %.8f\n",(double)funding/COIN,(double)deposit/COIN); } fprintf(stderr,"cant find rewards inputs\n"); - return(0); + return(""); } std::string RewardsUnlock(uint64_t txfee,char *planstr,uint256 fundingtxid,uint256 locktxid) @@ -530,7 +530,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); - return(0); + return(""); } 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 ) @@ -541,7 +541,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); - return(0); + return(""); } if ( GetTransaction(locktxid,tx,hashBlock,false) != 0 && tx.vout.size() > 0 && tx.vout[1].scriptPubKey.IsPayToCryptoCondition() == 0 ) { @@ -551,7 +551,7 @@ std::string RewardsUnlock(uint64_t txfee,char *planstr,uint256 fundingtxid,uint2 else { fprintf(stderr,"%s no normal vout.1 in locktxid\n",coinaddr); - return(0); + return(""); } } if ( amount > 0 && (reward= RewardsCalc(amount,mtx.vin[0].prevout.hash,APR,minseconds,maxseconds,mindeposit)) > txfee && scriptPubKey.size() > 0 ) @@ -568,6 +568,6 @@ std::string RewardsUnlock(uint64_t txfee,char *planstr,uint256 fundingtxid,uint2 fprintf(stderr,"cant find enough rewards inputs\n"); } fprintf(stderr,"amount %.8f -> reward %.8f\n",(double)amount/COIN,(double)reward/COIN); - return(0); + return(""); } From 7a0727d5855f3e4f78725f2b5b8b440e3d2d6ffc Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 10 Aug 2018 10:37:00 -1100 Subject: [PATCH 37/38] Filter out CC utxo for normal add inputs --- src/cc/CCtx.cpp | 47 +++++++++++++++++++++++++---------------------- 1 file changed, 25 insertions(+), 22 deletions(-) diff --git a/src/cc/CCtx.cpp b/src/cc/CCtx.cpp index 65adc6655..7b42690ea 100644 --- a/src/cc/CCtx.cpp +++ b/src/cc/CCtx.cpp @@ -266,30 +266,33 @@ int64_t AddNormalinputs(CMutableTransaction &mtx,CPubKey mypk,int64_t total,int3 { txid = out.tx->GetHash(); vout = out.i; - if ( mtx.vin.size() > 0 ) + if ( GetTransaction(txid,tx,hashBlock,false) != 0 && tx.vout.size() > 0 && tx.vout[vout].scriptPubKey.IsPayToCryptoCondition() == 0 ) { - for (i=0; i 0 ) + { + for (i=0; i 0 ) + { + for (i=0; itxid = txid; + up->nValue = out.tx->vout[out.i].nValue; + up->vout = vout; + if ( n >= maxutxos ) break; - if ( i != mtx.vin.size() ) - continue; - } - if ( n > 0 ) - { - for (i=0; itxid = txid; - up->nValue = out.tx->vout[out.i].nValue; - up->vout = vout; - if ( n >= maxutxos ) - break; + } } } } From 076a9ee19bb4c8285a28f96746ea2f3bb295a602 Mon Sep 17 00:00:00 2001 From: jl777 Date: Fri, 10 Aug 2018 20:24:50 -1100 Subject: [PATCH 38/38] -MGNX exception --- src/cc/CCtx.cpp | 2 +- src/komodo_bitcoind.h | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/cc/CCtx.cpp b/src/cc/CCtx.cpp index 7b42690ea..2c3001c10 100644 --- a/src/cc/CCtx.cpp +++ b/src/cc/CCtx.cpp @@ -266,7 +266,7 @@ int64_t AddNormalinputs(CMutableTransaction &mtx,CPubKey mypk,int64_t total,int3 { txid = out.tx->GetHash(); vout = out.i; - if ( GetTransaction(txid,tx,hashBlock,false) != 0 && tx.vout.size() > 0 && tx.vout[vout].scriptPubKey.IsPayToCryptoCondition() == 0 ) + if ( GetTransaction(txid,tx,hashBlock,false) != 0 && tx.vout.size() > 0 && vout < tx.vout.size() && tx.vout[vout].scriptPubKey.IsPayToCryptoCondition() == 0 ) { if ( mtx.vin.size() > 0 ) { diff --git a/src/komodo_bitcoind.h b/src/komodo_bitcoind.h index ac76958c4..bd5505c1c 100644 --- a/src/komodo_bitcoind.h +++ b/src/komodo_bitcoind.h @@ -1535,8 +1535,6 @@ int32_t komodo_checkPOW(int32_t slowflag,CBlock *pblock,int32_t height) return(-1); } } - if ( strcmp(ASSETCHAINS_SYMBOL,"MGNX") == 0 && height < 13000 ) - return(0); if ( ASSETCHAINS_STAKED != 0 && height >= 2 ) // must PoS or have at least 16x better PoW { if ( (is_PoSblock= komodo_is_PoSblock(slowflag,height,pblock,bnTarget,bhash)) == 0 )