diff --git a/src/dsnotificationinterface.cpp b/src/dsnotificationinterface.cpp index 3c1857df23486..b9685e2ca0e00 100644 --- a/src/dsnotificationinterface.cpp +++ b/src/dsnotificationinterface.cpp @@ -81,9 +81,9 @@ void CDSNotificationInterface::SyncTransaction(const CTransaction &tx, const CBl CPrivateSend::SyncTransaction(tx, pindex, posInBlock); } -void CDSNotificationInterface::NotifyMasternodeListChanged(const CDeterministicMNList& newList) +void CDSNotificationInterface::NotifyMasternodeListChanged(bool undo, const CDeterministicMNList& oldMNList, const CDeterministicMNListDiff& diff) { - CMNAuth::NotifyMasternodeListChanged(newList); + CMNAuth::NotifyMasternodeListChanged(undo, oldMNList, diff); governance.CheckMasternodeOrphanObjects(connman); governance.CheckMasternodeOrphanVotes(connman); governance.UpdateCachesAndClean(); diff --git a/src/dsnotificationinterface.h b/src/dsnotificationinterface.h index 1dc83f7d085e2..06a8c9ff070ab 100644 --- a/src/dsnotificationinterface.h +++ b/src/dsnotificationinterface.h @@ -22,7 +22,7 @@ class CDSNotificationInterface : public CValidationInterface void NotifyHeaderTip(const CBlockIndex *pindexNew, bool fInitialDownload) override; void UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlockIndex *pindexFork, bool fInitialDownload) override; void SyncTransaction(const CTransaction &tx, const CBlockIndex *pindex, int posInBlock) override; - void NotifyMasternodeListChanged(const CDeterministicMNList& newList) override; + void NotifyMasternodeListChanged(bool undo, const CDeterministicMNList& oldMNList, const CDeterministicMNListDiff& diff) override; void NotifyChainLock(const CBlockIndex* pindex) override; private: diff --git a/src/evo/deterministicmns.cpp b/src/evo/deterministicmns.cpp index 66f87790e831f..a37b2d680f5ae 100644 --- a/src/evo/deterministicmns.cpp +++ b/src/evo/deterministicmns.cpp @@ -498,7 +498,7 @@ bool CDeterministicMNManager::ProcessBlock(const CBlock& block, const CBlockInde // Don't hold cs while calling signals if (!diff.addedMNs.empty() || !diff.removedMns.empty()) { - GetMainSignals().NotifyMasternodeListChanged(newList); + GetMainSignals().NotifyMasternodeListChanged(false, oldList, diff); } const auto& consensusParams = Params().GetConsensus(); @@ -522,11 +522,19 @@ bool CDeterministicMNManager::UndoBlock(const CBlock& block, const CBlockIndex* int nHeight = pindex->nHeight; uint256 blockHash = block.GetHash(); + CDeterministicMNList curList; + CDeterministicMNList prevList; CDeterministicMNListDiff diff; { LOCK(cs); evoDb.Read(std::make_pair(DB_LIST_DIFF, blockHash), diff); + if (diff.HasChanges()) { + // need to call this before erasing + curList = GetListForBlock(blockHash); + prevList = GetListForBlock(pindex->pprev->GetBlockHash()); + } + evoDb.Erase(std::make_pair(DB_LIST_DIFF, blockHash)); evoDb.Erase(std::make_pair(DB_LIST_SNAPSHOT, blockHash)); @@ -534,8 +542,8 @@ bool CDeterministicMNManager::UndoBlock(const CBlock& block, const CBlockIndex* } if (!diff.addedMNs.empty() || !diff.removedMns.empty()) { - auto prevList = GetListForBlock(pindex->pprev->GetBlockHash()); - GetMainSignals().NotifyMasternodeListChanged(prevList); + auto inversedDiff = curList.BuildDiff(prevList); + GetMainSignals().NotifyMasternodeListChanged(true, curList, inversedDiff); } const auto& consensusParams = Params().GetConsensus(); diff --git a/src/validationinterface.cpp b/src/validationinterface.cpp index dc928f1b428b6..a9f8483955083 100644 --- a/src/validationinterface.cpp +++ b/src/validationinterface.cpp @@ -30,7 +30,7 @@ void RegisterValidationInterface(CValidationInterface* pwalletIn) { g_signals.NotifyGovernanceObject.connect(boost::bind(&CValidationInterface::NotifyGovernanceObject, pwalletIn, _1)); g_signals.NotifyGovernanceVote.connect(boost::bind(&CValidationInterface::NotifyGovernanceVote, pwalletIn, _1)); g_signals.NotifyInstantSendDoubleSpendAttempt.connect(boost::bind(&CValidationInterface::NotifyInstantSendDoubleSpendAttempt, pwalletIn, _1, _2)); - g_signals.NotifyMasternodeListChanged.connect(boost::bind(&CValidationInterface::NotifyMasternodeListChanged, pwalletIn, _1)); + g_signals.NotifyMasternodeListChanged.connect(boost::bind(&CValidationInterface::NotifyMasternodeListChanged, pwalletIn, _1, _2, _3)); } void UnregisterValidationInterface(CValidationInterface* pwalletIn) { @@ -51,7 +51,7 @@ void UnregisterValidationInterface(CValidationInterface* pwalletIn) { g_signals.NotifyGovernanceObject.disconnect(boost::bind(&CValidationInterface::NotifyGovernanceObject, pwalletIn, _1)); g_signals.NotifyGovernanceVote.disconnect(boost::bind(&CValidationInterface::NotifyGovernanceVote, pwalletIn, _1)); g_signals.NotifyInstantSendDoubleSpendAttempt.disconnect(boost::bind(&CValidationInterface::NotifyInstantSendDoubleSpendAttempt, pwalletIn, _1, _2)); - g_signals.NotifyMasternodeListChanged.disconnect(boost::bind(&CValidationInterface::NotifyMasternodeListChanged, pwalletIn, _1)); + g_signals.NotifyMasternodeListChanged.disconnect(boost::bind(&CValidationInterface::NotifyMasternodeListChanged, pwalletIn, _1, _2, _3)); } void UnregisterAllValidationInterfaces() { diff --git a/src/validationinterface.h b/src/validationinterface.h index 5ad8e6ac773b1..f4ac971bad8e7 100644 --- a/src/validationinterface.h +++ b/src/validationinterface.h @@ -21,6 +21,7 @@ class CValidationState; class CGovernanceVote; class CGovernanceObject; class CDeterministicMNList; +class CDeterministicMNListDiff; class uint256; // These functions dispatch to one or all registered wallets @@ -43,7 +44,7 @@ class CValidationInterface { virtual void NotifyGovernanceVote(const CGovernanceVote &vote) {} virtual void NotifyGovernanceObject(const CGovernanceObject &object) {} virtual void NotifyInstantSendDoubleSpendAttempt(const CTransaction ¤tTx, const CTransaction &previousTx) {} - virtual void NotifyMasternodeListChanged(const CDeterministicMNList& newList) {} + virtual void NotifyMasternodeListChanged(bool undo, const CDeterministicMNList& oldMNList, const CDeterministicMNListDiff& diff) {} virtual void SetBestChain(const CBlockLocator &locator) {} virtual bool UpdatedTransaction(const uint256 &hash) { return false;} virtual void Inventory(const uint256 &hash) {} @@ -86,7 +87,7 @@ struct CMainSignals { /** Notifies listeners of a attempted InstantSend double spend*/ boost::signals2::signal NotifyInstantSendDoubleSpendAttempt; /** Notifies listeners that the MN list changed */ - boost::signals2::signal NotifyMasternodeListChanged; + boost::signals2::signal NotifyMasternodeListChanged; /** Notifies listeners of an updated transaction without new data (for now: a coinbase potentially becoming visible). */ boost::signals2::signal UpdatedTransaction; /** Notifies listeners of a new active block chain. */