From 573bb542be80b63b1713a0b76bedaa5e37c3783f Mon Sep 17 00:00:00 2001 From: Andrew Toth Date: Sun, 25 Jan 2026 13:17:52 -0500 Subject: [PATCH] net: Store recipient node address in private broadcast --- src/net_processing.cpp | 2 +- src/private_broadcast.cpp | 4 ++-- src/private_broadcast.h | 7 +++++-- src/test/private_broadcast_tests.cpp | 10 ++++++---- 4 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/net_processing.cpp b/src/net_processing.cpp index e5b4bc7772d..1aefbf77cb3 100644 --- a/src/net_processing.cpp +++ b/src/net_processing.cpp @@ -3531,7 +3531,7 @@ void PeerManagerImpl::PushPrivateBroadcastTx(CNode& node) { Assume(node.IsPrivateBroadcastConn()); - const auto opt_tx{m_tx_for_private_broadcast.PickTxForSend(node.GetId())}; + const auto opt_tx{m_tx_for_private_broadcast.PickTxForSend(node.GetId(), CService{node.addr})}; if (!opt_tx) { LogDebug(BCLog::PRIVBROADCAST, "Disconnecting: no more transactions for private broadcast (connected in vain), peer=%d%s", node.GetId(), node.LogIP(fLogIPs)); node.fDisconnect = true; diff --git a/src/private_broadcast.cpp b/src/private_broadcast.cpp index c7c311c0e89..fd36a94088e 100644 --- a/src/private_broadcast.cpp +++ b/src/private_broadcast.cpp @@ -31,7 +31,7 @@ std::optional PrivateBroadcast::Remove(const CTransactionRef& tx) return std::nullopt; } -std::optional PrivateBroadcast::PickTxForSend(const NodeId& will_send_to_nodeid) +std::optional PrivateBroadcast::PickTxForSend(const NodeId& will_send_to_nodeid, const CService& will_send_to_address) EXCLUSIVE_LOCKS_REQUIRED(!m_mutex) { LOCK(m_mutex); @@ -43,7 +43,7 @@ std::optional PrivateBroadcast::PickTxForSend(const NodeId& wil if (it != m_transactions.end()) { auto& [tx, sent_to]{*it}; - sent_to.emplace_back(will_send_to_nodeid, NodeClock::now()); + sent_to.emplace_back(will_send_to_nodeid, will_send_to_address, NodeClock::now()); return tx; } diff --git a/src/private_broadcast.h b/src/private_broadcast.h index e88db6bbb7b..3beed5eef4c 100644 --- a/src/private_broadcast.h +++ b/src/private_broadcast.h @@ -54,9 +54,11 @@ public: * and oldest send/confirm times. * @param[in] will_send_to_nodeid Will remember that the returned transaction * was picked for sending to this node. + * @param[in] will_send_to_address Address of the peer to which this transaction + * will be sent. * @return Most urgent transaction or nullopt if there are no transactions. */ - std::optional PickTxForSend(const NodeId& will_send_to_nodeid) + std::optional PickTxForSend(const NodeId& will_send_to_nodeid, const CService& will_send_to_address) EXCLUSIVE_LOCKS_REQUIRED(!m_mutex); /** @@ -99,10 +101,11 @@ private: /// Status of a transaction sent to a given node. struct SendStatus { const NodeId nodeid; /// Node to which the transaction will be sent (or was sent). + const CService address; /// Address of the node. const NodeClock::time_point picked; ///< When was the transaction picked for sending to the node. std::optional confirmed; ///< When was the transaction reception confirmed by the node (by PONG). - SendStatus(const NodeId& nodeid, const NodeClock::time_point& picked) : nodeid{nodeid}, picked{picked} {} + SendStatus(const NodeId& nodeid, const CService& address, const NodeClock::time_point& picked) : nodeid{nodeid}, address{address}, picked{picked} {} }; /// Cumulative stats from all the send attempts for a transaction. Used to prioritize transactions. diff --git a/src/test/private_broadcast_tests.cpp b/src/test/private_broadcast_tests.cpp index 6c5ef36fc34..e0ab64cd4c2 100644 --- a/src/test/private_broadcast_tests.cpp +++ b/src/test/private_broadcast_tests.cpp @@ -29,9 +29,10 @@ BOOST_AUTO_TEST_CASE(basic) PrivateBroadcast pb; const NodeId recipient1{1}; + const CService addr1{}; // No transactions initially. - BOOST_CHECK(!pb.PickTxForSend(/*will_send_to_nodeid=*/recipient1).has_value()); + BOOST_CHECK(!pb.PickTxForSend(/*will_send_to_nodeid=*/recipient1, /*will_send_to_address=*/addr1).has_value()); BOOST_CHECK_EQUAL(pb.GetStale().size(), 0); BOOST_CHECK(!pb.HavePendingTransactions()); @@ -48,12 +49,13 @@ BOOST_AUTO_TEST_CASE(basic) BOOST_CHECK(pb.Add(tx2)); - const auto tx_for_recipient1{pb.PickTxForSend(/*will_send_to_nodeid=*/recipient1).value()}; + const auto tx_for_recipient1{pb.PickTxForSend(/*will_send_to_nodeid=*/recipient1, /*will_send_to_address=*/addr1).value()}; BOOST_CHECK(tx_for_recipient1 == tx1 || tx_for_recipient1 == tx2); // A second pick must return the other transaction. const NodeId recipient2{2}; - const auto tx_for_recipient2{pb.PickTxForSend(/*will_send_to_nodeid=*/recipient2).value()}; + const CService addr2{}; + const auto tx_for_recipient2{pb.PickTxForSend(/*will_send_to_nodeid=*/recipient2, /*will_send_to_address=*/addr2).value()}; BOOST_CHECK(tx_for_recipient2 == tx1 || tx_for_recipient2 == tx2); BOOST_CHECK_NE(tx_for_recipient1, tx_for_recipient2); @@ -90,7 +92,7 @@ BOOST_AUTO_TEST_CASE(basic) BOOST_CHECK_EQUAL(pb.Remove(tx_for_recipient2).value(), 0); BOOST_CHECK(!pb.Remove(tx_for_recipient2).has_value()); - BOOST_CHECK(!pb.PickTxForSend(/*will_send_to_nodeid=*/nonexistent_recipient).has_value()); + BOOST_CHECK(!pb.PickTxForSend(/*will_send_to_nodeid=*/nonexistent_recipient, /*will_send_to_address=*/CService{}).has_value()); } BOOST_AUTO_TEST_SUITE_END()