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;
|