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. The two line-number columns refer to before and after.
src/net_processing.cpp
CHANGED
|
@@ -1001,6 +1001,7 @@ private:
|
|
|
1001
1001
|
std::vector<std::pair<Wtxid, CTransactionRef>> vExtraTxnForCompact GUARDED_BY(g_msgproc_mutex);
|
|
1002
1002
|
/** Offset into vExtraTxnForCompact to insert the next tx */
|
|
1003
1003
|
size_t vExtraTxnForCompactIt GUARDED_BY(g_msgproc_mutex) = 0;
|
|
1004
|
+
size_t m_extra_tx_memusage GUARDED_BY(g_msgproc_mutex){0};
|
|
1004
1005
|
|
|
1005
1006
|
/** Check whether the last unknown block a peer advertised is not yet known. */
|
|
1006
1007
|
void ProcessBlockAvailability(NodeId nodeid) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
|
|
@@ -1615,6 +1616,10 @@ void PeerManagerImpl::InitializeNode(const CNode& node, ServiceFlags our_service
|
|
|
1615
1616
|
our_services = static_cast<ServiceFlags>(our_services | NODE_BLOOM);
|
|
1616
1617
|
}
|
|
1617
1618
|
|
|
1619
|
+
if (node.HasPermission(NetPermissionFlags::BlockFilters)) {
|
|
1620
|
+
our_services = static_cast<ServiceFlags>(our_services | NODE_COMPACT_FILTERS);
|
|
1621
|
+
}
|
|
1622
|
+
|
|
1618
1623
|
PeerRef peer = std::make_shared<Peer>(nodeid, our_services, node.IsInboundConn());
|
|
1619
1624
|
{
|
|
1620
1625
|
LOCK(m_peer_mutex);
|
|
@@ -1793,6 +1798,7 @@ bool PeerManagerImpl::GetNodeStateStats(NodeId nodeid, CNodeStateStats& stats) c
|
|
|
1793
1798
|
const CNodeState* state = State(nodeid);
|
|
1794
1799
|
if (state == nullptr)
|
|
1795
1800
|
return false;
|
|
1801
|
+
stats.m_last_block_announcement = std::chrono::seconds{state->m_last_block_announcement};
|
|
1796
1802
|
stats.nSyncHeight = state->pindexBestKnownBlock ? state->pindexBestKnownBlock->nHeight : -1;
|
|
1797
1803
|
stats.nCommonHeight = state->pindexLastCommonBlock ? state->pindexLastCommonBlock->nHeight : -1;
|
|
1798
1804
|
for (const QueuedBlock& queue : state->vBlocksInFlight) {
|
|
@@ -1839,6 +1845,7 @@ bool PeerManagerImpl::GetNodeStateStats(NodeId nodeid, CNodeStateStats& stats) c
|
|
|
1839
1845
|
}
|
|
1840
1846
|
}
|
|
1841
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;
|
|
1842
1849
|
|
|
1843
1850
|
return true;
|
|
1844
1851
|
}
|
|
@@ -1884,12 +1891,26 @@ std::vector<CTransactionRef> PeerManagerImpl::AbortPrivateBroadcast(const uint25
|
|
|
1884
1891
|
|
|
1885
1892
|
void PeerManagerImpl::AddToCompactExtraTransactions(const CTransactionRef& tx)
|
|
1886
1893
|
{
|
|
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;
|
|
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;
|
|
1893
1914
|
}
|
|
1894
1915
|
|
|
1895
1916
|
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
1993
|
|
|
1973
1994
|
LOCK(cs_main);
|
|
1974
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
|
+
|
|
1975
2001
|
// Forget about all prior requests
|
|
1976
2002
|
RemoveBlockRequest(block_index.GetBlockHash(), std::nullopt);
|
|
1977
2003
|
|
|
@@ -2006,7 +2032,8 @@ PeerManagerImpl::PeerManagerImpl(CConnman& connman, AddrMan& addrman,
|
|
|
2006
2032
|
BanMan* banman, ChainstateManager& chainman,
|
|
2007
2033
|
CTxMemPool& pool, node::Warnings& warnings, Options opts)
|
|
2008
2034
|
: m_rng{opts.deterministic_rng},
|
|
2009
|
-
m_fee_filter_rounder{CFeeRate{DEFAULT_MIN_RELAY_TX_FEE}, m_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},
|
|
2010
2037
|
m_chainparams(chainman.GetParams()),
|
|
2011
2038
|
m_connman(connman),
|
|
2012
2039
|
m_addrman(addrman),
|
|
@@ -5627,7 +5654,7 @@ void PeerManagerImpl::MaybeSendSendHeaders(CNode& node, Peer& peer)
|
|
|
5627
5654
|
|
|
5628
5655
|
void PeerManagerImpl::MaybeSendFeefilter(CNode& pto, Peer& peer, std::chrono::microseconds current_time)
|
|
5629
5656
|
{
|
|
5630
|
-
if (m_opts.ignore_incoming_txs) return;
|
|
5657
|
+
if (m_opts.ignore_incoming_txs || !m_opts.send_feefilter) return;
|
|
5631
5658
|
if (pto.GetCommonVersion() < FEEFILTER_VERSION) return;
|
|
5632
5659
|
// peers with the forcerelay permission should not filter txs to us
|
|
5633
5660
|
if (pto.HasPermission(NetPermissionFlags::ForceRelay)) return;
|