mirror of
https://github.com/dashpay/dash.git
synced 2024-12-25 03:52:49 +01:00
fix: should not notify about mnlist changes while ConnectBlock isn't done yet (#5711)
## Issue being fixed or feature implemented `ConnectBlock` can fail after `ProcessSpecialTxsInBlock`, we shouldn't be notifying too early. Same for `DisconnectBlock` but that's less of an issue imo. ## What was done? Move notifications to the end of `ConnectBlock`/`DisconnectBlock`. There is no `connman` in `CChainState` and I don't want to pass it in updates struct so I changed `NotifyMasternodeListChanged` and used `connman` from `CDSNotificationInterface` instead. ## How Has This Been Tested? run unit test, run testnet qt wallet ## Breaking Changes ## Checklist: - [x] I have performed a self-review of my own code - [ ] I have commented my code, particularly in hard-to-understand areas - [ ] I have added or updated relevant unit/integration/functional/e2e tests - [ ] I have made corresponding changes to the documentation - [x] I have assigned this pull request to a milestone _(for repository code-owners and collaborators only)_
This commit is contained in:
parent
259ad319d9
commit
c49628de54
@ -118,7 +118,7 @@ void CDSNotificationInterface::BlockDisconnected(const std::shared_ptr<const CBl
|
|||||||
CCoinJoin::BlockDisconnected(pblock, pindexDisconnected);
|
CCoinJoin::BlockDisconnected(pblock, pindexDisconnected);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CDSNotificationInterface::NotifyMasternodeListChanged(bool undo, const CDeterministicMNList& oldMNList, const CDeterministicMNListDiff& diff, CConnman& connman)
|
void CDSNotificationInterface::NotifyMasternodeListChanged(bool undo, const CDeterministicMNList& oldMNList, const CDeterministicMNListDiff& diff)
|
||||||
{
|
{
|
||||||
CMNAuth::NotifyMasternodeListChanged(undo, oldMNList, diff, connman);
|
CMNAuth::NotifyMasternodeListChanged(undo, oldMNList, diff, connman);
|
||||||
govman.UpdateCachesAndClean();
|
govman.UpdateCachesAndClean();
|
||||||
|
@ -36,7 +36,7 @@ protected:
|
|||||||
void TransactionRemovedFromMempool(const CTransactionRef& ptx, MemPoolRemovalReason reason) override;
|
void TransactionRemovedFromMempool(const CTransactionRef& ptx, MemPoolRemovalReason reason) override;
|
||||||
void BlockConnected(const std::shared_ptr<const CBlock>& pblock, const CBlockIndex* pindex) override;
|
void BlockConnected(const std::shared_ptr<const CBlock>& pblock, const CBlockIndex* pindex) override;
|
||||||
void BlockDisconnected(const std::shared_ptr<const CBlock>& pblock, const CBlockIndex* pindexDisconnected) override;
|
void BlockDisconnected(const std::shared_ptr<const CBlock>& pblock, const CBlockIndex* pindexDisconnected) override;
|
||||||
void NotifyMasternodeListChanged(bool undo, const CDeterministicMNList& oldMNList, const CDeterministicMNListDiff& diff, CConnman& connman) override;
|
void NotifyMasternodeListChanged(bool undo, const CDeterministicMNList& oldMNList, const CDeterministicMNListDiff& diff) override;
|
||||||
void NotifyChainLock(const CBlockIndex* pindex, const std::shared_ptr<const llmq::CChainLockSig>& clsig) override;
|
void NotifyChainLock(const CBlockIndex* pindex, const std::shared_ptr<const llmq::CChainLockSig>& clsig) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -594,7 +594,7 @@ void CDeterministicMNList::RemoveMN(const uint256& proTxHash)
|
|||||||
mnInternalIdMap = mnInternalIdMap.erase(dmn->GetInternalId());
|
mnInternalIdMap = mnInternalIdMap.erase(dmn->GetInternalId());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CDeterministicMNManager::ProcessBlock(const CBlock& block, gsl::not_null<const CBlockIndex*> pindex, BlockValidationState& state, const CCoinsViewCache& view, bool fJustCheck)
|
bool CDeterministicMNManager::ProcessBlock(const CBlock& block, gsl::not_null<const CBlockIndex*> pindex, BlockValidationState& state, const CCoinsViewCache& view, bool fJustCheck, std::optional<MNListUpdates>& updatesRet)
|
||||||
{
|
{
|
||||||
AssertLockHeld(cs_main);
|
AssertLockHeld(cs_main);
|
||||||
|
|
||||||
@ -641,10 +641,8 @@ bool CDeterministicMNManager::ProcessBlock(const CBlock& block, gsl::not_null<co
|
|||||||
return state.Invalid(BlockValidationResult::BLOCK_CONSENSUS, "failed-dmn-block");
|
return state.Invalid(BlockValidationResult::BLOCK_CONSENSUS, "failed-dmn-block");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Don't hold cs while calling signals
|
|
||||||
if (diff.HasChanges()) {
|
if (diff.HasChanges()) {
|
||||||
GetMainSignals().NotifyMasternodeListChanged(false, oldList, diff, connman);
|
updatesRet = {newList, oldList, diff};
|
||||||
uiInterface.NotifyMasternodeListChanged(newList, pindex);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nHeight == consensusParams.DIP0003EnforcementHeight) {
|
if (nHeight == consensusParams.DIP0003EnforcementHeight) {
|
||||||
@ -660,7 +658,7 @@ bool CDeterministicMNManager::ProcessBlock(const CBlock& block, gsl::not_null<co
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CDeterministicMNManager::UndoBlock(gsl::not_null<const CBlockIndex*> pindex)
|
bool CDeterministicMNManager::UndoBlock(gsl::not_null<const CBlockIndex*> pindex, std::optional<MNListUpdates>& updatesRet)
|
||||||
{
|
{
|
||||||
int nHeight = pindex->nHeight;
|
int nHeight = pindex->nHeight;
|
||||||
uint256 blockHash = pindex->GetBlockHash();
|
uint256 blockHash = pindex->GetBlockHash();
|
||||||
@ -684,8 +682,7 @@ bool CDeterministicMNManager::UndoBlock(gsl::not_null<const CBlockIndex*> pindex
|
|||||||
|
|
||||||
if (diff.HasChanges()) {
|
if (diff.HasChanges()) {
|
||||||
auto inversedDiff = curList.BuildDiff(prevList);
|
auto inversedDiff = curList.BuildDiff(prevList);
|
||||||
GetMainSignals().NotifyMasternodeListChanged(true, curList, inversedDiff, connman);
|
updatesRet = {curList, prevList, inversedDiff};
|
||||||
uiInterface.NotifyMasternodeListChanged(prevList, pindex->pprev);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto& consensusParams = Params().GetConsensus();
|
const auto& consensusParams = Params().GetConsensus();
|
||||||
|
@ -565,6 +565,13 @@ constexpr int llmq_max_blocks() {
|
|||||||
return max_blocks;
|
return max_blocks;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct MNListUpdates
|
||||||
|
{
|
||||||
|
CDeterministicMNList old_list;
|
||||||
|
CDeterministicMNList new_list;
|
||||||
|
CDeterministicMNListDiff diff;
|
||||||
|
};
|
||||||
|
|
||||||
class CDeterministicMNManager
|
class CDeterministicMNManager
|
||||||
{
|
{
|
||||||
static constexpr int DISK_SNAPSHOT_PERIOD = 576; // once per day
|
static constexpr int DISK_SNAPSHOT_PERIOD = 576; // once per day
|
||||||
@ -596,8 +603,8 @@ public:
|
|||||||
~CDeterministicMNManager() = default;
|
~CDeterministicMNManager() = default;
|
||||||
|
|
||||||
bool ProcessBlock(const CBlock& block, gsl::not_null<const CBlockIndex*> pindex, BlockValidationState& state,
|
bool ProcessBlock(const CBlock& block, gsl::not_null<const CBlockIndex*> pindex, BlockValidationState& state,
|
||||||
const CCoinsViewCache& view, bool fJustCheck) EXCLUSIVE_LOCKS_REQUIRED(cs_main) LOCKS_EXCLUDED(cs);
|
const CCoinsViewCache& view, bool fJustCheck, std::optional<MNListUpdates>& updatesRet) EXCLUSIVE_LOCKS_REQUIRED(cs_main) LOCKS_EXCLUDED(cs);
|
||||||
bool UndoBlock(gsl::not_null<const CBlockIndex*> pindex) LOCKS_EXCLUDED(cs);
|
bool UndoBlock(gsl::not_null<const CBlockIndex*> pindex, std::optional<MNListUpdates>& updatesRet) LOCKS_EXCLUDED(cs);
|
||||||
|
|
||||||
void UpdatedBlockTip(gsl::not_null<const CBlockIndex*> pindex) LOCKS_EXCLUDED(cs);
|
void UpdatedBlockTip(gsl::not_null<const CBlockIndex*> pindex) LOCKS_EXCLUDED(cs);
|
||||||
|
|
||||||
|
@ -133,7 +133,7 @@ static bool UndoSpecialTx(const CTransaction& tx, const CBlockIndex* pindex)
|
|||||||
bool ProcessSpecialTxsInBlock(const CBlock& block, const CBlockIndex* pindex, CMNHFManager& mnhfManager,
|
bool ProcessSpecialTxsInBlock(const CBlock& block, const CBlockIndex* pindex, CMNHFManager& mnhfManager,
|
||||||
llmq::CQuorumBlockProcessor& quorum_block_processor, const llmq::CChainLocksHandler& chainlock_handler,
|
llmq::CQuorumBlockProcessor& quorum_block_processor, const llmq::CChainLocksHandler& chainlock_handler,
|
||||||
const Consensus::Params& consensusParams, const CCoinsViewCache& view, bool fJustCheck, bool fCheckCbTxMerleRoots,
|
const Consensus::Params& consensusParams, const CCoinsViewCache& view, bool fJustCheck, bool fCheckCbTxMerleRoots,
|
||||||
BlockValidationState& state)
|
BlockValidationState& state, std::optional<MNListUpdates>& updatesRet)
|
||||||
{
|
{
|
||||||
AssertLockHeld(cs_main);
|
AssertLockHeld(cs_main);
|
||||||
|
|
||||||
@ -181,7 +181,7 @@ bool ProcessSpecialTxsInBlock(const CBlock& block, const CBlockIndex* pindex, CM
|
|||||||
nTimeQuorum += nTime3 - nTime2;
|
nTimeQuorum += nTime3 - nTime2;
|
||||||
LogPrint(BCLog::BENCHMARK, " - quorumBlockProcessor: %.2fms [%.2fs]\n", 0.001 * (nTime3 - nTime2), nTimeQuorum * 0.000001);
|
LogPrint(BCLog::BENCHMARK, " - quorumBlockProcessor: %.2fms [%.2fs]\n", 0.001 * (nTime3 - nTime2), nTimeQuorum * 0.000001);
|
||||||
|
|
||||||
if (!deterministicMNManager->ProcessBlock(block, pindex, state, view, fJustCheck)) {
|
if (!deterministicMNManager->ProcessBlock(block, pindex, state, view, fJustCheck, updatesRet)) {
|
||||||
// pass the state returned by the function above
|
// pass the state returned by the function above
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -231,7 +231,7 @@ bool ProcessSpecialTxsInBlock(const CBlock& block, const CBlockIndex* pindex, CM
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool UndoSpecialTxsInBlock(const CBlock& block, const CBlockIndex* pindex, CMNHFManager& mnhfManager, llmq::CQuorumBlockProcessor& quorum_block_processor)
|
bool UndoSpecialTxsInBlock(const CBlock& block, const CBlockIndex* pindex, CMNHFManager& mnhfManager, llmq::CQuorumBlockProcessor& quorum_block_processor, std::optional<MNListUpdates>& updatesRet)
|
||||||
{
|
{
|
||||||
AssertLockHeld(cs_main);
|
AssertLockHeld(cs_main);
|
||||||
|
|
||||||
@ -256,7 +256,7 @@ bool UndoSpecialTxsInBlock(const CBlock& block, const CBlockIndex* pindex, CMNHF
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!deterministicMNManager->UndoBlock(pindex)) {
|
if (!deterministicMNManager->UndoBlock(pindex, updatesRet)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,12 +9,15 @@
|
|||||||
#include <sync.h>
|
#include <sync.h>
|
||||||
#include <threadsafety.h>
|
#include <threadsafety.h>
|
||||||
|
|
||||||
|
#include <optional>
|
||||||
|
|
||||||
class BlockValidationState;
|
class BlockValidationState;
|
||||||
class CBlock;
|
class CBlock;
|
||||||
class CBlockIndex;
|
class CBlockIndex;
|
||||||
class CCoinsViewCache;
|
class CCoinsViewCache;
|
||||||
class CMNHFManager;
|
class CMNHFManager;
|
||||||
class TxValidationState;
|
class TxValidationState;
|
||||||
|
struct MNListUpdates;
|
||||||
namespace llmq {
|
namespace llmq {
|
||||||
class CQuorumBlockProcessor;
|
class CQuorumBlockProcessor;
|
||||||
class CChainLocksHandler;
|
class CChainLocksHandler;
|
||||||
@ -30,9 +33,9 @@ bool CheckSpecialTx(const CTransaction& tx, const CBlockIndex* pindexPrev, const
|
|||||||
bool ProcessSpecialTxsInBlock(const CBlock& block, const CBlockIndex* pindex, CMNHFManager& mnhfManager,
|
bool ProcessSpecialTxsInBlock(const CBlock& block, const CBlockIndex* pindex, CMNHFManager& mnhfManager,
|
||||||
llmq::CQuorumBlockProcessor& quorum_block_processor, const llmq::CChainLocksHandler& chainlock_handler,
|
llmq::CQuorumBlockProcessor& quorum_block_processor, const llmq::CChainLocksHandler& chainlock_handler,
|
||||||
const Consensus::Params& consensusParams, const CCoinsViewCache& view, bool fJustCheck, bool fCheckCbTxMerleRoots,
|
const Consensus::Params& consensusParams, const CCoinsViewCache& view, bool fJustCheck, bool fCheckCbTxMerleRoots,
|
||||||
BlockValidationState& state) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
|
BlockValidationState& state, std::optional<MNListUpdates>& updatesRet) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
|
||||||
bool UndoSpecialTxsInBlock(const CBlock& block, const CBlockIndex* pindex, CMNHFManager& mnhfManager,
|
bool UndoSpecialTxsInBlock(const CBlock& block, const CBlockIndex* pindex, CMNHFManager& mnhfManager,
|
||||||
llmq::CQuorumBlockProcessor& quorum_block_processor) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
|
llmq::CQuorumBlockProcessor& quorum_block_processor, std::optional<MNListUpdates>& updatesRet) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
|
||||||
bool CheckCreditPoolDiffForBlock(const CBlock& block, const CBlockIndex* pindex, const Consensus::Params& consensusParams,
|
bool CheckCreditPoolDiffForBlock(const CBlock& block, const CBlockIndex* pindex, const Consensus::Params& consensusParams,
|
||||||
const CAmount blockSubsidy, BlockValidationState& state);
|
const CAmount blockSubsidy, BlockValidationState& state);
|
||||||
|
|
||||||
|
@ -52,6 +52,7 @@
|
|||||||
#include <masternode/payments.h>
|
#include <masternode/payments.h>
|
||||||
#include <masternode/sync.h>
|
#include <masternode/sync.h>
|
||||||
|
|
||||||
|
#include <evo/deterministicmns.h>
|
||||||
#include <evo/evodb.h>
|
#include <evo/evodb.h>
|
||||||
#include <evo/mnhftx.h>
|
#include <evo/mnhftx.h>
|
||||||
#include <evo/specialtx.h>
|
#include <evo/specialtx.h>
|
||||||
@ -1731,7 +1732,8 @@ DisconnectResult CChainState::DisconnectBlock(const CBlock& block, const CBlockI
|
|||||||
std::vector<std::pair<CAddressUnspentKey, CAddressUnspentValue> > addressUnspentIndex;
|
std::vector<std::pair<CAddressUnspentKey, CAddressUnspentValue> > addressUnspentIndex;
|
||||||
std::vector<std::pair<CSpentIndexKey, CSpentIndexValue> > spentIndex;
|
std::vector<std::pair<CSpentIndexKey, CSpentIndexValue> > spentIndex;
|
||||||
|
|
||||||
if (!UndoSpecialTxsInBlock(block, pindex, m_mnhfManager, *m_quorum_block_processor)) {
|
std::optional<MNListUpdates> mnlist_updates_opt{std::nullopt};
|
||||||
|
if (!UndoSpecialTxsInBlock(block, pindex, m_mnhfManager, *m_quorum_block_processor, mnlist_updates_opt)) {
|
||||||
error("DisconnectBlock(): UndoSpecialTxsInBlock failed");
|
error("DisconnectBlock(): UndoSpecialTxsInBlock failed");
|
||||||
return DISCONNECT_FAILED;
|
return DISCONNECT_FAILED;
|
||||||
}
|
}
|
||||||
@ -1847,6 +1849,12 @@ DisconnectResult CChainState::DisconnectBlock(const CBlock& block, const CBlockI
|
|||||||
view.SetBestBlock(pindex->pprev->GetBlockHash());
|
view.SetBestBlock(pindex->pprev->GetBlockHash());
|
||||||
m_evoDb.WriteBestBlock(pindex->pprev->GetBlockHash());
|
m_evoDb.WriteBestBlock(pindex->pprev->GetBlockHash());
|
||||||
|
|
||||||
|
if (mnlist_updates_opt.has_value()) {
|
||||||
|
auto mnlu = mnlist_updates_opt.value();
|
||||||
|
GetMainSignals().NotifyMasternodeListChanged(true, mnlu.old_list, mnlu.diff);
|
||||||
|
uiInterface.NotifyMasternodeListChanged(mnlu.new_list, pindex->pprev);
|
||||||
|
}
|
||||||
|
|
||||||
auto finish = Now<SteadyMilliseconds>();
|
auto finish = Now<SteadyMilliseconds>();
|
||||||
auto diff = finish - start;
|
auto diff = finish - start;
|
||||||
statsClient.timing("DisconnectBlock_ms", count_milliseconds(diff), 1.0f);
|
statsClient.timing("DisconnectBlock_ms", count_milliseconds(diff), 1.0f);
|
||||||
@ -2210,7 +2218,8 @@ bool CChainState::ConnectBlock(const CBlock& block, BlockValidationState& state,
|
|||||||
bool fDIP0001Active_context = pindex->nHeight >= Params().GetConsensus().DIP0001Height;
|
bool fDIP0001Active_context = pindex->nHeight >= Params().GetConsensus().DIP0001Height;
|
||||||
|
|
||||||
// MUST process special txes before updating UTXO to ensure consistency between mempool and block processing
|
// MUST process special txes before updating UTXO to ensure consistency between mempool and block processing
|
||||||
if (!ProcessSpecialTxsInBlock(block, pindex, m_mnhfManager, *m_quorum_block_processor, *m_clhandler, m_params.GetConsensus(), view, fJustCheck, fScriptChecks, state)) {
|
std::optional<MNListUpdates> mnlist_updates_opt{std::nullopt};
|
||||||
|
if (!ProcessSpecialTxsInBlock(block, pindex, m_mnhfManager, *m_quorum_block_processor, *m_clhandler, m_params.GetConsensus(), view, fJustCheck, fScriptChecks, state, mnlist_updates_opt)) {
|
||||||
return error("ConnectBlock(DASH): ProcessSpecialTxsInBlock for block %s failed with %s",
|
return error("ConnectBlock(DASH): ProcessSpecialTxsInBlock for block %s failed with %s",
|
||||||
pindex->GetBlockHash().ToString(), state.ToString());
|
pindex->GetBlockHash().ToString(), state.ToString());
|
||||||
}
|
}
|
||||||
@ -2470,6 +2479,12 @@ bool CChainState::ConnectBlock(const CBlock& block, BlockValidationState& state,
|
|||||||
view.SetBestBlock(pindex->GetBlockHash());
|
view.SetBestBlock(pindex->GetBlockHash());
|
||||||
m_evoDb.WriteBestBlock(pindex->GetBlockHash());
|
m_evoDb.WriteBestBlock(pindex->GetBlockHash());
|
||||||
|
|
||||||
|
if (mnlist_updates_opt.has_value()) {
|
||||||
|
auto mnlu = mnlist_updates_opt.value();
|
||||||
|
GetMainSignals().NotifyMasternodeListChanged(false, mnlu.old_list, mnlu.diff);
|
||||||
|
uiInterface.NotifyMasternodeListChanged(mnlu.new_list, pindex);
|
||||||
|
}
|
||||||
|
|
||||||
int64_t nTime8 = GetTimeMicros(); nTimeCallbacks += nTime8 - nTime5;
|
int64_t nTime8 = GetTimeMicros(); nTimeCallbacks += nTime8 - nTime5;
|
||||||
LogPrint(BCLog::BENCHMARK, " - Callbacks: %.2fms [%.2fs (%.2fms/blk)]\n", MILLI * (nTime8 - nTime5), nTimeCallbacks * MICRO, nTimeCallbacks * MILLI / nBlocksTotal);
|
LogPrint(BCLog::BENCHMARK, " - Callbacks: %.2fms [%.2fs (%.2fms/blk)]\n", MILLI * (nTime8 - nTime5), nTimeCallbacks * MICRO, nTimeCallbacks * MILLI / nBlocksTotal);
|
||||||
|
|
||||||
@ -4838,7 +4853,8 @@ bool CChainState::RollforwardBlock(const CBlockIndex* pindex, CCoinsViewCache& i
|
|||||||
|
|
||||||
// MUST process special txes before updating UTXO to ensure consistency between mempool and block processing
|
// MUST process special txes before updating UTXO to ensure consistency between mempool and block processing
|
||||||
BlockValidationState state;
|
BlockValidationState state;
|
||||||
if (!ProcessSpecialTxsInBlock(block, pindex, m_mnhfManager, *m_quorum_block_processor, *m_clhandler, m_params.GetConsensus(), inputs, false /*fJustCheck*/, false /*fScriptChecks*/, state)) {
|
std::optional<MNListUpdates> mnlist_updates_opt{std::nullopt};
|
||||||
|
if (!ProcessSpecialTxsInBlock(block, pindex, m_mnhfManager, *m_quorum_block_processor, *m_clhandler, m_params.GetConsensus(), inputs, false /*fJustCheck*/, false /*fScriptChecks*/, state, mnlist_updates_opt)) {
|
||||||
return error("RollforwardBlock(DASH): ProcessSpecialTxsInBlock for block %s failed with %s",
|
return error("RollforwardBlock(DASH): ProcessSpecialTxsInBlock for block %s failed with %s",
|
||||||
pindex->GetBlockHash().ToString(), state.ToString());
|
pindex->GetBlockHash().ToString(), state.ToString());
|
||||||
}
|
}
|
||||||
|
@ -310,7 +310,7 @@ void CMainSignals::NotifyRecoveredSig(const std::shared_ptr<const llmq::CRecover
|
|||||||
sig->GetHash().ToString());
|
sig->GetHash().ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
void CMainSignals::NotifyMasternodeListChanged(bool undo, const CDeterministicMNList& oldMNList, const CDeterministicMNListDiff& diff, CConnman& connman) {
|
void CMainSignals::NotifyMasternodeListChanged(bool undo, const CDeterministicMNList& oldMNList, const CDeterministicMNListDiff& diff) {
|
||||||
LOG_EVENT("%s: notify mn list changed undo=%d", __func__, undo);
|
LOG_EVENT("%s: notify mn list changed undo=%d", __func__, undo);
|
||||||
m_internals->Iterate([&](CValidationInterface& callbacks) { callbacks.NotifyMasternodeListChanged(undo, oldMNList, diff, connman); });
|
m_internals->Iterate([&](CValidationInterface& callbacks) { callbacks.NotifyMasternodeListChanged(undo, oldMNList, diff); });
|
||||||
}
|
}
|
||||||
|
@ -165,7 +165,7 @@ protected:
|
|||||||
virtual void NotifyGovernanceObject(const std::shared_ptr<const CGovernanceObject>& object) {}
|
virtual void NotifyGovernanceObject(const std::shared_ptr<const CGovernanceObject>& object) {}
|
||||||
virtual void NotifyInstantSendDoubleSpendAttempt(const CTransactionRef& currentTx, const CTransactionRef& previousTx) {}
|
virtual void NotifyInstantSendDoubleSpendAttempt(const CTransactionRef& currentTx, const CTransactionRef& previousTx) {}
|
||||||
virtual void NotifyRecoveredSig(const std::shared_ptr<const llmq::CRecoveredSig>& sig) {}
|
virtual void NotifyRecoveredSig(const std::shared_ptr<const llmq::CRecoveredSig>& sig) {}
|
||||||
virtual void NotifyMasternodeListChanged(bool undo, const CDeterministicMNList& oldMNList, const CDeterministicMNListDiff& diff, CConnman& connman) {}
|
virtual void NotifyMasternodeListChanged(bool undo, const CDeterministicMNList& oldMNList, const CDeterministicMNListDiff& diff) {}
|
||||||
/**
|
/**
|
||||||
* Notifies listeners of the new active block chain on-disk.
|
* Notifies listeners of the new active block chain on-disk.
|
||||||
*
|
*
|
||||||
@ -232,7 +232,7 @@ public:
|
|||||||
void NotifyGovernanceObject(const std::shared_ptr<const CGovernanceObject>& object);
|
void NotifyGovernanceObject(const std::shared_ptr<const CGovernanceObject>& object);
|
||||||
void NotifyInstantSendDoubleSpendAttempt(const CTransactionRef ¤tTx, const CTransactionRef &previousTx);
|
void NotifyInstantSendDoubleSpendAttempt(const CTransactionRef ¤tTx, const CTransactionRef &previousTx);
|
||||||
void NotifyRecoveredSig(const std::shared_ptr<const llmq::CRecoveredSig> &sig);
|
void NotifyRecoveredSig(const std::shared_ptr<const llmq::CRecoveredSig> &sig);
|
||||||
void NotifyMasternodeListChanged(bool undo, const CDeterministicMNList& oldMNList, const CDeterministicMNListDiff& diff, CConnman& connman);
|
void NotifyMasternodeListChanged(bool undo, const CDeterministicMNList& oldMNList, const CDeterministicMNListDiff& diff);
|
||||||
void ChainStateFlushed(const CBlockLocator &);
|
void ChainStateFlushed(const CBlockLocator &);
|
||||||
void BlockChecked(const CBlock&, const BlockValidationState&);
|
void BlockChecked(const CBlock&, const BlockValidationState&);
|
||||||
void NewPoWValidBlock(const CBlockIndex *, const std::shared_ptr<const CBlock>&);
|
void NewPoWValidBlock(const CBlockIndex *, const std::shared_ptr<const CBlock>&);
|
||||||
|
@ -105,6 +105,7 @@ EXPECTED_CIRCULAR_DEPENDENCIES=(
|
|||||||
"llmq/debug -> llmq/dkgsessionhandler -> llmq/dkgsession -> llmq/debug"
|
"llmq/debug -> llmq/dkgsessionhandler -> llmq/dkgsession -> llmq/debug"
|
||||||
"llmq/utils -> validation -> llmq/utils"
|
"llmq/utils -> validation -> llmq/utils"
|
||||||
"evo/mnhftx -> validation -> evo/mnhftx"
|
"evo/mnhftx -> validation -> evo/mnhftx"
|
||||||
|
"evo/deterministicmns -> validation -> evo/deterministicmns"
|
||||||
)
|
)
|
||||||
|
|
||||||
EXIT_CODE=0
|
EXIT_CODE=0
|
||||||
|
Loading…
Reference in New Issue
Block a user