From ea9aa47b918d1f426c8ef6f660cab367467c1977 Mon Sep 17 00:00:00 2001 From: barrystyle Date: Wed, 1 May 2019 09:25:29 +0800 Subject: [PATCH 1/2] fallback to paying devops, when a valid masternode destination cannot be obtained (gbt/stake) --- src/rpcmining.cpp | 53 +++++++++++++++++++++-------------------------- src/wallet.cpp | 6 +++++- 2 files changed, 29 insertions(+), 30 deletions(-) diff --git a/src/rpcmining.cpp b/src/rpcmining.cpp index 451b4a8c..364b8642 100644 --- a/src/rpcmining.cpp +++ b/src/rpcmining.cpp @@ -674,35 +674,30 @@ Value getblocktemplate(const Array& params, bool fHelp) result.push_back(Pair("height", (int64_t)(pindexPrev->nHeight+1))); result.push_back(Pair("votes", aVotes)); - // TODO: Verify upgrade - if (nLiveForkToggle > 0) - { - if (pindexBest->nHeight > nLiveForkToggle) - { - // Include DevOps payments - CAmount devopsSplit = devopsPayment; - Object devopsReward; - devopsReward.push_back(Pair("devopspayee", Params().DevOpsAddress())); - devopsReward.push_back(Pair("amount", devopsSplit)); - result.push_back(Pair("devopsreward", devopsReward)); - result.push_back(Pair("devops_reward_enforced", true)); - - // Include Masternode payments - CAmount masternodeSplit = masternodePayment; - CMasternode* winningNode = mnodeman.GetCurrentMasterNode(1); - - if (winningNode) { - CScript payee = GetScriptForDestination(winningNode->pubkey.GetID()); - CTxDestination address1; - ExtractDestination(payee, address1); - CBitcoinAddress address2(address1); - result.push_back(Pair("payee", address2.ToString().c_str())); - result.push_back(Pair("payee_amount", (int64_t)masternodeSplit)); - result.push_back(Pair("masternode_payments", true)); - result.push_back(Pair("enforce_masternode_payments", true)); - } - } - } + // Include DevOps payments + CAmount devopsSplit = devopsPayment; + Object devopsReward; + devopsReward.push_back(Pair("devopspayee", Params().DevOpsAddress())); + devopsReward.push_back(Pair("amount", devopsSplit)); + result.push_back(Pair("devopsreward", devopsReward)); + result.push_back(Pair("devops_reward_enforced", true)); + + // Include Masternode payments + CAmount masternodeSplit = masternodePayment; + CMasternode* winningNode = mnodeman.GetCurrentMasterNode(1); + + if (winningNode) { + CScript payee = GetScriptForDestination(winningNode->pubkey.GetID()); + CTxDestination address1; + ExtractDestination(payee, address1); + CBitcoinAddress address2(address1); + result.push_back(Pair("payee", address2.ToString().c_str())); + } else { + result.push_back(Pair("payee", Params().DevOpsAddress().c_str())); + } + result.push_back(Pair("payee_amount", (int64_t)masternodeSplit)); + result.push_back(Pair("masternode_payments", true)); + result.push_back(Pair("enforce_masternode_payments", true)); return result; } diff --git a/src/wallet.cpp b/src/wallet.cpp index ae1fc532..d27a6580 100644 --- a/src/wallet.cpp +++ b/src/wallet.cpp @@ -2889,6 +2889,10 @@ bool CWallet::CreateCoinStake(const CKeyStore& keystore, unsigned int nBits, int txNew.vin.clear(); txNew.vout.clear(); + // Determine our payment script for devops + CScript devopsScript; + devopsScript << OP_DUP << OP_HASH160 << ParseHex(Params().DevOpsPubKey()) << OP_EQUALVERIFY << OP_CHECKSIG; + // Mark coin stake transaction CScript scriptEmpty; scriptEmpty.clear(); @@ -3079,7 +3083,7 @@ bool CWallet::CreateCoinStake(const CKeyStore& keystore, unsigned int nBits, int if(winningNode){ payee = GetScriptForDestination(winningNode->pubkey.GetID()); } else { - return error("CreateCoinStake: Failed to detect masternode to pay\n"); + payee = devopsScript; } } } else { From 43352ab8be9f6c44a5d292e7d6d33868bba4e0ae Mon Sep 17 00:00:00 2001 From: barrystyle Date: Wed, 1 May 2019 09:44:10 +0800 Subject: [PATCH 2/2] test if masternode destination is valid, using an iteration method --- src/main.cpp | 5 +++-- src/masternodeman.cpp | 20 ++++++++++++++++++++ src/masternodeman.h | 2 ++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 943e7724..d2a81cf5 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -2656,6 +2656,7 @@ bool CBlock::CheckBlock(bool fCheckPOW, bool fCheckMerkleRoot, bool fCheckSig) c // Check PoW or PoS payments for current block for (unsigned int i=0; i < vtx[isProofOfStake].vout.size(); i++) { // Define values + CScript rawPayee = vtx[isProofOfStake].vout[i].scriptPubKey; CTxDestination address; ExtractDestination(vtx[isProofOfStake].vout[i].scriptPubKey, address); CBitcoinAddress addressOut(address); @@ -2667,7 +2668,7 @@ bool CBlock::CheckBlock(bool fCheckPOW, bool fCheckMerkleRoot, bool fCheckSig) c if (isProofOfStake) { // Check for PoS masternode payment if (i == nProofOfIndexMasternode) { - if (addressOut.ToString() == loggedpayee) { + if (mnodeman.IsPayeeAValidMasternode(rawPayee)) { LogPrintf("CheckBlock() : PoS Recipient masternode address validity succesfully verified\n"); } else { LogPrintf("CheckBlock() : PoS Recipient masternode address validity could not be verified\n"); @@ -2700,7 +2701,7 @@ bool CBlock::CheckBlock(bool fCheckPOW, bool fCheckMerkleRoot, bool fCheckSig) c else if (!isProofOfStake) { // Check for PoW masternode payment if (i == nProofOfIndexMasternode) { - if (addressOut.ToString() == loggedpayee) { + if (mnodeman.IsPayeeAValidMasternode(rawPayee)) { LogPrintf("CheckBlock() : PoW Recipient masternode address validity succesfully verified\n"); } else { LogPrintf("CheckBlock() : PoW Recipient masternode address validity could not be verified\n"); diff --git a/src/masternodeman.cpp b/src/masternodeman.cpp index 054687c1..5fb0da36 100644 --- a/src/masternodeman.cpp +++ b/src/masternodeman.cpp @@ -459,6 +459,26 @@ CMasternode* CMasternodeMan::GetCurrentMasterNode(int mod, int64_t nBlockHeight, return winner; } +bool CMasternodeMan::IsPayeeAValidMasternode(CScript payee) +{ + if(!mnEnginePool.IsBlockchainSynced()) return true; + + int mnCount = 0; + bool fValid = false; + BOOST_FOREACH(CMasternode& mn, vMasternodes) { + + mn.Check(); + mnCount++; + if(!mn.IsEnabled()) continue; + + CScript currentMasternode = GetScriptForDestination(mn.pubkey.GetID()); + LogPrintf("* Masternode %d - testing %s\n", mnCount, currentMasternode.ToString().c_str()); + if(payee == currentMasternode) + fValid = true; + } + return fValid; +} + int CMasternodeMan::GetMasternodeRank(const CTxIn& vin, int64_t nBlockHeight, int minProtocol, bool fOnlyActive) { std::vector > vecMasternodeScores; diff --git a/src/masternodeman.h b/src/masternodeman.h index 60c2901e..ee226141 100644 --- a/src/masternodeman.h +++ b/src/masternodeman.h @@ -126,6 +126,8 @@ class CMasternodeMan // Get the current winner for this block CMasternode* GetCurrentMasterNode(int mod=1, int64_t nBlockHeight=0, int minProtocol=0); + bool IsPayeeAValidMasternode(CScript payee); + std::vector GetFullMasternodeVector() { Check(); return vMasternodes; } std::vector > GetMasternodeRanks(int64_t nBlockHeight, int minProtocol=0);