Skip to content

Commit c97270d

Browse files
committed
Merge bitcoin#27499: net processing, refactor: Decouple PeerManager from gArgs
23c7b51 [net processing] Move -capturemessages to PeerManager::Options (dergoegge) bd59bda [net processing] Move -blockreconstructionextratxn to PeerManager::Options (dergoegge) 567c4e0 [net processing] Move -maxorphantx to PeerManager::Options (dergoegge) fa9e6d8 [net processing] Move -txreconciliation to PeerManager::Options (dergoegge) 4cfb7b9 [net processing] Use ignore_incoming_txs from m_opts (dergoegge) 8b87725 [net processing] Introduce PeerManager options (dergoegge) Pull request description: This PR decouples `PeerManager` from our global args manager by introducing `PeerManager::Options`. ACKs for top commit: stickies-v: re-ACK 23c7b51 TheCharlatan: ACK 23c7b51 Tree-SHA512: cd807b36ec018010e11935d3539fa7ed5015fdfb531d13a042a65b54ee8533a35a919a6a6c5fa293b5cba76000e9403c64dfd790fb9c649b7838544929b1fee8
2 parents d23fda0 + 23c7b51 commit c97270d

File tree

9 files changed

+87
-37
lines changed

9 files changed

+87
-37
lines changed

src/Makefile.am

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,7 @@ BITCOIN_CORE_H = \
224224
node/miner.h \
225225
node/mini_miner.h \
226226
node/minisketchwrapper.h \
227+
node/peerman_args.h \
227228
node/psbt.h \
228229
node/transaction.h \
229230
node/txreconciliation.h \
@@ -421,6 +422,7 @@ libbitcoin_node_a_SOURCES = \
421422
node/miner.cpp \
422423
node/mini_miner.cpp \
423424
node/minisketchwrapper.cpp \
425+
node/peerman_args.cpp \
424426
node/psbt.cpp \
425427
node/transaction.cpp \
426428
node/txreconciliation.cpp \

src/init.cpp

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050
#include <node/mempool_args.h>
5151
#include <node/mempool_persist_args.h>
5252
#include <node/miner.h>
53-
#include <node/txreconciliation.h>
53+
#include <node/peerman_args.h>
5454
#include <node/validation_cache_args.h>
5555
#include <policy/feerate.h>
5656
#include <policy/fees.h>
@@ -1539,9 +1539,16 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
15391539

15401540
ChainstateManager& chainman = *Assert(node.chainman);
15411541

1542+
1543+
PeerManager::Options peerman_opts{
1544+
.ignore_incoming_txs = ignores_incoming_txs,
1545+
};
1546+
ApplyArgsManOptions(args, peerman_opts);
1547+
15421548
assert(!node.peerman);
1543-
node.peerman = PeerManager::make(*node.connman, *node.addrman, node.banman.get(),
1544-
chainman, *node.mempool, ignores_incoming_txs);
1549+
node.peerman = PeerManager::make(*node.connman, *node.addrman,
1550+
node.banman.get(), chainman,
1551+
*node.mempool, peerman_opts);
15451552
RegisterValidationInterface(node.peerman.get());
15461553

15471554
// ********************************************************* Step 8: start indexers

src/net_processing.cpp

Lines changed: 18 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
#include <blockencodings.h>
1111
#include <blockfilter.h>
1212
#include <chainparams.h>
13-
#include <common/args.h>
1413
#include <consensus/amount.h>
1514
#include <consensus/validation.h>
1615
#include <deploymentstatus.h>
@@ -487,7 +486,7 @@ class PeerManagerImpl final : public PeerManager
487486
public:
488487
PeerManagerImpl(CConnman& connman, AddrMan& addrman,
489488
BanMan* banman, ChainstateManager& chainman,
490-
CTxMemPool& pool, bool ignore_incoming_txs);
489+
CTxMemPool& pool, Options opts);
491490

