From 2bbac8ff77fbe5ca301ecdf4b1ffc20c16df3202 Mon Sep 17 00:00:00 2001 From: Alexander Block Date: Tue, 26 Feb 2019 07:13:18 +0100 Subject: [PATCH] Introduce NotifyChainLock signal and invoke it when CLSIGs get processed --- src/llmq/quorums_chainlocks.cpp | 10 ++++++++++ src/llmq/quorums_chainlocks.h | 1 + src/validationinterface.cpp | 3 +++ src/validationinterface.h | 3 +++ 4 files changed, 17 insertions(+) diff --git a/src/llmq/quorums_chainlocks.cpp b/src/llmq/quorums_chainlocks.cpp index 94f251117d058..5a51f98e9ca7e 100644 --- a/src/llmq/quorums_chainlocks.cpp +++ b/src/llmq/quorums_chainlocks.cpp @@ -149,6 +149,11 @@ void CChainLocksHandler::ProcessNewChainLock(NodeId from, const llmq::CChainLock LogPrintf("CChainLocksHandler::%s -- processed new CLSIG (%s), peer=%d\n", __func__, clsig.ToString(), from); + + if (lastNotifyChainLockBlockIndex != bestChainLockBlockIndex) { + lastNotifyChainLockBlockIndex = bestChainLockBlockIndex; + GetMainSignals().NotifyChainLock(bestChainLockBlockIndex); + } } void CChainLocksHandler::AcceptedBlockHeader(const CBlockIndex* pindexNew) @@ -204,6 +209,11 @@ void CChainLocksHandler::UpdatedBlockTip(const CBlockIndex* pindexNew, const CBl if (bestChainLockBlockIndex == pindexNew) { // we first got the CLSIG, then the header, and then the block was connected. // In this case there is no need to continue here. + // However, NotifyChainLock might not have been called yet, so call it now if needed + if (lastNotifyChainLockBlockIndex != bestChainLockBlockIndex) { + lastNotifyChainLockBlockIndex = bestChainLockBlockIndex; + GetMainSignals().NotifyChainLock(bestChainLockBlockIndex); + } return; } diff --git a/src/llmq/quorums_chainlocks.h b/src/llmq/quorums_chainlocks.h index 31065a478f9d7..b7cd441e040a3 100644 --- a/src/llmq/quorums_chainlocks.h +++ b/src/llmq/quorums_chainlocks.h @@ -55,6 +55,7 @@ class CChainLocksHandler : public CRecoveredSigsListener CChainLockSig bestChainLockWithKnownBlock; const CBlockIndex* bestChainLockBlockIndex{nullptr}; + const CBlockIndex* lastNotifyChainLockBlockIndex{nullptr}; int32_t lastSignedHeight{-1}; uint256 lastSignedRequestId; diff --git a/src/validationinterface.cpp b/src/validationinterface.cpp index 86f374ec16a12..dc928f1b428b6 100644 --- a/src/validationinterface.cpp +++ b/src/validationinterface.cpp @@ -18,6 +18,7 @@ void RegisterValidationInterface(CValidationInterface* pwalletIn) { g_signals.UpdatedBlockTip.connect(boost::bind(&CValidationInterface::UpdatedBlockTip, pwalletIn, _1, _2, _3)); g_signals.SyncTransaction.connect(boost::bind(&CValidationInterface::SyncTransaction, pwalletIn, _1, _2, _3)); g_signals.NotifyTransactionLock.connect(boost::bind(&CValidationInterface::NotifyTransactionLock, pwalletIn, _1)); + g_signals.NotifyChainLock.connect(boost::bind(&CValidationInterface::NotifyChainLock, pwalletIn, _1)); g_signals.UpdatedTransaction.connect(boost::bind(&CValidationInterface::UpdatedTransaction, pwalletIn, _1)); g_signals.SetBestChain.connect(boost::bind(&CValidationInterface::SetBestChain, pwalletIn, _1)); g_signals.Inventory.connect(boost::bind(&CValidationInterface::Inventory, pwalletIn, _1)); @@ -40,6 +41,7 @@ void UnregisterValidationInterface(CValidationInterface* pwalletIn) { g_signals.Inventory.disconnect(boost::bind(&CValidationInterface::Inventory, pwalletIn, _1)); g_signals.SetBestChain.disconnect(boost::bind(&CValidationInterface::SetBestChain, pwalletIn, _1)); g_signals.UpdatedTransaction.disconnect(boost::bind(&CValidationInterface::UpdatedTransaction, pwalletIn, _1)); + g_signals.NotifyChainLock.disconnect(boost::bind(&CValidationInterface::NotifyChainLock, pwalletIn, _1)); g_signals.NotifyTransactionLock.disconnect(boost::bind(&CValidationInterface::NotifyTransactionLock, pwalletIn, _1)); g_signals.SyncTransaction.disconnect(boost::bind(&CValidationInterface::SyncTransaction, pwalletIn, _1, _2, _3)); g_signals.UpdatedBlockTip.disconnect(boost::bind(&CValidationInterface::UpdatedBlockTip, pwalletIn, _1, _2, _3)); @@ -61,6 +63,7 @@ void UnregisterAllValidationInterfaces() { g_signals.SetBestChain.disconnect_all_slots(); g_signals.UpdatedTransaction.disconnect_all_slots(); g_signals.NotifyTransactionLock.disconnect_all_slots(); + g_signals.NotifyChainLock.disconnect_all_slots(); g_signals.SyncTransaction.disconnect_all_slots(); g_signals.UpdatedBlockTip.disconnect_all_slots(); g_signals.NewPoWValidBlock.disconnect_all_slots(); diff --git a/src/validationinterface.h b/src/validationinterface.h index f28144ed9724e..5ad8e6ac773b1 100644 --- a/src/validationinterface.h +++ b/src/validationinterface.h @@ -39,6 +39,7 @@ class CValidationInterface { virtual void UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlockIndex *pindexFork, bool fInitialDownload) {} virtual void SyncTransaction(const CTransaction &tx, const CBlockIndex *pindex, int posInBlock) {} virtual void NotifyTransactionLock(const CTransaction &tx) {} + virtual void NotifyChainLock(const CBlockIndex* pindex) {} virtual void NotifyGovernanceVote(const CGovernanceVote &vote) {} virtual void NotifyGovernanceObject(const CGovernanceObject &object) {} virtual void NotifyInstantSendDoubleSpendAttempt(const CTransaction ¤tTx, const CTransaction &previousTx) {} @@ -76,6 +77,8 @@ struct CMainSignals { boost::signals2::signal SyncTransaction; /** Notifies listeners of an updated transaction lock without new data. */ boost::signals2::signal NotifyTransactionLock; + /** Notifies listeners of a ChainLock. */ + boost::signals2::signal NotifyChainLock; /** Notifies listeners of a new governance vote. */ boost::signals2::signal NotifyGovernanceVote; /** Notifies listeners of a new governance object. */