Skip to content
Bitcoin Roots

v31.1-roots.1 · Commit 5: [PATCH 05/17] feat(net): preserve Roots peer controls and health view on v31

src/net_processing.cpp

Before: src/net_processing.cpp · After: src/net_processing.cpp

File metadata
index e2f7126e3ce6ddfbf8db8f292627592f5a0ad354..550aa7142fce1b084c4f7378db475467e9c8192b 100644

Download original patch · Release notes

Diff rows 1–91 of 91. Line numbers refer to the original before/after files.

+ Added− RemovedUnmarked lines are context.

Scroll the code area horizontally to read long lines. Before is on the left; after is on the right. Unified view fits narrow screens more easily.

src/net_processing.cpp CHANGED
@@ -1001,6 +1001,7 @@ private:
1001
  std::vector<std::pair<Wtxid, CTransactionRef>> vExtraTxnForCompact GUARDED_BY(g_msgproc_mutex);
1002
  /** Offset into vExtraTxnForCompact to insert the next tx */
1003
  size_t vExtraTxnForCompactIt GUARDED_BY(g_msgproc_mutex) = 0;
 
1004
 
1005
  /** Check whether the last unknown block a peer advertised is not yet known. */
1006
  void ProcessBlockAvailability(NodeId nodeid) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
@@ -1615,6 +1616,10 @@ void PeerManagerImpl::InitializeNode(const CNode& node, ServiceFlags our_service
1615
  our_services = static_cast<ServiceFlags>(our_services | NODE_BLOOM);
1616
  }
1617
 
 
 
 
 
1618
  PeerRef peer = std::make_shared<Peer>(nodeid, our_services, node.IsInboundConn());
1619
  {
1620
  LOCK(m_peer_mutex);
@@ -1793,6 +1798,7 @@ bool PeerManagerImpl::GetNodeStateStats(NodeId nodeid, CNodeStateStats& stats) c
1793
  const CNodeState* state = State(nodeid);
1794
  if (state == nullptr)
1795
  return false;
 
1796
  stats.nSyncHeight = state->pindexBestKnownBlock ? state->pindexBestKnownBlock->nHeight : -1;
1797
  stats.nCommonHeight = state->pindexLastCommonBlock ? state->pindexLastCommonBlock->nHeight : -1;
1798
  for (const QueuedBlock& queue : state->vBlocksInFlight) {
@@ -1839,6 +1845,7 @@ bool PeerManagerImpl::GetNodeStateStats(NodeId nodeid, CNodeStateStats& stats) c
1839
  }
1840
  }
1841
  stats.time_offset = peer->m_time_offset;
 
1842
 
1843
  return true;
1844
  }
