From 376086fc5a187f5b2ab3a0d1202ed4e6c22bdb50 Mon Sep 17 00:00:00 2001 From: Pieter Wuille Date: Sat, 13 Aug 2022 14:21:12 -0400 Subject: Make validation interface capable of signalling header presync This makes a number of changes: - Get rid of the verification_progress argument in the node interface NotifyHeaderTip (it was always 0.0). - Instead of passing a CBlockIndex* in the UI interface's NotifyHeaderTip, send separate height, timestamp fields. This is becuase in headers presync, no actual CBlockIndex object is available. - Add a bool presync argument to both of the above, to identify signals pertaining to the first headers sync phase. --- src/interfaces/node.h | 2 +- src/node/interface_ui.cpp | 2 +- src/node/interface_ui.h | 2 +- src/node/interfaces.cpp | 5 ++--- src/qt/clientmodel.cpp | 4 ++-- src/validation.cpp | 2 +- 6 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/interfaces/node.h b/src/interfaces/node.h index 2c31e12ada..dbdb21eb91 100644 --- a/src/interfaces/node.h +++ b/src/interfaces/node.h @@ -260,7 +260,7 @@ public: //! Register handler for header tip messages. using NotifyHeaderTipFn = - std::function; + std::function; virtual std::unique_ptr handleNotifyHeaderTip(NotifyHeaderTipFn fn) = 0; //! Get and set internal node context. Useful for testing, but not diff --git a/src/node/interface_ui.cpp b/src/node/interface_ui.cpp index 370cde84f8..fa90d6fda7 100644 --- a/src/node/interface_ui.cpp +++ b/src/node/interface_ui.cpp @@ -53,7 +53,7 @@ void CClientUIInterface::NotifyNetworkActiveChanged(bool networkActive) { return 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::NotifyHeaderTip(SynchronizationState s, const CBlockIndex* i) { return g_ui_signals.NotifyHeaderTip(s, i); } +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(); } bool InitError(const bilingual_str& str) diff --git a/src/node/interface_ui.h b/src/node/interface_ui.h index 37c0f6392b..316d75167e 100644 --- a/src/node/interface_ui.h +++ b/src/node/interface_ui.h @@ -105,7 +105,7 @@ public: ADD_SIGNALS_DECL_WRAPPER(NotifyBlockTip, void, SynchronizationState, const CBlockIndex*); /** Best header has changed */ - ADD_SIGNALS_DECL_WRAPPER(NotifyHeaderTip, void, SynchronizationState, const CBlockIndex*); + ADD_SIGNALS_DECL_WRAPPER(NotifyHeaderTip, void, SynchronizationState, int64_t height, int64_t timestamp, bool presync); /** Banlist did change. */ ADD_SIGNALS_DECL_WRAPPER(BannedListChanged, void, void); diff --git a/src/node/interfaces.cpp b/src/node/interfaces.cpp index 25161d2cd3..aa7ddec770 100644 --- a/src/node/interfaces.cpp +++ b/src/node/interfaces.cpp @@ -377,9 +377,8 @@ public: std::unique_ptr handleNotifyHeaderTip(NotifyHeaderTipFn fn) override { return MakeHandler( - ::uiInterface.NotifyHeaderTip_connect([fn](SynchronizationState sync_state, const CBlockIndex* block) { - fn(sync_state, BlockTip{block->nHeight, block->GetBlockTime(), block->GetBlockHash()}, - /* verification progress is unused when a header was received */ 0); + ::uiInterface.NotifyHeaderTip_connect([fn](SynchronizationState sync_state, int64_t height, int64_t timestamp, bool presync) { + fn(sync_state, BlockTip{(int)height, timestamp, uint256{}}, presync); })); } NodeContext* context() override { return m_context; } diff --git a/src/qt/clientmodel.cpp b/src/qt/clientmodel.cpp index f41da519df..927554eaaf 100644 --- a/src/qt/clientmodel.cpp +++ b/src/qt/clientmodel.cpp @@ -267,8 +267,8 @@ void ClientModel::subscribeToCoreSignals() TipChanged(sync_state, tip, verification_progress, /*header=*/false); }); m_handler_notify_header_tip = m_node.handleNotifyHeaderTip( - [this](SynchronizationState sync_state, interfaces::BlockTip tip, double verification_progress) { - TipChanged(sync_state, tip, verification_progress, /*header=*/true); + [this](SynchronizationState sync_state, interfaces::BlockTip tip, bool presync) { + if (!presync) TipChanged(sync_state, tip, /*verification_progress=*/0.0, /*header=*/true); }); } diff --git a/src/validation.cpp b/src/validation.cpp index 5eaafa3f02..179e09158d 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -2944,7 +2944,7 @@ static bool NotifyHeaderTip(CChainState& chainstate) LOCKS_EXCLUDED(cs_main) { } // Send block tip changed notifications without cs_main if (fNotify) { - uiInterface.NotifyHeaderTip(GetSynchronizationState(fInitialBlockDownload), pindexHeader); + uiInterface.NotifyHeaderTip(GetSynchronizationState(fInitialBlockDownload), pindexHeader->nHeight, pindexHeader->nTime, false); } return fNotify; } -- cgit v1.2.3