diff --git a/src/masternode-payments.cpp b/src/masternode-payments.cpp index a700e9e884745..a3231981b84e4 100644 --- a/src/masternode-payments.cpp +++ b/src/masternode-payments.cpp @@ -161,11 +161,11 @@ std::string CMasternodePaymentWinner::GetStrMessage() const return vinMasternode.prevout.ToStringShort() + std::to_string(nBlockHeight) + HexStr(payee); } -bool CMasternodePaymentWinner::IsValid(CNode* pnode, std::string& strError) +bool CMasternodePaymentWinner::IsValid(CNode* pnode, std::string& strError, int chainHeight) { int n = mnodeman.GetMasternodeRank(vinMasternode, nBlockHeight - 100); - - if (n < 1 || n > MNPAYMENTS_SIGNATURES_TOTAL) { + bool guard = Params().GetConsensus().NetworkUpgradeActive(chainHeight, Consensus::UPGRADE_V5_3); + if ((guard && n < 1) || n > MNPAYMENTS_SIGNATURES_TOTAL) { //It's common to have masternodes mistakenly think they are in the top 10 // We don't want to print all of these messages, or punish them unless they're way off if (n > MNPAYMENTS_SIGNATURES_TOTAL * 2) { @@ -176,6 +176,12 @@ bool CMasternodePaymentWinner::IsValid(CNode* pnode, std::string& strError) return false; } + // Must be a P2PKH + if (guard && !payee.IsPayToPublicKeyHash()) { + LogPrint(BCLog::MASTERNODE, "%s - payee must be a P2PKH\n", __func__); + return false; + } + return true; } @@ -219,9 +225,9 @@ bool IsBlockValueValid(int nHeight, CAmount& nExpectedValue, CAmount nMinted, CA } } - // !todo: remove after V6 enforcement and default it to true - const bool isV6UpgradeEnforced = consensus.NetworkUpgradeActive(nHeight, Consensus::UPGRADE_V6_0); - return (!isV6UpgradeEnforced || nMinted >= 0) && nMinted <= nExpectedValue; + // !todo: remove after V5.3 enforcement and default it to true + const bool isUpgradeEnforced = consensus.NetworkUpgradeActive(nHeight, Consensus::UPGRADE_V5_3); + return (!isUpgradeEnforced || nMinted >= 0) && nMinted <= nExpectedValue; } bool IsBlockPayeeValid(const CBlock& block, const CBlockIndex* pindexPrev) @@ -326,7 +332,7 @@ bool CMasternodePayments::GetLegacyMasternodeTxOut(int nHeight, std::vector sigTime) { // TODO: lock cs. Need to be careful as mnb.lastPing.CheckAndUpdate locks cs_main internally. @@ -147,7 +154,7 @@ bool CMasternode::UpdateFromNewBroadcast(CMasternodeBroadcast& mnb) protocolVersion = mnb.protocolVersion; addr = mnb.addr; int nDoS = 0; - if (mnb.lastPing.IsNull() || (!mnb.lastPing.IsNull() && mnb.lastPing.CheckAndUpdate(nDoS, false))) { + if (mnb.lastPing.IsNull() || (!mnb.lastPing.IsNull() && mnb.lastPing.CheckAndUpdate(nDoS, chainHeight, false))) { lastPing = mnb.lastPing; mnodeman.mapSeenMasternodePing.emplace(lastPing.GetHash(), lastPing); } @@ -393,10 +400,10 @@ bool CMasternodeBroadcast::CheckDefaultPort(CService service, std::string& strEr return true; } -bool CMasternodeBroadcast::CheckAndUpdate(int& nDos) +bool CMasternodeBroadcast::CheckAndUpdate(int& nDos, int nChainHeight) { // make sure signature isn't in the future (past is OK) - if (sigTime > GetAdjustedTime() + 60 * 60) { + if (sigTime > GetMaxTimeWindow(nChainHeight)) { LogPrint(BCLog::MASTERNODE,"mnb - Signature rejected, too far into the future %s\n", vin.prevout.hash.ToString()); nDos = 1; return false; @@ -444,7 +451,7 @@ bool CMasternodeBroadcast::CheckAndUpdate(int& nDos) return false; // incorrect ping or its sigTime - if(lastPing.IsNull() || !lastPing.CheckAndUpdate(nDos, false, true)) { + if(lastPing.IsNull() || !lastPing.CheckAndUpdate(nDos, nChainHeight, false, true)) { return false; } @@ -470,7 +477,7 @@ bool CMasternodeBroadcast::CheckAndUpdate(int& nDos) if (pmn->pubKeyCollateralAddress == pubKeyCollateralAddress && !pmn->IsBroadcastedWithin(MasternodeBroadcastSeconds())) { //take the newest entry LogPrint(BCLog::MASTERNODE,"mnb - Got updated entry for %s\n", vin.prevout.hash.ToString()); - if (pmn->UpdateFromNewBroadcast((*this))) { + if (pmn->UpdateFromNewBroadcast((*this), nChainHeight)) { if (pmn->IsEnabled()) Relay(); } masternodeSync.AddedMasternodeList(GetHash()); @@ -491,7 +498,7 @@ bool CMasternodeBroadcast::CheckInputsAndAdd(int nChainHeight, int& nDoS) } // incorrect ping or its sigTime - if(lastPing.IsNull() || !lastPing.CheckAndUpdate(nDoS, false, true)) { + if(lastPing.IsNull() || !lastPing.CheckAndUpdate(nDoS, nChainHeight, false, true)) { return false; } @@ -589,9 +596,9 @@ std::string CMasternodePing::GetStrMessage() const return vin.ToString() + blockHash.ToString() + std::to_string(sigTime); } -bool CMasternodePing::CheckAndUpdate(int& nDos, bool fRequireAvailable, bool fCheckSigTimeOnly) +bool CMasternodePing::CheckAndUpdate(int& nDos, int nChainHeight, bool fRequireAvailable, bool fCheckSigTimeOnly) { - if (sigTime > GetAdjustedTime() + 60 * 60) { + if (sigTime > GetMaxTimeWindow(nChainHeight)) { LogPrint(BCLog::MNPING,"%s: Signature rejected, too far into the future %s\n", __func__, vin.prevout.hash.ToString()); nDos = 30; return false; diff --git a/src/masternode.h b/src/masternode.h index 8dc5812b88f5e..0e717a10ae384 100644 --- a/src/masternode.h +++ b/src/masternode.h @@ -58,7 +58,7 @@ class CMasternodePing : public CSignedMessage const CTxIn GetVin() const { return vin; }; bool IsNull() const { return blockHash.IsNull() || vin.prevout.IsNull(); } - bool CheckAndUpdate(int& nDos, bool fRequireAvailable = true, bool fCheckSigTimeOnly = false); + bool CheckAndUpdate(int& nDos, int nChainHeight, bool fRequireAvailable = true, bool fCheckSigTimeOnly = false); void Relay(); CMasternodePing& operator=(const CMasternodePing& other) = default; @@ -156,7 +156,7 @@ class CMasternode : public CSignedMessage Unserialize(s); } - bool UpdateFromNewBroadcast(CMasternodeBroadcast& mnb); + bool UpdateFromNewBroadcast(CMasternodeBroadcast& mnb, int chainHeight); CMasternode::state GetActiveState() const; @@ -243,7 +243,7 @@ class CMasternodeBroadcast : public CMasternode CMasternodeBroadcast(CService newAddr, CTxIn newVin, CPubKey newPubkey, CPubKey newPubkey2, int protocolVersionIn, const CMasternodePing& _lastPing); CMasternodeBroadcast(const CMasternode& mn); - bool CheckAndUpdate(int& nDoS); + bool CheckAndUpdate(int& nDoS, int nChainHeight); bool CheckInputsAndAdd(int chainHeight, int& nDos); uint256 GetHash() const; diff --git a/src/masternodeman.cpp b/src/masternodeman.cpp index 441d44695c142..8fd10a466eb33 100644 --- a/src/masternodeman.cpp +++ b/src/masternodeman.cpp @@ -713,7 +713,7 @@ int CMasternodeMan::ProcessMNBroadcast(CNode* pfrom, CMasternodeBroadcast& mnb) } int nDoS = 0; - if (!mnb.CheckAndUpdate(nDoS)) { + if (!mnb.CheckAndUpdate(nDoS, GetBestHeight())) { return nDoS; } @@ -747,7 +747,7 @@ int CMasternodeMan::ProcessMNPing(CNode* pfrom, CMasternodePing& mnp) if (mapSeenMasternodePing.count(mnpHash)) return 0; //seen int nDoS = 0; - if (mnp.CheckAndUpdate(nDoS)) return 0; + if (mnp.CheckAndUpdate(nDoS, GetBestHeight())) return 0; if (nDoS > 0) { // if anything significant failed, mark that node @@ -894,7 +894,7 @@ void CMasternodeMan::UpdateMasternodeList(CMasternodeBroadcast& mnb) CMasternode mn(mnb); Add(mn); } else { - pmn->UpdateFromNewBroadcast(mnb); + pmn->UpdateFromNewBroadcast(mnb, GetBestHeight()); } } diff --git a/src/test/budget_tests.cpp b/src/test/budget_tests.cpp index 076b183a4fff0..b8044d89d8b2c 100644 --- a/src/test/budget_tests.cpp +++ b/src/test/budget_tests.cpp @@ -136,7 +136,7 @@ BOOST_FIXTURE_TEST_CASE(block_value_undermint, RegTestingSetup) CAmount nBudgetAmtRet = 0; // under-minting blocks are invalid after v6 BOOST_CHECK(IsBlockValueValid(nHeight, nExpectedRet, -1, nBudgetAmtRet)); - UpdateNetworkUpgradeParameters(Consensus::UPGRADE_V6_0, Consensus::NetworkUpgrade::ALWAYS_ACTIVE); + UpdateNetworkUpgradeParameters(Consensus::UPGRADE_V5_3, Consensus::NetworkUpgrade::ALWAYS_ACTIVE); BOOST_CHECK(!IsBlockValueValid(nHeight, nExpectedRet, -1, nBudgetAmtRet)); }