Move special CAddress-without-nTime logic to net_processing #20541

pull sipa wants to merge 2 commits into bitcoin:master from sipa:202012_addr_without_time_is_no_addr changing 2 files +21 −25
  1. sipa commented at 7:04 pm on December 1, 2020: member

    Historically, the VERSION message contains an “addrMe” and an “addrYou”. As these are sent before version negotiation is complete, the protocol version is INIT_PROTO_VERSION (209), and in that protocol, CAddress is serialized without nTime.

    This is in fact the only situation left where a CAddress is (de)serialized without nTime. As it’s such a simple structure (CService for ip/port + uint64_t for nServices), just inline that structure in the few places where it occurs, and remove the logic for dealing with missing nTime from CAddress.

  2. sipa added the label P2P on Dec 1, 2020
  3. sipa added the label Refactoring on Dec 1, 2020
  4. sipa force-pushed on Dec 1, 2020
  5. DrahtBot commented at 5:16 am on December 2, 2020: member

    The following sections might be updated with supplementary metadata relevant to reviewers and maintainers.

    Conflicts

    Reviewers, this pull request conflicts with the following ones:

    • #22778 (net processing: Reduce resource usage for inbound block-relay-only connections by jnewbery)
    • #22777 (net processing: don’t request tx relay on feeler connections by jnewbery)
    • #21160 (net/net processing: Move tx inventory into net_processing by jnewbery)

    If you consider this pull request important, please also help to review the conflicting pull requests. Ideally, start with the one that should be merged first.

  6. in src/net_processing.cpp:502 in 2eef441a1c outdated
    502+    CService addr_you = addr.IsRoutable() && !IsProxy(addr) && addr.IsAddrV1Compatible() ? addr : CService();
    503 
    504-    connman.PushMessage(&pnode, CNetMsgMaker(INIT_PROTO_VERSION).Make(NetMsgType::VERSION, PROTOCOL_VERSION, (uint64_t)nLocalNodeServices, nTime, addrYou, addrMe,
    505+    connman.PushMessage(&pnode, CNetMsgMaker(INIT_PROTO_VERSION).Make(NetMsgType::VERSION, PROTOCOL_VERSION, (uint64_t)nLocalNodeServices, nTime,
    506+            addr_you, (uint64_t)addr.nServices, // Together the pre-version-31402 serialization of CAddress "addrYou" (without nTime)
    507+            CService(), (uint64_t)nLocalNodeServices, // Together the pre-version-31402 serialization of CAddress "addrMe" (without nTime)
    


    vasild commented at 8:31 am on December 2, 2020:

    “services” must go before the address and port.

    0            (uint64_t)addr.nServices, addr_you, // Together the pre-version-31402 serialization of CAddress "addrYou" (without nTime)
    1            (uint64_t)nLocalNodeServices, CService(), // Together the pre-version-31402 serialization of CAddress "addrMe" (without nTime)
    

    lontivero commented at 2:58 pm on December 2, 2020:
    Yes. No test caught this.

    sipa commented at 11:21 pm on December 2, 2020:
    Fixed.
  7. in src/net_processing.cpp:2454 in 2eef441a1c outdated
    2302         bool fRelay = true;
    2303 
    2304-        vRecv >> nVersion >> nServiceInt >> nTime >> addrMe;
    2305-        nServices = ServiceFlags(nServiceInt);
    2306+        vRecv >> nVersion >> Using<CustomUintFormatter<8>>(nServices) >> nTime;
    2307+        // The pre-31402 serialization of addrMe (which didn't include nTime):
    


    vasild commented at 8:36 am on December 2, 2020:

    What is 31402?

    0$ git grep 31402
    1$
    

    sipa commented at 9:43 am on December 2, 2020:

    31402 is the protocol version that introduced the nTime field in CAddress. INIT_PROTO_VERSION (=209) being below it is the reason why the addresses inside the version message don’t have it. There is no code left that depends on this, as all connections must be MIN_PEER_PROTO_VERSION (31800) after version negotiation now.

    • 209 is from may 2010
    • 31402 is from october 2010
    • 31800 is from december 2010
  8. in src/net_processing.cpp:2305 in 2eef441a1c outdated
    2303 
    2304-        vRecv >> nVersion >> nServiceInt >> nTime >> addrMe;
    2305-        nServices = ServiceFlags(nServiceInt);
    2306+        vRecv >> nVersion >> Using<CustomUintFormatter<8>>(nServices) >> nTime;
    2307+        // The pre-31402 serialization of addrMe (which didn't include nTime):
    2308+        vRecv >> static_cast<CService&>(addrMe) >> Using<CustomUintFormatter<8>>(addrMe.nServices);
    


    vasild commented at 8:41 am on December 2, 2020:
    ditto: swap services and address

    sipa commented at 11:21 pm on December 2, 2020:
    Fixed.
  9. in src/net_processing.cpp:2326 in 2eef441a1c outdated
    2320@@ -2322,8 +2321,11 @@ void PeerManager::ProcessMessage(CNode& pfrom, const std::string& msg_type, CDat
    2321             return;
    2322         }
    2323 
    2324-        if (!vRecv.empty())
    2325-            vRecv >> addrFrom >> nNonce;
    2326+        if (!vRecv.empty()) {
    2327+            // The pre-31402 serialization of addrFrom (which didn't include nTime).
    2328+            vRecv >> static_cast<CService&>(addrFrom) >> Using<CustomUintFormatter<8>>(addrFrom.nServices);
    


    vasild commented at 8:42 am on December 2, 2020:
    ditto: swap services and address

    sipa commented at 11:21 pm on December 2, 2020:
    Fixed.
  10. in src/protocol.h:377 in 2eef441a1c outdated
    372@@ -373,16 +373,7 @@ class CAddress : public CService
    373         if (s.GetType() & SER_DISK) {
    374             READWRITE(nVersion);
    375         }
    376-        if ((s.GetType() & SER_DISK) ||
    377-            (nVersion != INIT_PROTO_VERSION && !(s.GetType() & SER_GETHASH))) {
    


    vasild commented at 9:35 am on December 2, 2020:
    By removing this we assume that for non-disk serialization s.GetType() & SER_GETHASH is always false. I.e. SER_GETHASH is not used in non-disk ser/deser of CAddress. I think this is the case indeed.

    sipa commented at 11:23 pm on December 2, 2020:
    Yes, this is the case. #20516 adds an assert for this, actually.
  11. MarcoFalke commented at 10:41 am on December 2, 2020: member

    Concept ACK.

    Does this conflict with any backports we might want to do for 0.21?

  12. sipa force-pushed on Dec 2, 2020
  13. sipa commented at 11:23 pm on December 2, 2020: member
    @MarcoFalke I don’t think so. It doesn’t conflict with #20516 (either can be backported without affecting the other). Anything else you’re thinking of?
  14. vasild approved
  15. vasild commented at 6:52 am on December 3, 2020: member

    ACK 158c0ec1

    It is somewhat worrying that all tests passed with the swapped services and address, but when I think about it - it is 8 bytes service flags + 16 bytes address + 2 bytes port. I guess we can’t do any sanity check on those as any 26 random bytes could be valid.

  16. MarcoFalke commented at 7:28 am on December 3, 2020: member

    It is somewhat worrying that all tests passed with the swapped services and address

    Indeed. I think we should add unit test vectors for all message types with an example message and the expected deserialization? Assert that both are identical. Though, message format (deserialization) is handled in the same function that does the processing, so I am not sure how to test this in general without rewriting net_processing.

  17. sipa commented at 7:08 pm on December 3, 2020: member

    It is somewhat worrying that all tests passed with the swapped services and address

    It is, but that’s at least partially explained by the fact that we barely use these values. One is ignored entirely, the other is used for statistics about our local IP. The nService fields are also ignored entirely.

    I think we should add unit test vectors for all message types with an example message and the expected deserialization?

    That makes sense.

  18. fanquake deleted a comment on Dec 3, 2020
  19. fanquake deleted a comment on Dec 3, 2020
  20. fanquake deleted a comment on Dec 3, 2020
  21. fanquake deleted a comment on Dec 3, 2020
  22. naumenkogs commented at 1:48 am on December 4, 2020: member
    Concept ACK
  23. lontivero commented at 2:55 am on December 4, 2020: contributor
    ACK 158c0ec
  24. DrahtBot added the label Needs rebase on Dec 10, 2020
  25. fanquake deleted a comment on Mar 8, 2021
  26. sipa force-pushed on Jul 3, 2021
  27. sipa commented at 0:13 am on July 3, 2021: member
    Rebased.
  28. DrahtBot removed the label Needs rebase on Jul 3, 2021
  29. in src/net_processing.cpp:2476 in 775954ac5f outdated
    2470@@ -2472,8 +2471,11 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
    2471             return;
    2472         }
    2473 
    2474-        if (!vRecv.empty())
    2475-            vRecv >> addrFrom >> nNonce;
    2476+        if (!vRecv.empty()) {
    2477+            // The pre-31402 serialization of addrFrom (which didn't include nTime).
    2478+            vRecv >> Using<CustomUintFormatter<8>>(addrFrom.nServices) >> static_cast<CService&>(addrFrom);
    


    jnewbery commented at 8:10 am on July 6, 2021:

    Since addFrom is just thrown away, maybe make this more explicit:

     0--- a/src/net_processing.cpp
     1+++ b/src/net_processing.cpp
     2@@ -2439,7 +2439,6 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
     3 
     4         int64_t nTime;
     5         CAddress addrMe;
     6-        CAddress addrFrom;
     7         uint64_t nNonce = 1;
     8         ServiceFlags nServices;
     9         int nVersion;
    10@@ -2472,8 +2471,12 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
    11         }
    12 
    13         if (!vRecv.empty()) {
    14-            // The pre-31402 serialization of addrFrom (which didn't include nTime).
    15-            vRecv >> Using<CustomUintFormatter<8>>(addrFrom.nServices) >> static_cast<CService&>(addrFrom);
    16+            // The version message includes information about the sending node which we don't use:
    17+            //   - 8 bytes (service bits)
    18+            //   - 16 bytes (ipv6 address)
    19+            //   - 2 bytes (port)
    20+            uint8_t unused[26];
    21+            vRecv >> unused;
    22             vRecv >> nNonce;
    23         }
    24         if (!vRecv.empty()) {
    

    MarcoFalke commented at 11:20 am on July 9, 2021:
    Agree that addrFrom can be removed completely if it is never read from

    sipa commented at 7:17 pm on August 20, 2021:
    Done (using vRecv.Ignore(26); instead).

    jnewbery commented at 3:35 pm on August 25, 2021:
    Thanks for teaching me about CDataStream.ignore()!
  30. in src/net_processing.cpp:2455 in 775954ac5f outdated
    2453         if (nTime < 0) {
    2454             nTime = 0;
    2455         }
    2456-        nServices = ServiceFlags(nServiceInt);
    2457+        // The pre-31402 serialization of addrMe (which didn't include nTime):
    2458+        vRecv >> Using<CustomUintFormatter<8>>(addrMe.nServices) >> static_cast<CService&>(addrMe);
    


    jnewbery commented at 8:15 am on July 6, 2021:

    The service bits here are never used (we don’t care what the peer thinks our services are), so we can be more explicit in discarding them and only using the CService data:

     0--- a/src/net_processing.cpp
     1+++ b/src/net_processing.cpp
     2@@ -2438,7 +2438,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
     3         }
     4 
     5         int64_t nTime;
     6-        CAddress addrMe;
     7+        CService addrMe;
     8         CAddress addrFrom;
     9         uint64_t nNonce = 1;
    10         ServiceFlags nServices;
    11@@ -2451,8 +2451,10 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
    12         if (nTime < 0) {
    13             nTime = 0;
    14         }
    15-        // The pre-31402 serialization of addrMe (which didn't include nTime):
    16-        vRecv >> Using<CustomUintFormatter<8>>(addrMe.nServices) >> static_cast<CService&>(addrMe);
    17+        // Ignore the addrMe service bits sent by the peer
    18+        uint8_t unused_service_bits[8];
    19+        vRecv >> unused_service_bits;
    20+        vRecv >> addrMe;
    21         if (!pfrom.IsInboundConn())
    22         {
    23             m_addrman.SetServices(pfrom.addr, nServices);
    

    sipa commented at 7:17 pm on August 20, 2021:
    Done (using vRecv.ignore(8); instead).
  31. in src/net_processing.cpp:1046 in 775954ac5f outdated
    1046-    CAddress addrMe = CAddress(CService(), nLocalNodeServices);
    1047+    CService addr_you = addr.IsRoutable() && !IsProxy(addr) && addr.IsAddrV1Compatible() ? addr : CService();
    1048 
    1049     const bool tx_relay = !m_ignore_incoming_txs && pnode.m_tx_relay != nullptr;
    1050-    m_connman.PushMessage(&pnode, CNetMsgMaker(INIT_PROTO_VERSION).Make(NetMsgType::VERSION, PROTOCOL_VERSION, (uint64_t)nLocalNodeServices, nTime, addrYou, addrMe,
    1051+    m_connman.PushMessage(&pnode, CNetMsgMaker(INIT_PROTO_VERSION).Make(NetMsgType::VERSION, PROTOCOL_VERSION, (uint64_t)nLocalNodeServices, nTime,
    


    jnewbery commented at 8:29 am on July 6, 2021:

    Rather than having these casts in the Make() call, perhaps it’s a bit more legible as:

     0--- a/src/net_processing.cpp
     1+++ b/src/net_processing.cpp
     2@@ -1034,18 +1034,19 @@ void PeerManagerImpl::PushNodeVersion(CNode& pnode, int64_t nTime)
     3     // Note that pnode->GetLocalServices() is a reflection of the local
     4     // services we were offering when the CNode object was created for this
     5     // peer.
     6-    ServiceFlags nLocalNodeServices = pnode.GetLocalServices();
     7+    auto my_services = static_cast<uint64_t>(pnode.GetLocalServices());
     8     uint64_t nonce = pnode.GetLocalNonce();
     9     const int nNodeStartingHeight{m_best_height};
    10     NodeId nodeid = pnode.GetId();
    11     CAddress addr = pnode.addr;
    12 
    13     CService addr_you = addr.IsRoutable() && !IsProxy(addr) && addr.IsAddrV1Compatible() ? addr : CService();
    14+    auto your_services = static_cast<uint64_t>(addr.nServices);
    15 
    16     const bool tx_relay = !m_ignore_incoming_txs && pnode.m_tx_relay != nullptr;
    17-    m_connman.PushMessage(&pnode, CNetMsgMaker(INIT_PROTO_VERSION).Make(NetMsgType::VERSION, PROTOCOL_VERSION, (uint64_t)nLocalNodeServices, nTime,
    18-            (uint64_t)addr.nServices, addr_you, // Together the pre-version-31402 serialization of CAddress "addrYou" (without nTime)
    19-            (uint64_t)nLocalNodeServices, CService(), // Together the pre-version-31402 serialization of CAddress "addrMe" (without nTime)
    20+    m_connman.PushMessage(&pnode, CNetMsgMaker(INIT_PROTO_VERSION).Make(NetMsgType::VERSION, PROTOCOL_VERSION, my_services, nTime,
    21+            your_services, addr_you, // Together the pre-version-31402 serialization of CAddress "addrYou" (without nTime)
    22+            my_services, CService(), // Together the pre-version-31402 serialization of CAddress "addrMe" (without nTime)
    23             nonce, strSubVersion, nNodeStartingHeight, tx_relay));
    24 
    25     if (fLogIPs) {
    

    sipa commented at 7:18 pm on August 20, 2021:
    Done.
  32. in src/net_processing.cpp:1047 in 775954ac5f outdated
    1047+    CService addr_you = addr.IsRoutable() && !IsProxy(addr) && addr.IsAddrV1Compatible() ? addr : CService();
    1048 
    1049     const bool tx_relay = !m_ignore_incoming_txs && pnode.m_tx_relay != nullptr;
    1050-    m_connman.PushMessage(&pnode, CNetMsgMaker(INIT_PROTO_VERSION).Make(NetMsgType::VERSION, PROTOCOL_VERSION, (uint64_t)nLocalNodeServices, nTime, addrYou, addrMe,
    1051+    m_connman.PushMessage(&pnode, CNetMsgMaker(INIT_PROTO_VERSION).Make(NetMsgType::VERSION, PROTOCOL_VERSION, (uint64_t)nLocalNodeServices, nTime,
    1052+            (uint64_t)addr.nServices, addr_you, // Together the pre-version-31402 serialization of CAddress "addrYou" (without nTime)
    


    jnewbery commented at 8:32 am on July 6, 2021:
    I’m not sure that references to version 31402 are very useful (beyond being a historical footnote). The version message contains {services, ipv6 addr, port} elements - the fact that that also used to be how address records used to be serialized in addr messages is not helpful in understanding the current protocol.

    sipa commented at 7:18 pm on August 20, 2021:
    I think they’re useful for the time being, as I’d expect more descriptions and documentations of the protocol will keep referring to these fields as CAddresses.

    jnewbery commented at 3:35 pm on August 25, 2021:
    Seems reasonable
  33. jnewbery commented at 8:33 am on July 6, 2021: member
    Concept ACK.
  34. jnewbery commented at 8:41 am on July 6, 2021: member

    When we receive a version message, we ignore the following fields:

    • (4) receiver’s services
    • (7) sender’s services (duplicate with field 2 - services)
    • (8/9) sender’s ipv6 addr/port

    Perhaps in the next p2p version bump, we should explicitly document those fields as unused, since there’s no purpose for them.

  35. vasild approved
  36. vasild commented at 10:19 am on July 9, 2021: member
    ACK 775954ac5ffd2b0d6f89a5b35e4120f0d170c884
  37. sipa force-pushed on Aug 20, 2021
  38. in src/net_processing.cpp:2527 in 79aa69c084 outdated
    2524+        if (!vRecv.empty()) {
    2525+            // The version message includes information about the sending node which we don't use:
    2526+            //   - 8 bytes (service bits)
    2527+            //   - 16 bytes (ipv6 address)
    2528+            //   - 2 bytes (port)
    2529+            vRecv.ignore(26);
    


    MarcoFalke commented at 1:56 pm on August 21, 2021:
    nNonce uninitialized?

    sipa commented at 11:53 pm on August 21, 2021:
    Fixed.
  39. in src/net_processing.cpp:1090 in 79aa69c084 outdated
    1086@@ -1087,25 +1087,25 @@ void PeerManagerImpl::PushNodeVersion(CNode& pnode, int64_t nTime)
    1087     // Note that pnode->GetLocalServices() is a reflection of the local
    1088     // services we were offering when the CNode object was created for this
    1089     // peer.
    1090-    ServiceFlags nLocalNodeServices = pnode.GetLocalServices();
    1091+    auto my_services = (uint64_t)pnode.GetLocalServices();
    


    MarcoFalke commented at 1:58 pm on August 21, 2021:
    uint64_t my_services{pnode.GetLocalServices()}; is shorter, safer, and looks better

    sipa commented at 11:53 pm on August 21, 2021:
    Agree, done.
  40. in src/net_processing.cpp:1097 in 79aa69c084 outdated
    1097-    CAddress addrYou = addr.IsRoutable() && !IsProxy(addr) && addr.IsAddrV1Compatible() ?
    1098-                           addr :
    1099-                           CAddress(CService(), addr.nServices);
    1100-    CAddress addrMe = CAddress(CService(), nLocalNodeServices);
    1101+    CService addr_you = addr.IsRoutable() && !IsProxy(addr) && addr.IsAddrV1Compatible() ? addr : CService();
    1102+    auto your_services = (uint64_t)addr.nServices;
    


    MarcoFalke commented at 1:59 pm on August 21, 2021:
    same

    sipa commented at 11:53 pm on August 21, 2021:
    Done.
  41. refactor: move CAddress-without-nTime logic to net_processing
    Historically, the VERSION message contains an "addrMe" and an "addrYou". As
    these are sent before version negotiation is complete, the protocol version is
    INIT_PROTO_VERSION (209), and in that protocol, CAddress is serialized without
    nTime.
    
    This is in fact the only situation left where a CAddress is (de)serialized
    without nTime. As it's such a simple structure (CService for ip/port + uint64_t
    for nServices), just inline that structure in the few places where it occurs,
    and remove the logic for dealing with missing nTime from CAddress.
    5d47860334
  42. Drop us=... message in net debug for sending version message
    The us=... message in the debug log when sending a version message is
    always [::]:0, because we no longer send our own address there.
    Therefore, this information is entirely redundant. Remove it.
    75290ae61e
  43. sipa force-pushed on Aug 21, 2021
  44. Zero-1729 commented at 9:52 am on August 22, 2021: contributor
    crACK 75290ae61e37f9b7c432b59d03eca6f07f7529cd
  45. in src/net_processing.cpp:1097 in 75290ae61e
    1097-    CAddress addrYou = addr.IsRoutable() && !IsProxy(addr) && addr.IsAddrV1Compatible() ?
    1098-                           addr :
    1099-                           CAddress(CService(), addr.nServices);
    1100-    CAddress addrMe = CAddress(CService(), nLocalNodeServices);
    1101+    CService addr_you = addr.IsRoutable() && !IsProxy(addr) && addr.IsAddrV1Compatible() ? addr : CService();
    1102+    uint64_t your_services{addr.nServices};
    


    jonatack commented at 3:04 pm on August 22, 2021:

    nit, can be const

     0-    uint64_t my_services{pnode.GetLocalServices()};
     1-    uint64_t nonce = pnode.GetLocalNonce();
     2+    const uint64_t my_services{pnode.GetLocalServices()};
     3+    const uint64_t nonce{pnode.GetLocalNonce()};
     4     const int nNodeStartingHeight{m_best_height};
     5-    NodeId nodeid = pnode.GetId();
     6+    const NodeId nodeid{pnode.GetId()};
     7     CAddress addr = pnode.addr;
     8 
     9-    CService addr_you = addr.IsRoutable() && !IsProxy(addr) && addr.IsAddrV1Compatible() ? addr : CService();
    10-    uint64_t your_services{addr.nServices};
    11+    const CService addr_you{addr.IsRoutable() && !IsProxy(addr) && addr.IsAddrV1Compatible() ? addr : CService()};
    12+    const uint64_t your_services{addr.nServices};
    

    sipa commented at 2:37 pm on August 23, 2021:
    Will include this if I have to retouch for other reasons.
  46. jonatack commented at 3:07 pm on August 22, 2021: member

    ACK 75290ae61e37f9b7c432b59d03eca6f07f7529cd

    Tested on signet

     0$ ./src/bitcoind -signet -debug=net -logips
     1$ grep version ~/.bitcoin/signet/debug.log
     2...
     32021-08-22T15:01:44Z received: version (103 bytes) peer=6
     42021-08-22T15:01:44Z sending version (109 bytes) peer=6
     52021-08-22T15:01:44Z send version message: version 70016, blocks=52221, them=[::]:0, txrelay=1, peer=6
     62021-08-22T15:01:44Z receive version message: /Satoshi:22.99.0/: version 70016, blocks=52221, us=[::]:0, txrelay=1, peer=6, peeraddr=127.0.0.1:40326
     72021-08-22T15:02:06Z sending version (109 bytes) peer=7
     82021-08-22T15:02:06Z send version message: version 70016, blocks=52221, them=[::]:0, txrelay=1, peer=7
     92021-08-22T15:02:07Z received: version (103 bytes) peer=7
    102021-08-22T15:02:07Z receive version message: /Satoshi:22.99.0/: version 70016, blocks=52221, us=[::]:0, txrelay=1, peer=7, peeraddr=q3z526imdoo2pdujkfp5vslshni2niewlbxfokejfkddkezxutagezyd.onion:38333
    112021-08-22T15:02:07Z New outbound peer connected: version: 70016, blocks=52221, peer=7, peeraddr=q3z526imdoo2pdujkfp5vslshni2niewlbxfokejfkddkezxutagezyd.onion:38333 (outbound-full-relay)
    122021-08-22T15:02:11Z sending version (109 bytes) peer=8
    132021-08-22T15:02:11Z send version message: version 70016, blocks=52221, them=[::]:0, txrelay=1, peer=8
    142021-08-22T15:02:12Z received: version (103 bytes) peer=8
    152021-08-22T15:02:12Z receive version message: /Satoshi:21.99.0/: version 70016, blocks=52221, us=[::]:0, txrelay=1, peer=8, peeraddr=uvj2uaxjztqtvmd5d27bgmfyfn6v3c2px2am2utbniuea55eblhid7qd.onion:38333
    162021-08-22T15:02:12Z New outbound peer connected: version: 70016, blocks=52221, peer=8, peeraddr=uvj2uaxjztqtvmd5d27bgmfyfn6v3c2px2am2utbniuea55eblhid7qd.onion:38333 (outbound-full-relay)
    172021-08-22T15:02:12Z sending version (109 bytes) peer=9
    182021-08-22T15:02:12Z send version message: version 70016, blocks=52221, them=95.217.184.148:38333, txrelay=1, peer=9
    192021-08-22T15:02:13Z received: version (102 bytes) peer=9
    202021-08-22T15:02:13Z receive version message: /Satoshi:0.21.1/: version 70016, blocks=52221, us=184.75.221.35:38484, txrelay=1, peer=9, peeraddr=95.217.184.148:38333
    212021-08-22T15:02:13Z New outbound peer connected: version: 70016, blocks=52221, peer=9, peeraddr=95.217.184.148:38333 (outbound-full-relay)
    222021-08-22T15:02:20Z sending version (109 bytes) peer=10
    232021-08-22T15:02:20Z send version message: version 70016, blocks=52221, them=[::]:0, txrelay=1, peer=10
    242021-08-22T15:02:21Z received: version (102 bytes) peer=10
    252021-08-22T15:02:21Z receive version message: /Satoshi:0.21.1/: version 70016, blocks=52221, us=[::]:0, txrelay=1, peer=10, peeraddr=s7fcvn5rblem7tiquhhr7acjdhu7wsawcph7ck44uxyd6sismumemcyd.onion:38333
    262021-08-22T15:02:21Z New outbound peer connected: version: 70016, blocks=52221, peer=10, peeraddr=s7fcvn5rblem7tiquhhr7acjdhu7wsawcph7ck44uxyd6sismumemcyd.onion:38333 (outbound-full-relay)
    
  47. vasild approved
  48. vasild commented at 2:36 pm on August 23, 2021: member
    ACK 75290ae61e37f9b7c432b59d03eca6f07f7529cd
  49. MarcoFalke commented at 4:20 pm on August 23, 2021: member
    crACK
  50. MarcoFalke merged this on Aug 23, 2021
  51. MarcoFalke closed this on Aug 23, 2021

  52. sidhujag referenced this in commit 4d6494a1c6 on Aug 23, 2021
  53. jnewbery commented at 3:47 pm on August 25, 2021: member

    Code review ACK 75290ae61e37f9b7c432b59d03eca6f07f7529cd

    The comment here:

    https://github.com/bitcoin/bitcoin/blob/75290ae61e37f9b7c432b59d03eca6f07f7529cd/src/protocol.h#L439

    Can probably be removed at this point.

  54. MarcoFalke commented at 3:49 pm on August 25, 2021: member
  55. DrahtBot locked this on Aug 25, 2022

github-metadata-mirror

This is a metadata mirror of the GitHub repository bitcoin/bitcoin. This site is not affiliated with GitHub. Content is generated from a GitHub metadata backup.
generated: 2024-12-18 21:12 UTC

This site is hosted by @0xB10C
More mirrored repositories can be found on mirror.b10c.me