492491
/** Overridden from CValidationInterface. */
493492
void BlockConnected(const std::shared_ptr<const CBlock>& pblock, const CBlockIndex* pindexConnected) override
@@ -515,7 +514,7 @@ class PeerManagerImpl final : public PeerManager
515514
std::optional<std::string> FetchBlock(NodeId peer_id, const CBlockIndex& block_index) override
516515
EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex);
517516
bool GetNodeStateStats(NodeId nodeid, CNodeStateStats& stats) const override EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex);
518-
bool IgnoresIncomingTxs() override { return m_ignore_incoming_txs; }
517+
bool IgnoresIncomingTxs() override { return m_opts.ignore_incoming_txs; }
519518
void SendPings() override EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex);
520519
void RelayTransaction(const uint256& txid, const uint256& wtxid) override EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex);
521520
void SetBestHeight(int height) override { m_best_height = height; };
@@ -718,8 +717,7 @@ class PeerManagerImpl final : public PeerManager
718717
/** Next time to check for stale tip */
719718
std::chrono::seconds m_stale_tip_check_time GUARDED_BY(cs_main){0s};
720719

721-
/** Whether this node is running in -blocksonly mode */
722-
const bool m_ignore_incoming_txs;
720+
const Options m_opts;
723721

724722
bool RejectIncomingTxs(const CNode& peer) const;
725723

@@ -1212,7 +1210,7 @@ void PeerManagerImpl::MaybeSetPeerAsAnnouncingHeaderAndIDs(NodeId nodeid)
12121210
// When in -blocksonly mode, never request high-bandwidth mode from peers. Our
12131211
// mempool will not contain the transactions necessary to reconstruct the
12141212
// compact block.
1215-
if (m_ignore_incoming_txs) return;
1213+
if (m_opts.ignore_incoming_txs) return;
12161214

