From cf6ef9b1f261d2249561ba3fbc7cbadd1cc0742c Mon Sep 17 00:00:00 2001 From: random-zebra Date: Sat, 12 Dec 2020 18:38:30 +0100 Subject: [PATCH 1/3] MN: pass lastPing to CMasternodeBroadcast constructor --- src/masternode.cpp | 7 ++++--- src/masternode.h | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/masternode.cpp b/src/masternode.cpp index 275b83e3713c..1efd69b19c78 100644 --- a/src/masternode.cpp +++ b/src/masternode.cpp @@ -206,7 +206,7 @@ CMasternodeBroadcast::CMasternodeBroadcast() : CMasternode() { } -CMasternodeBroadcast::CMasternodeBroadcast(CService newAddr, CTxIn newVin, CPubKey pubKeyCollateralAddressNew, CPubKey pubKeyMasternodeNew, int protocolVersionIn) : +CMasternodeBroadcast::CMasternodeBroadcast(CService newAddr, CTxIn newVin, CPubKey pubKeyCollateralAddressNew, CPubKey pubKeyMasternodeNew, int protocolVersionIn, const CMasternodePing& _lastPing) : CMasternode() { vin = newVin; @@ -214,6 +214,8 @@ CMasternodeBroadcast::CMasternodeBroadcast(CService newAddr, CTxIn newVin, CPubK pubKeyCollateralAddress = pubKeyCollateralAddressNew; pubKeyMasternode = pubKeyMasternodeNew; protocolVersion = protocolVersionIn; + lastPing = _lastPing; + sigTime = lastPing.sigTime; } CMasternodeBroadcast::CMasternodeBroadcast(const CMasternode& mn) : @@ -294,7 +296,7 @@ bool CMasternodeBroadcast::Create(const CTxIn& txin, return false; } - mnbRet = CMasternodeBroadcast(service, txin, pubKeyCollateralAddressNew, pubKeyMasternodeNew, PROTOCOL_VERSION); + mnbRet = CMasternodeBroadcast(service, txin, pubKeyCollateralAddressNew, pubKeyMasternodeNew, PROTOCOL_VERSION, mnp); if (!mnbRet.IsValidNetAddr()) { strErrorRet = strprintf("Invalid IP address %s, masternode=%s", mnbRet.addr.ToStringIP (), txin.prevout.hash.ToString()); @@ -303,7 +305,6 @@ bool CMasternodeBroadcast::Create(const CTxIn& txin, return false; } - mnbRet.lastPing = mnp; if (!mnbRet.Sign(keyCollateralAddressNew, pubKeyCollateralAddressNew)) { strErrorRet = strprintf("Failed to sign broadcast, masternode=%s", txin.prevout.hash.ToString()); LogPrint(BCLog::MASTERNODE,"CMasternodeBroadcast::Create -- %s\n", strErrorRet); diff --git a/src/masternode.h b/src/masternode.h index 2d3bf70a4466..b94d4b368a3e 100644 --- a/src/masternode.h +++ b/src/masternode.h @@ -268,7 +268,7 @@ class CMasternodeBroadcast : public CMasternode { public: CMasternodeBroadcast(); - CMasternodeBroadcast(CService newAddr, CTxIn newVin, CPubKey newPubkey, CPubKey newPubkey2, int protocolVersionIn); + CMasternodeBroadcast(CService newAddr, CTxIn newVin, CPubKey newPubkey, CPubKey newPubkey2, int protocolVersionIn, const CMasternodePing& _lastPing); CMasternodeBroadcast(const CMasternode& mn); bool CheckAndUpdate(int& nDoS); From ae86d5b4a6ab8a14cc998252fce449a9bca54306 Mon Sep 17 00:00:00 2001 From: random-zebra Date: Sun, 13 Dec 2020 16:57:43 +0100 Subject: [PATCH 2/3] MN: pass sigTime to CMasternodePing constructor --- src/activemasternode.cpp | 2 +- src/masternode.cpp | 10 +++++----- src/masternode.h | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/activemasternode.cpp b/src/activemasternode.cpp index b21271707be1..2c09db0b8880 100644 --- a/src/activemasternode.cpp +++ b/src/activemasternode.cpp @@ -177,7 +177,7 @@ bool CActiveMasternode::SendMasternodePing(std::string& errorMessage) LogPrintf("CActiveMasternode::SendMasternodePing() - Relay Masternode Ping vin = %s\n", vin->ToString()); const uint256& nBlockHash = mnodeman.GetBlockHashToPing(); - CMasternodePing mnp(*vin, nBlockHash); + CMasternodePing mnp(*vin, nBlockHash, GetAdjustedTime()); if (!mnp.Sign(privKeyMasternode, pubKeyMasternode)) { errorMessage = "Couldn't sign Masternode Ping"; return false; diff --git a/src/masternode.cpp b/src/masternode.cpp index 1efd69b19c78..be5da9b04d82 100644 --- a/src/masternode.cpp +++ b/src/masternode.cpp @@ -73,7 +73,7 @@ CMasternode::CMasternode() : addr = CService(); pubKeyCollateralAddress = CPubKey(); pubKeyMasternode = CPubKey(); - sigTime = GetAdjustedTime(); + sigTime = 0; lastPing = CMasternodePing(); protocolVersion = PROTOCOL_VERSION; nScanningErrorCount = 0; @@ -288,7 +288,7 @@ bool CMasternodeBroadcast::Create(const CTxIn& txin, // Get block hash to ping (TODO: move outside of this function) const uint256& nBlockHashToPing = mnodeman.GetBlockHashToPing(); - CMasternodePing mnp(txin, nBlockHashToPing); + CMasternodePing mnp(txin, nBlockHashToPing, GetAdjustedTime()); if (!mnp.Sign(keyMasternodeNew, pubKeyMasternodeNew)) { strErrorRet = strprintf("Failed to sign ping, masternode=%s", txin.prevout.hash.ToString()); LogPrint(BCLog::MASTERNODE,"CMasternodeBroadcast::Create -- %s\n", strErrorRet); @@ -564,14 +564,14 @@ CMasternodePing::CMasternodePing() : CSignedMessage(), vin(), blockHash(), - sigTime(GetAdjustedTime()) + sigTime(0) { } -CMasternodePing::CMasternodePing(const CTxIn& newVin, const uint256& nBlockHash) : +CMasternodePing::CMasternodePing(const CTxIn& newVin, const uint256& nBlockHash, uint64_t _sigTime) : CSignedMessage(), vin(newVin), blockHash(nBlockHash), - sigTime(GetAdjustedTime()) + sigTime(_sigTime) { } uint256 CMasternodePing::GetHash() const diff --git a/src/masternode.h b/src/masternode.h index b94d4b368a3e..3d242a775d2f 100644 --- a/src/masternode.h +++ b/src/masternode.h @@ -41,7 +41,7 @@ class CMasternodePing : public CSignedMessage int64_t sigTime; //mnb message times CMasternodePing(); - CMasternodePing(const CTxIn& newVin, const uint256& nBlockHash); + CMasternodePing(const CTxIn& newVin, const uint256& nBlockHash, uint64_t _sigTime); ADD_SERIALIZE_METHODS; From d2edcb7c59215bd4f17f517adc30849f09d301a3 Mon Sep 17 00:00:00 2001 From: random-zebra Date: Sun, 13 Dec 2020 17:00:19 +0100 Subject: [PATCH 3/3] Refactor: always check mnp blockhash in CMasternodePing::CheckAndUpdate --- src/masternode.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/masternode.cpp b/src/masternode.cpp index be5da9b04d82..f827e8b31dd3 100644 --- a/src/masternode.cpp +++ b/src/masternode.cpp @@ -602,6 +602,14 @@ bool CMasternodePing::CheckAndUpdate(int& nDos, bool fRequireAvailable, bool fCh return false; } + // Check if the ping block hash exists and it's within 24 blocks from the tip + if (!mnodeman.IsWithinDepth(blockHash, 2 * MNPING_DEPTH)) { + LogPrint(BCLog::MNPING,"%s: Masternode %s block hash %s is too old or has an invalid block hash\n", + __func__, vin.prevout.hash.ToString(), blockHash.ToString()); + nDos = 33; + return false; + } + // see if we have this Masternode CMasternode* pmn = mnodeman.Find(vin.prevout); const bool isMasternodeFound = (pmn != nullptr); @@ -633,14 +641,6 @@ bool CMasternodePing::CheckAndUpdate(int& nDos, bool fRequireAvailable, bool fCh return false; } - // Check if the ping block hash exists and it's within 24 blocks from the tip - if (!mnodeman.IsWithinDepth(blockHash, 2 * MNPING_DEPTH)) { - LogPrint(BCLog::MNPING,"%s: Masternode %s block hash %s is too old or has an invalid block hash\n", - __func__, vin.prevout.hash.ToString(), blockHash.ToString()); - nDos = 33; - return false; - } - // ping have passed the basic checks, can be updated now mnodeman.mapSeenMasternodePing.emplace(GetHash(), *this);