@@ -1884,12 +1891,26 @@ std::vector<CTransactionRef> PeerManagerImpl::AbortPrivateBroadcast(const uint25
1884
 
1885
  void PeerManagerImpl::AddToCompactExtraTransactions(const CTransactionRef& tx)
1886
  {
1887
- if (m_opts.max_extra_txs <= 0)
1888
- return;
1889
- if (!vExtraTxnForCompact.size())
1890
- vExtraTxnForCompact.resize(m_opts.max_extra_txs);
1891
- vExtraTxnForCompact[vExtraTxnForCompactIt] = std::make_pair(tx->GetWitnessHash(), tx);
1892
- vExtraTxnForCompactIt = (vExtraTxnForCompactIt + 1) % m_opts.max_extra_txs;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1893
  }
1894
 
1895
  void PeerManagerImpl::Misbehaving(Peer& peer, const std::string& message)
@@ -1972,6 +1993,11 @@ util::Expected<void, std::string> PeerManagerImpl::FetchBlock(NodeId peer_id, co
1972
 
1973
  LOCK(cs_main);
1974
 
 
 
 
 
 
1975
  // Forget about all prior requests
1976
  RemoveBlockRequest(block_index.GetBlockHash(), std::nullopt);
1977
 
@@ -2006,7 +2032,8 @@ PeerManagerImpl::PeerManagerImpl(CConnman& connman, AddrMan& addrman,
2006
  BanMan* banman, ChainstateManager& chainman,
2007
  CTxMemPool& pool, node::Warnings& warnings, Options opts)
2008
  : m_rng{opts.deterministic_rng},
2009
- m_fee_filter_rounder{CFeeRate{DEFAULT_MIN_RELAY_TX_FEE}, m_rng},
 
2010
  m_chainparams(chainman.GetParams()),
2011
  m_connman(connman),
2012
  m_addrman(addrman),
@@ -5627,7 +5654,7 @@ void PeerManagerImpl::MaybeSendSendHeaders(CNode& node, Peer& peer)
5627
 
5628
  void PeerManagerImpl::MaybeSendFeefilter(CNode& pto, Peer& peer, std::chrono::microseconds current_time)
5629
  {
5630
- if (m_opts.ignore_incoming_txs) return;
5631
  if (pto.GetCommonVersion() < FEEFILTER_VERSION) return;
5632
  // peers with the forcerelay permission should not filter txs to us
5633
  if (pto.HasPermission(NetPermissionFlags::ForceRelay)) return;
 
1001
  std::vector<std::pair<Wtxid, CTransactionRef>> vExtraTxnForCompact GUARDED_BY(g_msgproc_mutex);
1002
  /** Offset into vExtraTxnForCompact to insert the next tx */
1003
  size_t vExtraTxnForCompactIt GUARDED_BY(g_msgproc_mutex) = 0;
1004
+ size_t m_extra_tx_memusage GUARDED_BY(g_msgproc_mutex){0};
1005
 
1006
  /** Check whether the last unknown block a peer advertised is not yet known. */
1007
  void ProcessBlockAvailability(NodeId nodeid) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
 
1616
  our_services = static_cast<ServiceFlags>(our_services | NODE_BLOOM);
1617
  }
1618
 
1619
+ if (node.HasPermission(NetPermissionFlags::BlockFilters)) {
1620
+ our_services = static_cast<ServiceFlags>(our_services | NODE_COMPACT_FILTERS);
1621
+ }
1622
+
1623
  PeerRef peer = std::make_shared<Peer>(nodeid, our_services, node.IsInboundConn());
1624
  {
1625
  LOCK(m_peer_mutex);
 
1798
  const CNodeState* state = State(nodeid);
1799
  if (state == nullptr)
1800
  return false;
1801
+ stats.m_last_block_announcement = std::chrono::seconds{state->m_last_block_announcement};
1802
  stats.nSyncHeight = state->pindexBestKnownBlock ? state->pindexBestKnownBlock->nHeight : -1;
1803
  stats.nCommonHeight = state->pindexLastCommonBlock ? state->pindexLastCommonBlock->nHeight : -1;
1804
  for (const QueuedBlock& queue : state->vBlocksInFlight) {
 
1845
  }
1846
  }
1847
  stats.time_offset = peer->m_time_offset;
1848
+ stats.m_misbehavior_score = WITH_LOCK(peer->m_misbehavior_mutex, return peer->m_should_discourage) ? 100 : 0;
1849
 
1850
  return true;
1851
  }
 
1891
 
1892
  void PeerManagerImpl::AddToCompactExtraTransactions(const CTransactionRef& tx)
1893
  {
1894
+ const size_t usage{RecursiveDynamicUsage(*tx)};
1895
+ if (m_opts.max_extra_txs == 0 || m_opts.max_extra_txs_size == 0 ||
1896
+ usage >= BLOCK_RECONSTRUCTION_EXTRA_TXN_PER_TXN_SIZE_LIMIT || usage > m_opts.max_extra_txs_size) return;
1897
+ // Bound the slot allocation as well as transaction storage, even with an extreme count.
1898
+ const size_t slots{std::min<size_t>(m_opts.max_extra_txs, m_opts.max_extra_txs_size / sizeof(vExtraTxnForCompact[0]))};
1899
+ if (slots == 0) return;
1900
+ if (vExtraTxnForCompact.empty()) vExtraTxnForCompact.resize(slots);
1901
+ auto& entry = vExtraTxnForCompact[vExtraTxnForCompactIt];
1902
+ if (entry.second) m_extra_tx_memusage -= RecursiveDynamicUsage(*entry.second);
1903
+ entry = {};
1904
+ vExtraTxnForCompactIt = (vExtraTxnForCompactIt + 1) % slots;
1905
+ // Evict before adding to avoid overflowing size_t on 32-bit platforms.
1906
+ while (m_extra_tx_memusage > m_opts.max_extra_txs_size - usage) {
1907
+ auto& oldest = vExtraTxnForCompact[vExtraTxnForCompactIt];
1908
+ if (oldest.second) m_extra_tx_memusage -= RecursiveDynamicUsage(*oldest.second);
1909
+ oldest = {};
1910
+ vExtraTxnForCompactIt = (vExtraTxnForCompactIt + 1) % slots;
1911
+ }
1912
+ entry = std::make_pair(tx->GetWitnessHash(), tx);
1913
+ m_extra_tx_memusage += usage;
1914
  }
1915
 
1916
  void PeerManagerImpl::Misbehaving(Peer& peer, const std::string& message)
 
1993
 
1994
  LOCK(cs_main);
1995
 
1996
+ // Reject duplicates before removing in-flight tracking for this peer.
1997
+ for (auto range = mapBlocksInFlight.equal_range(block_index.GetBlockHash()); range.first != range.second; ++range.first) {
1998
+ if (range.first->second.first == peer_id) return util::Unexpected{"Already requested from this peer"};
1999
+ }
2000
+
2001
  // Forget about all prior requests
2002
  RemoveBlockRequest(block_index.GetBlockHash(), std::nullopt);
2003
 
 
2032
  BanMan* banman, ChainstateManager& chainman,
2033
  CTxMemPool& pool, node::Warnings& warnings, Options opts)
2034
  : m_rng{opts.deterministic_rng},
2035
+ // Retain Roots' fee-filter bucket spacing across its low/high incremental fee profiles.
2036
+ m_fee_filter_rounder{CFeeRate{pool.m_opts.incremental_relay_feerate.GetFeePerK() < 1000 ? 100 : 1000}, m_rng},
2037
  m_chainparams(chainman.GetParams()),
2038
  m_connman(connman),
2039
  m_addrman(addrman),
 
5654
 
5655
  void PeerManagerImpl::MaybeSendFeefilter(CNode& pto, Peer& peer, std::chrono::microseconds current_time)
5656
  {
5657
+ if (m_opts.ignore_incoming_txs || !m_opts.send_feefilter) return;
5658
  if (pto.GetCommonVersion() < FEEFILTER_VERSION) return;
5659
  // peers with the forcerelay permission should not filter txs to us
5660
  if (pto.HasPermission(NetPermissionFlags::ForceRelay)) return;