mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-02-09 08:43:04 +01:00
Merge bitcoin/bitcoin#34146: p2p: send first addr self-announcement in separate message 🎄
792e2edf57p2p: first addr self-announcement in separate msg (0xb10c) Pull request description: This makes sure the initial address self-announcement a node sends to a peer happends in a separate P2P message. This has benefits for both inbound and outbound connections: For inbound connections from a peer to us, previously, we might send the self-announcement along with our response to a GETADDR request. However, the self-announcement might replace an address from the GETADDR response. This isn't clean. For outbound connections from us to a peer, previously, it could have happend that we send the self-announcement along with other addresses. Since shortly after connection open, the peer might only have one rate-limiting token for us, and the addresses are shuffeld on arrival, it's possible that the self-announcement gets rate-limited. However, note that these rate-limitings seem to be rare in practice. This is inspired by and based on https://github.com/bitcoin/bitcoin/pull/33699#issuecomment-3462287763. The discussion there should be helpful for reviewers. ACKs for top commit: bensig: ACK792e2edf57achow101: ACK792e2edf57fjahr: Code review ACK792e2edf57frankomosh: Code Review ACK [792e2ed](792e2edf57) Tree-SHA512: e3d39b1e3ae6208b54df4b36c624a32d70a442e01681f49e0c8a65076a818b5bf203c2e51011dc32edbbe3637b3c0b5f18de26e3461c288aa3806646a209a260
This commit is contained in:
@@ -5517,7 +5517,20 @@ void PeerManagerImpl::MaybeSendAddr(CNode& node, Peer& peer, std::chrono::micros
|
||||
}
|
||||
if (std::optional<CService> local_service = GetLocalAddrForPeer(node)) {
|
||||
CAddress local_addr{*local_service, peer.m_our_services, Now<NodeSeconds>()};
|
||||
PushAddress(peer, local_addr);
|
||||
if (peer.m_next_local_addr_send == 0us) {
|
||||
// Send the initial self-announcement in its own message. This makes sure
|
||||
// rate-limiting with limited start-tokens doesn't ignore it if the first
|
||||
// message ends up containing multiple addresses.
|
||||
std::vector<CAddress> self_announcement {local_addr};
|
||||
if (peer.m_wants_addrv2) {
|
||||
MakeAndPushMessage(node, NetMsgType::ADDRV2, CAddress::V2_NETWORK(self_announcement));
|
||||
} else {
|
||||
MakeAndPushMessage(node, NetMsgType::ADDR, CAddress::V1_NETWORK(self_announcement));
|
||||
}
|
||||
} else {
|
||||
// All later self-announcements are sent together with the other addresses.
|
||||
PushAddress(peer, local_addr);
|
||||
}
|
||||
}
|
||||
peer.m_next_local_addr_send = current_time + m_rng.rand_exp_duration(AVG_LOCAL_ADDRESS_BROADCAST_INTERVAL);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user