Send and require SENDADDRV2 before VERACK

See the corresponding BIP change: https://github.com/bitcoin/bips/pull/1043
pull/826/head
Pieter Wuille 4 years ago
parent c5a8919660
commit 1583498fb6

@ -2362,8 +2362,6 @@ void PeerManager::ProcessMessage(CNode& pfrom, const std::string& msg_type, CDat
m_connman.PushMessage(&pfrom, msg_maker.Make(NetMsgType::WTXIDRELAY)); m_connman.PushMessage(&pfrom, msg_maker.Make(NetMsgType::WTXIDRELAY));
} }
m_connman.PushMessage(&pfrom, msg_maker.Make(NetMsgType::VERACK));
// Signal ADDRv2 support (BIP155). // Signal ADDRv2 support (BIP155).
if (greatest_common_version >= 70016) { if (greatest_common_version >= 70016) {
// BIP155 defines addrv2 and sendaddrv2 for all protocol versions, but some // BIP155 defines addrv2 and sendaddrv2 for all protocol versions, but some
@ -2373,6 +2371,8 @@ void PeerManager::ProcessMessage(CNode& pfrom, const std::string& msg_type, CDat
m_connman.PushMessage(&pfrom, msg_maker.Make(NetMsgType::SENDADDRV2)); m_connman.PushMessage(&pfrom, msg_maker.Make(NetMsgType::SENDADDRV2));
} }
m_connman.PushMessage(&pfrom, msg_maker.Make(NetMsgType::VERACK));
pfrom.nServices = nServices; pfrom.nServices = nServices;
pfrom.SetAddrLocal(addrMe); pfrom.SetAddrLocal(addrMe);
{ {
@ -2541,6 +2541,17 @@ void PeerManager::ProcessMessage(CNode& pfrom, const std::string& msg_type, CDat
return; return;
} }
if (msg_type == NetMsgType::SENDADDRV2) {
if (pfrom.fSuccessfullyConnected) {
// Disconnect peers that send SENDADDRV2 message after VERACK; this
// must be negotiated between VERSION and VERACK.
pfrom.fDisconnect = true;
return;
}
pfrom.m_wants_addrv2 = true;
return;
}
if (!pfrom.fSuccessfullyConnected) { if (!pfrom.fSuccessfullyConnected) {
LogPrint(BCLog::NET, "Unsupported message \"%s\" prior to verack from peer=%d\n", SanitizeString(msg_type), pfrom.GetId()); LogPrint(BCLog::NET, "Unsupported message \"%s\" prior to verack from peer=%d\n", SanitizeString(msg_type), pfrom.GetId());
return; return;
@ -2608,11 +2619,6 @@ void PeerManager::ProcessMessage(CNode& pfrom, const std::string& msg_type, CDat
return; return;
} }
if (msg_type == NetMsgType::SENDADDRV2) {
pfrom.m_wants_addrv2 = true;
return;
}
if (msg_type == NetMsgType::SENDHEADERS) { if (msg_type == NetMsgType::SENDHEADERS) {
LOCK(cs_main); LOCK(cs_main);
State(pfrom.GetId())->fPreferHeaders = true; State(pfrom.GetId())->fPreferHeaders = true;

@ -396,9 +396,9 @@ class P2PInterface(P2PConnection):
assert message.nVersion >= MIN_VERSION_SUPPORTED, "Version {} received. Test framework only supports versions greater than {}".format(message.nVersion, MIN_VERSION_SUPPORTED) assert message.nVersion >= MIN_VERSION_SUPPORTED, "Version {} received. Test framework only supports versions greater than {}".format(message.nVersion, MIN_VERSION_SUPPORTED)
if message.nVersion >= 70016: if message.nVersion >= 70016:
self.send_message(msg_wtxidrelay()) self.send_message(msg_wtxidrelay())
self.send_message(msg_verack())
if self.support_addrv2: if self.support_addrv2:
self.send_message(msg_sendaddrv2()) self.send_message(msg_sendaddrv2())
self.send_message(msg_verack())
self.nServices = message.nServices self.nServices = message.nServices
# Connection helper methods # Connection helper methods

Loading…
Cancel
Save