From bedb685741458464ae0e353e61480380becd8e6a Mon Sep 17 00:00:00 2001 From: Eric Voskuil Date: Sun, 9 Aug 2026 13:20:06 -0400 Subject: [PATCH 1/2] Fix estimate reorganized fallthrough (uninitialized unsubscribed). --- src/chasers/chaser_estimate.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/chasers/chaser_estimate.cpp b/src/chasers/chaser_estimate.cpp index c6bbf107..254bdda2 100644 --- a/src/chasers/chaser_estimate.cpp +++ b/src/chasers/chaser_estimate.cpp @@ -150,8 +150,9 @@ bool chaser_estimate::handle_chase(const code&, chase event_, { BC_ASSERT(std::holds_alternative(value)); POST(do_reorganized, std::get(value)); - break; } + + break; } case chase::stop: { From 879a6faeaf506d3ae7c7867d20e7292315312d10 Mon Sep 17 00:00:00 2001 From: Eric Voskuil Date: Sun, 9 Aug 2026 15:21:23 -0400 Subject: [PATCH 2/2] Expose uptime and channel counts to protocols. --- include/bitcoin/node/full_node.hpp | 4 ++++ include/bitcoin/node/protocols/protocol.hpp | 9 +++++++++ include/bitcoin/node/sessions/session.hpp | 9 +++++++++ src/full_node.cpp | 8 +++++++- src/protocols/protocol.cpp | 15 +++++++++++++++ src/sessions/session.cpp | 15 +++++++++++++++ 6 files changed, 59 insertions(+), 1 deletion(-) diff --git a/include/bitcoin/node/full_node.hpp b/include/bitcoin/node/full_node.hpp index 3fbe0862..25f81579 100644 --- a/include/bitcoin/node/full_node.hpp +++ b/include/bitcoin/node/full_node.hpp @@ -145,6 +145,9 @@ class BCN_API full_node /// The confirmed chain is confirmed to maximum height or is current. virtual bool is_recent() const NOEXCEPT; + /// Zulu time at which the node started. + virtual time_t start_time() const NOEXCEPT; + /// Methods. /// ----------------------------------------------------------------------- @@ -180,6 +183,7 @@ class BCN_API full_node // These are thread safe. const configuration& config_; + const time_t start_time_; query& query_; // These are protected by strand. diff --git a/include/bitcoin/node/protocols/protocol.hpp b/include/bitcoin/node/protocols/protocol.hpp index 3d8f1b78..3a7d4cc9 100644 --- a/include/bitcoin/node/protocols/protocol.hpp +++ b/include/bitcoin/node/protocols/protocol.hpp @@ -68,6 +68,15 @@ class BCN_API protocol /// The candidate|confirmed chain is current. virtual bool is_current_chain(bool confirmed) const NOEXCEPT; + /// Zulu time at which the node started. + virtual time_t start_time() const NOEXCEPT; + + /// The number of peer channels (counted, not quiet). + virtual size_t channel_count() const NOEXCEPT; + + /// The number of inbound peer channels (counted, not quiet). + virtual size_t inbound_channel_count() const NOEXCEPT; + /// Methods. /// ----------------------------------------------------------------------- diff --git a/include/bitcoin/node/sessions/session.hpp b/include/bitcoin/node/sessions/session.hpp index 80995616..8b0772f6 100644 --- a/include/bitcoin/node/sessions/session.hpp +++ b/include/bitcoin/node/sessions/session.hpp @@ -109,6 +109,15 @@ class BCN_API session /// The confirmed chain is confirmed to maximum height or is current. virtual bool is_recent() const NOEXCEPT; + /// Zulu time at which the node started. + virtual time_t start_time() const NOEXCEPT; + + /// The number of peer channels (counted, not quiet). + virtual size_t channel_count() const NOEXCEPT; + + /// The number of inbound peer channels (counted, not quiet). + virtual size_t inbound_channel_count() const NOEXCEPT; + protected: /// Constructors. diff --git a/src/full_node.cpp b/src/full_node.cpp index 78bfbe4a..7fb69ce1 100644 --- a/src/full_node.cpp +++ b/src/full_node.cpp @@ -39,6 +39,7 @@ full_node::full_node(query& query, const configuration& configuration, const logger& log) NOEXCEPT : net(configuration.network, log), config_(configuration), + start_time_(zulu_time()), query_(query), chaser_block_(*this), chaser_header_(*this), @@ -431,13 +432,18 @@ bool full_node::is_current_header(const header_link& link) const NOEXCEPT bool full_node::is_recent() const NOEXCEPT { - if (is_nonzero(config_.node.maximum_height) && + if (is_nonzero(config_.node.maximum_height) && (query_.get_top_confirmed() >= config_.node.maximum_height)) return true; return is_current_chain(true); } +time_t full_node::start_time() const NOEXCEPT +{ + return start_time_; +} + // Methods. // ---------------------------------------------------------------------------- diff --git a/src/protocols/protocol.cpp b/src/protocols/protocol.cpp index d6456afe..90a85c3d 100644 --- a/src/protocols/protocol.cpp +++ b/src/protocols/protocol.cpp @@ -66,6 +66,21 @@ bool protocol::is_current_chain(bool confirmed) const NOEXCEPT return session_->is_current_chain(confirmed); } +time_t protocol::start_time() const NOEXCEPT +{ + return session_->start_time(); +} + +size_t protocol::channel_count() const NOEXCEPT +{ + return session_->channel_count(); +} + +size_t protocol::inbound_channel_count() const NOEXCEPT +{ + return session_->inbound_channel_count(); +} + // Methods. // ---------------------------------------------------------------------------- diff --git a/src/sessions/session.cpp b/src/sessions/session.cpp index 4a516b76..933d5c8b 100644 --- a/src/sessions/session.cpp +++ b/src/sessions/session.cpp @@ -160,6 +160,21 @@ bool session::is_recent() const NOEXCEPT return node_.is_recent(); } +time_t session::start_time() const NOEXCEPT +{ + return node_.start_time(); +} + +size_t session::channel_count() const NOEXCEPT +{ + return node_.channel_count(); +} + +size_t session::inbound_channel_count() const NOEXCEPT +{ + return node_.inbound_channel_count(); +} + BC_POP_WARNING() } // namespace node