diff options
| author | Vasil Dimov <[email protected]> | 2020-05-20 12:05:18 +0200 |
|---|---|---|
| committer | Vasil Dimov <[email protected]> | 2020-10-09 16:42:50 +0200 |
| commit | 353a3fdaad055eea42a0baf7326bdd591f541170 (patch) | |
| tree | ab25e783cbf347df239d98060f83dcf2ea72209a /src/netaddress.cpp | |
| parent | net: CAddress & CAddrMan: (un)serialize as ADDRv2 (diff) | |
| download | discoin-353a3fdaad055eea42a0baf7326bdd591f541170.tar.xz discoin-353a3fdaad055eea42a0baf7326bdd591f541170.zip | |
net: advertise support for ADDRv2 via new message
Introduce a new message `sendaddrv2` to signal support for ADDRv2.
Send the new message immediately after sending the `VERACK` message.
Add support for receiving and parsing ADDRv2 messages.
Send ADDRv2 messages (instead of ADDR) to a peer if he has
advertised support for it.
Co-authored-by: Carl Dong <[email protected]>
Diffstat (limited to 'src/netaddress.cpp')
| -rw-r--r-- | src/netaddress.cpp | 29 |
1 files changed, 26 insertions, 3 deletions
diff --git a/src/netaddress.cpp b/src/netaddress.cpp index 08714dc2e..eece0190b 100644 --- a/src/netaddress.cpp +++ b/src/netaddress.cpp @@ -474,6 +474,26 @@ bool CNetAddr::IsInternal() const return m_net == NET_INTERNAL; } +bool CNetAddr::IsAddrV1Compatible() const +{ + switch (m_net) { + case NET_IPV4: + case NET_IPV6: + case NET_INTERNAL: + return true; + case NET_ONION: + return m_addr.size() == ADDR_TORV2_SIZE; + case NET_I2P: + case NET_CJDNS: + return false; + case NET_UNROUTABLE: // m_net is never and should not be set to NET_UNROUTABLE + case NET_MAX: // m_net is never and should not be set to NET_MAX + assert(false); + } // no default case, so the compiler can warn about missing cases + + assert(false); +} + enum Network CNetAddr::GetNetwork() const { if (IsInternal()) @@ -744,9 +764,12 @@ std::vector<unsigned char> CNetAddr::GetGroup(const std::vector<bool> &asmap) co std::vector<unsigned char> CNetAddr::GetAddrBytes() const { - uint8_t serialized[V1_SERIALIZATION_SIZE]; - SerializeV1Array(serialized); - return {std::begin(serialized), std::end(serialized)}; + if (IsAddrV1Compatible()) { + uint8_t serialized[V1_SERIALIZATION_SIZE]; + SerializeV1Array(serialized); + return {std::begin(serialized), std::end(serialized)}; + } + return std::vector<unsigned char>(m_addr.begin(), m_addr.end()); } uint64_t CNetAddr::GetHash() const |