From 184557e8e03f76ff18dacdb32c12692d8578691f Mon Sep 17 00:00:00 2001 From: John Newbery Date: Sun, 21 Jun 2020 20:25:11 -0400 Subject: [PATCH] [net processing] Move hashContinue to net processing Also rename to m_continuation_block to better communicate meaning. --- src/net.cpp | 1 - src/net.h | 1 - src/net_processing.cpp | 11 +++++------ src/net_processing.h | 5 +++++ 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/net.cpp b/src/net.cpp index f6b58c5b2a..7df0d11d37 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -2955,7 +2955,6 @@ CNode::CNode(NodeId idIn, ServiceFlags nLocalServicesIn, int nMyStartingHeightIn { hSocket = hSocketIn; addrName = addrNameIn == "" ? addr.ToStringIPPort() : addrNameIn; - hashContinue = uint256(); if (conn_type_in != ConnectionType::BLOCK_RELAY) { m_tx_relay = MakeUnique(); } diff --git a/src/net.h b/src/net.h index 885f21f2c4..1520a54686 100644 --- a/src/net.h +++ b/src/net.h @@ -993,7 +993,6 @@ protected: mapMsgCmdSize mapRecvBytesPerMsgCmd GUARDED_BY(cs_vRecv); public: - uint256 hashContinue; // We selected peer as (compact blocks) high-bandwidth peer (BIP152) std::atomic m_bip152_highbandwidth_to{false}; // Peer selected us as (compact blocks) high-bandwidth peer (BIP152) diff --git a/src/net_processing.cpp b/src/net_processing.cpp index 8dafd98d76..4b0bc2bcd2 100644 --- a/src/net_processing.cpp +++ b/src/net_processing.cpp @@ -1475,7 +1475,7 @@ static void RelayAddress(const CNode& originator, connman.ForEachNodeThen(std::move(sortfunc), std::move(pushfunc)); } -void static ProcessGetBlockData(CNode& pfrom, const CChainParams& chainparams, const CInv& inv, CConnman& connman) +void static ProcessGetBlockData(CNode& pfrom, Peer& peer, const CChainParams& chainparams, const CInv& inv, CConnman& connman) { bool send = false; std::shared_ptr a_recent_block; @@ -1616,15 +1616,14 @@ void static ProcessGetBlockData(CNode& pfrom, const CChainParams& chainparams, c } // Trigger the peer node to send a getblocks request for the next batch of inventory - if (inv.hash == pfrom.hashContinue) - { + if (inv.hash == peer.m_continuation_block) { // Send immediately. This must send even if redundant, // and we want it right after the last block so they don't // wait for other stuff first. std::vector vInv; vInv.push_back(CInv(MSG_BLOCK, ::ChainActive().Tip()->GetBlockHash())); connman.PushMessage(&pfrom, msgMaker.Make(NetMsgType::INV, vInv)); - pfrom.hashContinue.SetNull(); + peer.m_continuation_block.SetNull(); } } } @@ -1724,7 +1723,7 @@ void static ProcessGetData(CNode& pfrom, Peer& peer, const CChainParams& chainpa if (it != peer.m_getdata_requests.end() && !pfrom.fPauseSend) { const CInv &inv = *it++; if (inv.IsGenBlkMsg()) { - ProcessGetBlockData(pfrom, chainparams, inv, connman); + ProcessGetBlockData(pfrom, peer, chainparams, inv, connman); } // else: If the first item on the queue is an unknown type, we erase it // and continue processing the queue on the next call. @@ -2805,7 +2804,7 @@ void PeerManager::ProcessMessage(CNode& pfrom, const std::string& msg_type, CDat // When this block is requested, we'll send an inv that'll // trigger the peer to getblocks the next batch of inventory. LogPrint(BCLog::NET, " getblocks stopping at limit %d %s\n", pindex->nHeight, pindex->GetBlockHash().ToString()); - pfrom.hashContinue = pindex->GetBlockHash(); + peer->m_continuation_block = pindex->GetBlockHash(); break; } } diff --git a/src/net_processing.h b/src/net_processing.h index 3080a7da4c..32c5043a9d 100644 --- a/src/net_processing.h +++ b/src/net_processing.h @@ -76,6 +76,11 @@ struct Peer { /** This peer's reported block height when we connected */ std::atomic m_starting_height{-1}; + /** The final block hash that we sent in an `inv` message to this peer. + * When the peer requests this block, we send an `inv` message to trigger + * the peer to request the next sequence of block hashes. + * Most peers use headers-first syncing, which doesn't use this mechanism */ + uint256 m_continuation_block{}; /** Set of txids to reconsider once their parent transactions have been accepted **/ std::set m_orphan_work_set GUARDED_BY(g_cs_orphans);