From d47adc15e9a049e2369c22aa5e91d296e3d7ed53 Mon Sep 17 00:00:00 2001 From: Eric Voskuil Date: Sat, 19 Sep 2026 11:03:30 -0400 Subject: [PATCH 1/3] Refactor network broadcasters. --- src/protocols/protocol_observer.cpp | 30 ++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/src/protocols/protocol_observer.cpp b/src/protocols/protocol_observer.cpp index 689e50b0..16f12988 100644 --- a/src/protocols/protocol_observer.cpp +++ b/src/protocols/protocol_observer.cpp @@ -135,7 +135,7 @@ bool protocol_observer::handle_broadcast_diagnostics(const code& ec, if (stopped(ec)) return false; - if (!message->member(identifier()) && !message->member(group())) + if (!message->targets(identifier()) && !message->targets(group())) return true; using namespace system; @@ -157,27 +157,31 @@ bool protocol_observer::handle_broadcast_diagnostics(const code& ec, message->add( { + .group = group(), .identifier = identifier(), + .endpoint = opposite(), .address = outbound(), .local = local, .binding = binding(), - .group = group(), - .version = negotiated_version(), - .services = services, - .sent = sent(), - .received = received(), + + .encrypted = encrypted(), + .peer_relay = relay, + .peer_start_height = start_height(), + .peer_version = negotiated_version(), + .peer_services = services, + .peer_minimum_fee = minimum_fee(), + .peer_user_agent = agent, + .created = created(), .last_read = last_read(), .last_write = last_write(), .time_offset = time_offset, - .minimum_fee = minimum_fee(), + .bytes_sent = sent(), + .bytes_received = received(), + .ping_time = ping_time(), .minimum_ping_time = minimum_ping_time(), - .pending_ping_time = pending_ping_time(), - .start_height = start_height(), - .encrypted = encrypted(), - .relay = relay, - .agent = agent + .pending_ping_time = pending_ping_time() }); return true; @@ -192,7 +196,7 @@ bool protocol_observer::handle_broadcast_terminator(const code& ec, if (stopped(ec)) return false; - if (!message->member(identifier(), outbound())) + if (!message->targets(identifier(), outbound(), opposite())) return true; message->stopped(); From b5fc30a97645bb7466a687e8ee728f6e4775adb9 Mon Sep 17 00:00:00 2001 From: Eric Voskuil Date: Sat, 19 Sep 2026 11:37:21 -0400 Subject: [PATCH 2/3] Expose manual connect with notifier, capture channel endpoint. --- include/bitcoin/node/protocols/protocol.hpp | 4 ++++ include/bitcoin/node/sessions/session.hpp | 4 ++++ src/protocols/protocol.cpp | 6 ++++++ src/sessions/session.cpp | 6 ++++++ 4 files changed, 20 insertions(+) diff --git a/include/bitcoin/node/protocols/protocol.hpp b/include/bitcoin/node/protocols/protocol.hpp index a6f580a9..689148a9 100644 --- a/include/bitcoin/node/protocols/protocol.hpp +++ b/include/bitcoin/node/protocols/protocol.hpp @@ -85,6 +85,10 @@ class BCN_API protocol /// Maintain a manual connection to the given endpoint. virtual void connect(const network::config::endpoint& endpoint) NOEXCEPT; + /// Connect to the given endpoint, handler invoked on each connect/stop. + virtual void connect(const network::config::endpoint& endpoint, + network::net::channel_notifier&& handler) NOEXCEPT; + /// Get current fee estimate. void estimate(size_t target, estimator::mode mode, estimate_handler&& handler) NOEXCEPT; diff --git a/include/bitcoin/node/sessions/session.hpp b/include/bitcoin/node/sessions/session.hpp index 97ceaaf9..ebc3d85b 100644 --- a/include/bitcoin/node/sessions/session.hpp +++ b/include/bitcoin/node/sessions/session.hpp @@ -88,6 +88,10 @@ class BCN_API session /// Maintain a manual connection to the given endpoint. virtual void connect(const network::config::endpoint& endpoint) NOEXCEPT; + /// Connect to the given endpoint, handler invoked on each connect/stop. + virtual void connect(const network::config::endpoint& endpoint, + network::net::channel_notifier&& handler) NOEXCEPT; + /// Get current fee estimate. void estimate(size_t target, estimator::mode mode, estimate_handler&& handler) NOEXCEPT; diff --git a/src/protocols/protocol.cpp b/src/protocols/protocol.cpp index 7eaa3c41..d2712d9b 100644 --- a/src/protocols/protocol.cpp +++ b/src/protocols/protocol.cpp @@ -103,6 +103,12 @@ void protocol::connect(const network::config::endpoint& endpoint) NOEXCEPT session_->connect(endpoint); } +void protocol::connect(const network::config::endpoint& endpoint, + network::net::channel_notifier&& handler) NOEXCEPT +{ + session_->connect(endpoint, std::move(handler)); +} + bool protocol::suspended() const NOEXCEPT { return session_->suspended(); diff --git a/src/sessions/session.cpp b/src/sessions/session.cpp index a01275ec..9088b546 100644 --- a/src/sessions/session.cpp +++ b/src/sessions/session.cpp @@ -196,6 +196,12 @@ void session::connect(const network::config::endpoint& endpoint) NOEXCEPT node_.connect(endpoint); } +void session::connect(const network::config::endpoint& endpoint, + network::net::channel_notifier&& handler) NOEXCEPT +{ + node_.connect(endpoint, std::move(handler)); +} + bool session::suspended() const NOEXCEPT { return node_.suspended(); From 0e17c0c659dace3fe44a56cf01e6252b813b2915 Mon Sep 17 00:00:00 2001 From: Eric Voskuil Date: Sat, 19 Sep 2026 12:45:48 -0400 Subject: [PATCH 3/3] Capture per message byte counts in channel diagnostics. --- src/protocols/protocol_observer.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/protocols/protocol_observer.cpp b/src/protocols/protocol_observer.cpp index 16f12988..faf45e36 100644 --- a/src/protocols/protocol_observer.cpp +++ b/src/protocols/protocol_observer.cpp @@ -178,6 +178,8 @@ bool protocol_observer::handle_broadcast_diagnostics(const code& ec, .time_offset = time_offset, .bytes_sent = sent(), .bytes_received = received(), + .bytes_sent_by_message = sent_by_message(), + .bytes_received_by_message = received_by_message(), .ping_time = ping_time(), .minimum_ping_time = minimum_ping_time(),