diff --git a/src/bitcoin-chainstate.cpp b/src/bitcoin-chainstate.cpp index eec3362d4e2..47ddfaad8de 100644 --- a/src/bitcoin-chainstate.cpp +++ b/src/bitcoin-chainstate.cpp @@ -74,7 +74,7 @@ int main(int argc, char* argv[]) class KernelNotifications : public kernel::Notifications { public: - kernel::InterruptResult blockTip(SynchronizationState, CBlockIndex&) override + kernel::InterruptResult blockTip(SynchronizationState, CBlockIndex&, double) override { std::cout << "Block tip changed" << std::endl; return {}; diff --git a/src/init.cpp b/src/init.cpp index 78e4a23dec4..a8f768741ff 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -1787,10 +1787,10 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info) #if HAVE_SYSTEM const std::string block_notify = args.GetArg("-blocknotify", ""); if (!block_notify.empty()) { - uiInterface.NotifyBlockTip_connect([block_notify](SynchronizationState sync_state, const CBlockIndex* pBlockIndex) { - if (sync_state != SynchronizationState::POST_INIT || !pBlockIndex) return; + uiInterface.NotifyBlockTip_connect([block_notify](SynchronizationState sync_state, const CBlockIndex& block, double /* verification_progress */) { + if (sync_state != SynchronizationState::POST_INIT) return; std::string command = block_notify; - ReplaceAll(command, "%s", pBlockIndex->GetBlockHash().GetHex()); + ReplaceAll(command, "%s", block.GetBlockHash().GetHex()); std::thread t(runCommand, command); t.detach(); // thread runs free }); diff --git a/src/kernel/notifications_interface.h b/src/kernel/notifications_interface.h index ef72d9bdb6e..3e97e3b45e9 100644 --- a/src/kernel/notifications_interface.h +++ b/src/kernel/notifications_interface.h @@ -37,7 +37,7 @@ class Notifications public: virtual ~Notifications() = default; - [[nodiscard]] virtual InterruptResult blockTip(SynchronizationState state, CBlockIndex& index) { return {}; } + [[nodiscard]] virtual InterruptResult blockTip(SynchronizationState state, CBlockIndex& index, double verification_progress) { return {}; } virtual void headerTip(SynchronizationState state, int64_t height, int64_t timestamp, bool presync) {} virtual void progress(const bilingual_str& title, int progress_percent, bool resume_possible) {} virtual void warningSet(Warning id, const bilingual_str& message) {} diff --git a/src/node/interface_ui.cpp b/src/node/interface_ui.cpp index c9dcd7a7fb9..273e51974e3 100644 --- a/src/node/interface_ui.cpp +++ b/src/node/interface_ui.cpp @@ -55,7 +55,7 @@ void CClientUIInterface::NotifyNumConnectionsChanged(int newNumConnections) { re void CClientUIInterface::NotifyNetworkActiveChanged(bool networkActive) { return g_ui_signals.NotifyNetworkActiveChanged(networkActive); } void CClientUIInterface::NotifyAlertChanged() { return g_ui_signals.NotifyAlertChanged(); } void CClientUIInterface::ShowProgress(const std::string& title, int nProgress, bool resume_possible) { return g_ui_signals.ShowProgress(title, nProgress, resume_possible); } -void CClientUIInterface::NotifyBlockTip(SynchronizationState s, const CBlockIndex* i) { return g_ui_signals.NotifyBlockTip(s, i); } +void CClientUIInterface::NotifyBlockTip(SynchronizationState s, const CBlockIndex& block, double verification_progress) { return g_ui_signals.NotifyBlockTip(s, block, verification_progress); } void CClientUIInterface::NotifyHeaderTip(SynchronizationState s, int64_t height, int64_t timestamp, bool presync) { return g_ui_signals.NotifyHeaderTip(s, height, timestamp, presync); } void CClientUIInterface::BannedListChanged() { return g_ui_signals.BannedListChanged(); } diff --git a/src/node/interface_ui.h b/src/node/interface_ui.h index 85c34f58342..7732cf47977 100644 --- a/src/node/interface_ui.h +++ b/src/node/interface_ui.h @@ -103,7 +103,7 @@ public: ADD_SIGNALS_DECL_WRAPPER(ShowProgress, void, const std::string& title, int nProgress, bool resume_possible); /** New block has been accepted */ - ADD_SIGNALS_DECL_WRAPPER(NotifyBlockTip, void, SynchronizationState, const CBlockIndex*); + ADD_SIGNALS_DECL_WRAPPER(NotifyBlockTip, void, SynchronizationState, const CBlockIndex& block, double verification_progress); /** Best header has changed */ ADD_SIGNALS_DECL_WRAPPER(NotifyHeaderTip, void, SynchronizationState, int64_t height, int64_t timestamp, bool presync); diff --git a/src/node/interfaces.cpp b/src/node/interfaces.cpp index 641589d7cc0..04afc852e43 100644 --- a/src/node/interfaces.cpp +++ b/src/node/interfaces.cpp @@ -409,10 +409,8 @@ public: } std::unique_ptr handleNotifyBlockTip(NotifyBlockTipFn fn) override { - return MakeSignalHandler(::uiInterface.NotifyBlockTip_connect([fn, this](SynchronizationState sync_state, const CBlockIndex* block) { - LOCK(chainman().GetMutex()); - fn(sync_state, BlockTip{block->nHeight, block->GetBlockTime(), block->GetBlockHash()}, - chainman().GuessVerificationProgress(block)); + return MakeSignalHandler(::uiInterface.NotifyBlockTip_connect([fn](SynchronizationState sync_state, const CBlockIndex& block, double verification_progress) { + fn(sync_state, BlockTip{block.nHeight, block.GetBlockTime(), block.GetBlockHash()}, verification_progress); })); } std::unique_ptr handleNotifyHeaderTip(NotifyHeaderTipFn fn) override diff --git a/src/node/kernel_notifications.cpp b/src/node/kernel_notifications.cpp index 550ffe74c4a..4a6f8444dac 100644 --- a/src/node/kernel_notifications.cpp +++ b/src/node/kernel_notifications.cpp @@ -48,7 +48,7 @@ static void AlertNotify(const std::string& strMessage) namespace node { -kernel::InterruptResult KernelNotifications::blockTip(SynchronizationState state, CBlockIndex& index) +kernel::InterruptResult KernelNotifications::blockTip(SynchronizationState state, CBlockIndex& index, double verification_progress) { { LOCK(m_tip_block_mutex); @@ -57,7 +57,7 @@ kernel::InterruptResult KernelNotifications::blockTip(SynchronizationState state m_tip_block_cv.notify_all(); } - uiInterface.NotifyBlockTip(state, &index); + uiInterface.NotifyBlockTip(state, index, verification_progress); if (m_stop_at_height && index.nHeight >= m_stop_at_height) { if (!m_shutdown_request()) { LogError("Failed to send shutdown signal after reaching stop height\n"); diff --git a/src/node/kernel_notifications.h b/src/node/kernel_notifications.h index f4174381daf..10ee3e18d74 100644 --- a/src/node/kernel_notifications.h +++ b/src/node/kernel_notifications.h @@ -35,7 +35,7 @@ public: KernelNotifications(const std::function& shutdown_request, std::atomic& exit_status, node::Warnings& warnings) : m_shutdown_request(shutdown_request), m_exit_status{exit_status}, m_warnings{warnings} {} - [[nodiscard]] kernel::InterruptResult blockTip(SynchronizationState state, CBlockIndex& index) override EXCLUSIVE_LOCKS_REQUIRED(!m_tip_block_mutex); + [[nodiscard]] kernel::InterruptResult blockTip(SynchronizationState state, CBlockIndex& index, double verification_progress) override EXCLUSIVE_LOCKS_REQUIRED(!m_tip_block_mutex); void headerTip(SynchronizationState state, int64_t height, int64_t timestamp, bool presync) override; diff --git a/src/validation.cpp b/src/validation.cpp index 3ace1725522..f6ac62a14a1 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -3544,7 +3544,11 @@ bool Chainstate::ActivateBestChain(BlockValidationState& state, std::shared_ptr< m_chainman.m_options.signals->UpdatedBlockTip(pindexNewTip, pindexFork, still_in_ibd); } - if (kernel::IsInterrupted(m_chainman.GetNotifications().blockTip(GetSynchronizationState(still_in_ibd, m_chainman.m_blockman.m_blockfiles_indexed), *pindexNewTip))) { + if (kernel::IsInterrupted(m_chainman.GetNotifications().blockTip( + /*state=*/GetSynchronizationState(still_in_ibd, m_chainman.m_blockman.m_blockfiles_indexed), + /*index=*/*pindexNewTip, + /*verification_progress=*/m_chainman.GuessVerificationProgress(pindexNewTip)))) + { // Just breaking and returning success for now. This could // be changed to bubble up the kernel::Interrupted value to // the caller so the caller could distinguish between @@ -3777,7 +3781,10 @@ bool Chainstate::InvalidateBlock(BlockValidationState& state, CBlockIndex* pinde // parameter indicating the source of the tip change so hooks can // distinguish user-initiated invalidateblock changes from other // changes. - (void)m_chainman.GetNotifications().blockTip(GetSynchronizationState(m_chainman.IsInitialBlockDownload(), m_chainman.m_blockman.m_blockfiles_indexed), *to_mark_failed->pprev); + (void)m_chainman.GetNotifications().blockTip( + /*state=*/GetSynchronizationState(m_chainman.IsInitialBlockDownload(), m_chainman.m_blockman.m_blockfiles_indexed), + /*index=*/*to_mark_failed->pprev, + /*verification_progress=*/WITH_LOCK(m_chainman.GetMutex(), return m_chainman.GuessVerificationProgress(to_mark_failed->pprev))); // Fire ActiveTipChange now for the current chain tip to make sure clients are notified. // ActivateBestChain may call this as well, but not necessarily. @@ -4675,7 +4682,10 @@ bool Chainstate::LoadChainTip() // Ensure KernelNotifications m_tip_block is set even if no new block arrives. if (this->GetRole() != ChainstateRole::BACKGROUND) { // Ignoring return value for now. - (void)m_chainman.GetNotifications().blockTip(GetSynchronizationState(/*init=*/true, m_chainman.m_blockman.m_blockfiles_indexed), *pindex); + (void)m_chainman.GetNotifications().blockTip( + /*state=*/GetSynchronizationState(/*init=*/true, m_chainman.m_blockman.m_blockfiles_indexed), + /*index=*/*pindex, + /*verification_progress=*/m_chainman.GuessVerificationProgress(tip)); } return true;