12171215
CNodeState* nodestate = State(nodeid);
12181216
if (!nodestate || !nodestate->m_provides_cmpctblocks) {
@@ -1650,13 +1648,12 @@ bool PeerManagerImpl::GetNodeStateStats(NodeId nodeid, CNodeStateStats& stats) c
16501648

16511649
void PeerManagerImpl::AddToCompactExtraTransactions(const CTransactionRef& tx)
16521650
{
1653-
size_t max_extra_txn = gArgs.GetIntArg("-blockreconstructionextratxn", DEFAULT_BLOCK_RECONSTRUCTION_EXTRA_TXN);
1654-
if (max_extra_txn <= 0)
1651+
if (m_opts.max_extra_txs <= 0)
16551652
return;
16561653
if (!vExtraTxnForCompact.size())
1657-
vExtraTxnForCompact.resize(max_extra_txn);
1654+
vExtraTxnForCompact.resize(m_opts.max_extra_txs);
16581655
vExtraTxnForCompact[vExtraTxnForCompactIt] = std::make_pair(tx->GetWitnessHash(), tx);
1659-
vExtraTxnForCompactIt = (vExtraTxnForCompactIt + 1) % max_extra_txn;
1656+
vExtraTxnForCompactIt = (vExtraTxnForCompactIt + 1) % m_opts.max_extra_txs;
16601657
}
16611658

16621659
void PeerManagerImpl::Misbehaving(Peer& peer, int howmuch, const std::string& message)
@@ -1809,25 +1806,25 @@ std::optional<std::string> PeerManagerImpl::FetchBlock(NodeId peer_id, const CBl
18091806

18101807
std::unique_ptr<PeerManager> PeerManager::make(CConnman& connman, AddrMan& addrman,
18111808
BanMan* banman, ChainstateManager& chainman,
1812-
CTxMemPool& pool, bool ignore_incoming_txs)
1809+
CTxMemPool& pool, Options opts)
18131810
{
1814-
return std::make_unique<PeerManagerImpl>(connman, addrman, banman, chainman, pool, ignore_incoming_txs);
1811+
return std::make_unique<PeerManagerImpl>(connman, addrman, banman, chainman, pool, opts);
18151812
}
18161813

18171814
PeerManagerImpl::PeerManagerImpl(CConnman& connman, AddrMan& addrman,
18181815
BanMan* banman, ChainstateManager& chainman,
1819-
CTxMemPool& pool, bool ignore_incoming_txs)
1816+
CTxMemPool& pool, Options opts)
18201817
: m_chainparams(chainman.GetParams()),
18211818
m_connman(connman),
18221819
m_addrman(addrman),
18231820
m_banman(banman),
18241821
m_chainman(chainman),
18251822
m_mempool(pool),
1826-
m_ignore_incoming_txs(ignore_incoming_txs)
1823+
m_opts{opts}
18271824
{
18281825
// While Erlay support is incomplete, it must be enabled explicitly via -txreconciliation.
18291826
// This argument can go away after Erlay support is complete.
1830-
if (gArgs.GetBoolArg("-txreconciliation", DEFAULT_TXRECONCILIATION_ENABLE)) {
1827+
if (opts.reconcile_txs) {
18311828
m_txreconciliation = std::make_unique<TxReconciliationTracker>(TXRECONCILIATION_VERSION);
18321829
}
18331830
}
@@ -2729,7 +2726,7 @@ void PeerManagerImpl::HeadersDirectFetchBlocks(CNode& pfrom, const Peer& peer, c
27292726
last_header.nHeight);
27302727
}
27312728
if (vGetData.size() > 0) {
2732-
if (!m_ignore_incoming_txs &&
2729+
if (!m_opts.ignore_incoming_txs &&
27332730
nodestate->m_provides_cmpctblocks &&
27342731
vGetData.size() == 1 &&
27352732
mapBlocksInFlight.size() == 1 &&
@@ -3434,7 +3431,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
34343431
// - we are not in -blocksonly mode.
34353432
const auto* tx_relay = peer->GetTxRelay();
34363433
if (tx_relay && WITH_LOCK(tx_relay->m_bloom_filter_mutex, return tx_relay->m_relay_txs) &&
3437-
!pfrom.IsAddrFetchConn() && !m_ignore_incoming_txs) {
3434+
!pfrom.IsAddrFetchConn() && !m_opts.ignore_incoming_txs) {
34383435
const uint64_t recon_salt = m_txreconciliation->PreRegisterPeer(pfrom.GetId());
34393436
m_connman.PushMessage(&pfrom, msg_maker.Make(NetMsgType::SENDTXRCNCL,
34403437
TXRECONCILIATION_VERSION, recon_salt));
@@ -4239,8 +4236,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
42394236
m_txrequest.ForgetTxHash(tx.GetWitnessHash());
42404237

42414238
// DoS prevention: do not allow m_orphanage to grow unbounded (see CVE-2012-3789)
4242-
unsigned int nMaxOrphanTx = (unsigned int)std::max((int64_t)0, gArgs.GetIntArg("-maxorphantx", DEFAULT_MAX_ORPHAN_TRANSACTIONS));
4243-
m_orphanage.LimitOrphans(nMaxOrphanTx);
4239+
m_orphanage.LimitOrphans(m_opts.max_orphan_txs);
42444240
} else {
42454241
LogPrint(BCLog::MEMPOOL, "not keeping orphan with rejected parents %s\n",tx.GetHash().ToString());
42464242
// We will continue to reject this tx since it has rejected
@@ -5008,7 +5004,7 @@ bool PeerManagerImpl::ProcessMessages(CNode* pfrom, std::atomic<bool>& interrupt
50085004
msg.m_recv.data()
50095005
);
50105006

5011-
if (gArgs.GetBoolArg("-capturemessages", false)) {
5007+
if (m_opts.capture_messages) {
50125008
CaptureMessage(pfrom->addr, msg.m_type, MakeUCharSpan(msg.m_recv), /*is_incoming=*/true);
50135009
}
50145010

@@ -5358,7 +5354,7 @@ void PeerManagerImpl::MaybeSendSendHeaders(CNode& node, Peer& peer)
53585354

53595355
void PeerManagerImpl::MaybeSendFeefilter(CNode& pto, Peer& peer, std::chrono::microseconds current_time)
53605356
{
5361-
if (m_ignore_incoming_txs) return;
5357+
if (m_opts.ignore_incoming_txs) return;
53625358
if (pto.GetCommonVersion() < FEEFILTER_VERSION) return;
53635359
// peers with the forcerelay permission should not filter txs to us
53645360
if (pto.HasPermission(NetPermissionFlags::ForceRelay)) return;
@@ -5426,7 +5422,7 @@ bool PeerManagerImpl::RejectIncomingTxs(const CNode& peer) const
54265422
if (peer.IsBlockOnlyConn()) return true;
54275423
if (peer.IsFeelerConn()) return true;
54285424
// In -blocksonly mode, peers need the 'relay' permission to send txs to us
5429-
if (m_ignore_incoming_txs && !peer.HasPermission(NetPermissionFlags::Relay)) return true;
5425+
if (m_opts.ignore_incoming_txs && !peer.HasPermission(NetPermissionFlags::Relay)) return true;
54305426
return false;
54315427
}
54325428

src/net_processing.h

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ class CChainParams;
1414
class CTxMemPool;
1515
class ChainstateManager;
1616

17+
/** Whether transaction reconciliation protocol should be enabled by default. */
18+
static constexpr bool DEFAULT_TXRECONCILIATION_ENABLE{false};
1719
/** Default for -maxorphantx, maximum number of orphan transactions kept in memory */
1820
static const unsigned int DEFAULT_MAX_ORPHAN_TRANSACTIONS = 100;
1921
/** Default number of orphan+recently-replaced txn to keep around for block reconstruction */
@@ -43,9 +45,18 @@ struct CNodeStateStats {
4345
class PeerManager : public CValidationInterface, public NetEventsInterface
4446
{
4547
public:
48+
struct Options {
49+
/** Whether this node is running in -blocksonly mode */
50+
bool ignore_incoming_txs{DEFAULT_BLOCKSONLY};
51+
bool reconcile_txs{DEFAULT_TXRECONCILIATION_ENABLE};
52+
uint32_t max_orphan_txs{DEFAULT_MAX_ORPHAN_TRANSACTIONS};
53+
size_t max_extra_txs{DEFAULT_BLOCK_RECONSTRUCTION_EXTRA_TXN};
54+
bool capture_messages{false};
55+
};
56+
4657
static std::unique_ptr<PeerManager> make(CConnman& connman, AddrMan& addrman,
4758
BanMan* banman, ChainstateManager& chainman,
48-
CTxMemPool& pool, bool ignore_incoming_txs);
59+
CTxMemPool& pool, Options opts);
4960
virtual ~PeerManager() { }
5061

5162
/**

src/node/peerman_args.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#include <node/peerman_args.h>
2+
3+
#include <common/args.h>
4+
#include <net_processing.h>
5+
6+
namespace node {
7+
8+
void ApplyArgsManOptions(const ArgsManager& argsman, PeerManager::Options& options)
9+
{
10+
if (auto value{argsman.GetBoolArg("-txreconciliation")}) options.reconcile_txs = *value;
11+
12+
if (auto value{argsman.GetIntArg("-maxorphantx")}) {
13+
options.max_orphan_txs = uint32_t(std::max(int64_t{0}, *value));
14+
}
15+
16+
if (auto value{argsman.GetIntArg("-blockreconstructionextratxn")}) {
17+
options.max_extra_txs = size_t(std::max(int64_t{0}, *value));
18+
}
19+
20+
if (auto value{argsman.GetBoolArg("-capturemessages")}) options.capture_messages = *value;
21+
}
22+
23+
} // namespace node
24+

src/node/peerman_args.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#ifndef BITCOIN_NODE_PEERMAN_ARGS_H
2+
#define BITCOIN_NODE_PEERMAN_ARGS_H
3+
4+
#include <net_processing.h>
5+
6+
class ArgsManager;
7+
8+
namespace node {
9+
void ApplyArgsManOptions(const ArgsManager& argsman, PeerManager::Options& options);
10+
} // namespace node
11+
12+
#endif // BITCOIN_NODE_PEERMAN_ARGS_H

src/node/txreconciliation.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@
1111
#include <memory>
1212
#include <tuple>
1313

14-
/** Whether transaction reconciliation protocol should be enabled by default. */
15-
static constexpr bool DEFAULT_TXRECONCILIATION_ENABLE{false};
1614
/** Supported transaction reconciliation protocol version */
1715
static constexpr uint32_t TXRECONCILIATION_VERSION{1};
1816

src/test/denialofservice_tests.cpp

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -132,8 +132,7 @@ BOOST_AUTO_TEST_CASE(stale_tip_peer_management)
132132
{
133133
NodeId id{0};
134134
auto connman = std::make_unique<ConnmanTestMsg>(0x1337, 0x1337, *m_node.addrman, *m_node.netgroupman);
135-
auto peerLogic = PeerManager::make(*connman, *m_node.addrman, nullptr,
136-
*m_node.chainman, *m_node.mempool, false);
135+
auto peerLogic = PeerManager::make(*connman, *m_node.addrman, nullptr, *m_node.chainman, *m_node.mempool, {});
137136

138137
constexpr int max_outbound_full_relay = MAX_OUTBOUND_FULL_RELAY_CONNECTIONS;
139138
CConnman::Options options;
@@ -209,8 +208,7 @@ BOOST_AUTO_TEST_CASE(block_relay_only_eviction)
209208
{
210209
NodeId id{0};
211210
auto connman = std::make_unique<ConnmanTestMsg>(0x1337, 0x1337, *m_node.addrman, *m_node.netgroupman);
212-
auto peerLogic = PeerManager::make(*connman, *m_node.addrman, nullptr,
213-
*m_node.chainman, *m_node.mempool, false);
211+
auto peerLogic = PeerManager::make(*connman, *m_node.addrman, nullptr, *m_node.chainman, *m_node.mempool, {});
214212

215213
constexpr int max_outbound_block_relay{MAX_BLOCK_RELAY_ONLY_CONNECTIONS};
216214
constexpr int64_t MINIMUM_CONNECT_TIME{30};
@@ -273,8 +271,7 @@ BOOST_AUTO_TEST_CASE(peer_discouragement)
273271

274272
auto banman = std::make_unique<BanMan>(m_args.GetDataDirBase() / "banlist", nullptr, DEFAULT_MISBEHAVING_BANTIME);
275273
auto connman = std::make_unique<ConnmanTestMsg>(0x1337, 0x1337, *m_node.addrman, *m_node.netgroupman);
276-
auto peerLogic = PeerManager::make(*connman, *m_node.addrman, banman.get(),
277-
*m_node.chainman, *m_node.mempool, false);
274+
auto peerLogic = PeerManager::make(*connman, *m_node.addrman, banman.get(), *m_node.chainman, *m_node.mempool, {});
278275

279276
CNetAddr tor_netaddr;
280277
BOOST_REQUIRE(
@@ -376,8 +373,7 @@ BOOST_AUTO_TEST_CASE(DoS_bantime)
376373

377374
auto banman = std::make_unique<BanMan>(m_args.GetDataDirBase() / "banlist", nullptr, DEFAULT_MISBEHAVING_BANTIME);
378375
auto connman = std::make_unique<CConnman>(0x1337, 0x1337, *m_node.addrman, *m_node.netgroupman);
379-
auto peerLogic = PeerManager::make(*connman, *m_node.addrman, banman.get(),
380-
*m_node.chainman, *m_node.mempool, false);
376+
auto peerLogic = PeerManager::make(*connman, *m_node.addrman, banman.get(), *m_node.chainman, *m_node.mempool, {});
381377

382378
banman->ClearBanned();
383379
int64_t nStartTime = GetTime();

src/test/util/setup_common.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include <node/kernel_notifications.h>
2828
#include <node/mempool_args.h>
2929
#include <node/miner.h>
30+
#include <node/peerman_args.h>
3031
#include <node/validation_cache_args.h>
3132
#include <noui.h>
3233
#include <policy/fees.h>
@@ -251,9 +252,12 @@ TestingSetup::TestingSetup(
251252
m_node.args->GetIntArg("-checkaddrman", 0));
252253
m_node.banman = std::make_unique<BanMan>(m_args.GetDataDirBase() / "banlist", nullptr, DEFAULT_MISBEHAVING_BANTIME);
253254
m_node.connman = std::make_unique<ConnmanTestMsg>(0x1337, 0x1337, *m_node.addrman, *m_node.netgroupman); // Deterministic randomness for tests.
255+
PeerManager::Options peerman_opts;
256+
ApplyArgsManOptions(*m_node.args, peerman_opts);
254257
m_node.peerman = PeerManager::make(*m_node.connman, *m_node.addrman,
255258
m_node.banman.get(), *m_node.chainman,
256-
*m_node.mempool, false);
259+
*m_node.mempool, peerman_opts);
260+
257261
{
258262
CConnman::Options options;
259263
options.m_msgproc = m_node.peerman.get();

0 commit comments

Comments
 (0)