Skip to content

Commit 2297b26

Browse files
committed
[net_processing] Pass chainparams to PeerLogicValidation constructor
Keep a references to chainparams, rather than calling the global Params() function every time it's needed. This is fine, since globalChainParams does not get updated once it's been set, and it's available at the point of constructing the PeerLogicValidation object.
1 parent 824bbd1 commit 2297b26

File tree

6 files changed

+40
-34
lines changed

6 files changed

+40
-34
lines changed

src/init.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1376,7 +1376,7 @@ bool AppInitMain(const util::Ref& context, NodeContext& node, interfaces::BlockA
13761376
node.chainman = &g_chainman;
13771377
ChainstateManager& chainman = *Assert(node.chainman);
13781378

1379-
node.peer_logic.reset(new PeerLogicValidation(*node.connman, node.banman.get(), *node.scheduler, chainman, *node.mempool));
1379+
node.peer_logic.reset(new PeerLogicValidation(chainparams, *node.connman, node.banman.get(), *node.scheduler, chainman, *node.mempool));
13801380
RegisterValidationInterface(node.peer_logic.get());
13811381

13821382
// sanitize comments per BIP-0014, format user agent and check total size

src/net_processing.cpp

Lines changed: 25 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1241,8 +1241,10 @@ static bool BlockRequestAllowed(const CBlockIndex* pindex, const Consensus::Para
12411241
(GetBlockProofEquivalentTime(*pindexBestHeader, *pindex, *pindexBestHeader, consensusParams) < STALE_RELAY_AGE_LIMIT);
12421242
}
12431243

1244-
PeerLogicValidation::PeerLogicValidation(CConnman& connman, BanMan* banman, CScheduler& scheduler, ChainstateManager& chainman, CTxMemPool& pool)
1245-
: m_connman(connman),
1244+
PeerLogicValidation::PeerLogicValidation(const CChainParams& chainparams, CConnman& connman, BanMan* banman,
1245+
CScheduler& scheduler, ChainstateManager& chainman, CTxMemPool& pool)
1246+
: m_chainparams(chainparams),
1247+
m_connman(connman),
12461248
m_banman(banman),
12471249
m_chainman(chainman),
12481250
m_mempool(pool),
@@ -2340,7 +2342,7 @@ static void ProcessGetCFCheckPt(CNode& peer, CDataStream& vRecv, const CChainPar
23402342

23412343
void PeerLogicValidation::ProcessMessage(CNode& pfrom, const std::string& msg_type, CDataStream& vRecv,
23422344
const std::chrono::microseconds time_received,
2343-
const CChainParams& chainparams, const std::atomic<bool>& interruptMsgProc)
2345+
const std::atomic<bool>& interruptMsgProc)
23442346
{
23452347
LogPrint(BCLog::NET, "received: %s (%u bytes) peer=%d\n", SanitizeString(msg_type), vRecv.size(), pfrom.GetId());
23462348
if (gArgs.IsArgSet("-dropmessagestest") && GetRand(gArgs.GetArg("-dropmessagestest", 0)) == 0)
@@ -2772,7 +2774,7 @@ void PeerLogicValidation::ProcessMessage(CNode& pfrom, const std::string& msg_ty
27722774
}
27732775

27742776
pfrom.vRecvGetData.insert(pfrom.vRecvGetData.end(), vInv.begin(), vInv.end());
2775-
ProcessGetData(pfrom, chainparams, m_connman, m_mempool, interruptMsgProc);
2777+
ProcessGetData(pfrom, m_chainparams, m_connman, m_mempool, interruptMsgProc);
27762778
return;
27772779
}
27782780

@@ -2825,7 +2827,7 @@ void PeerLogicValidation::ProcessMessage(CNode& pfrom, const std::string& msg_ty
28252827
}
28262828
// If pruning, don't inv blocks unless we have on disk and are likely to still have
28272829
// for some reasonable time window (1 hour) that block relay might require.
2828-
const int nPrunedBlocksLikelyToHave = MIN_BLOCKS_TO_KEEP - 3600 / chainparams.GetConsensus().nPowTargetSpacing;
2830+
const int nPrunedBlocksLikelyToHave = MIN_BLOCKS_TO_KEEP - 3600 / m_chainparams.GetConsensus().nPowTargetSpacing;
28292831
if (fPruneMode && (!(pindex->nStatus & BLOCK_HAVE_DATA) || pindex->nHeight <= ::ChainActive().Tip()->nHeight - nPrunedBlocksLikelyToHave))
28302832
{
28312833
LogPrint(BCLog::NET, " getblocks stopping, pruned or too old block at %d %s\n", pindex->nHeight, pindex->GetBlockHash().ToString());
@@ -2886,7 +2888,7 @@ void PeerLogicValidation::ProcessMessage(CNode& pfrom, const std::string& msg_ty
28862888
}
28872889

28882890
CBlock block;
2889-
bool ret = ReadBlockFromDisk(block, pindex, chainparams.GetConsensus());
2891+
bool ret = ReadBlockFromDisk(block, pindex, m_chainparams.GetConsensus());
28902892
assert(ret);
28912893

28922894
SendBlockTransactions(block, req, pfrom, m_connman);
@@ -2920,7 +2922,7 @@ void PeerLogicValidation::ProcessMessage(CNode& pfrom, const std::string& msg_ty
29202922
return;
29212923
}
29222924

2923-
if (!BlockRequestAllowed(pindex, chainparams.GetConsensus())) {
2925+
if (!BlockRequestAllowed(pindex, m_chainparams.GetConsensus())) {
29242926
LogPrint(BCLog::NET, "%s: ignoring request from peer=%i for old block header that isn't in the main chain\n", __func__, pfrom.GetId());
29252927
return;
29262928
}
@@ -3198,7 +3200,7 @@ void PeerLogicValidation::ProcessMessage(CNode& pfrom, const std::string& msg_ty
31983200

31993201
const CBlockIndex *pindex = nullptr;
32003202
BlockValidationState state;
3201-
if (!m_chainman.ProcessNewBlockHeaders({cmpctblock.header}, state, chainparams, &pindex)) {
3203+
if (!m_chainman.ProcessNewBlockHeaders({cmpctblock.header}, state, m_chainparams, &pindex)) {
32023204
if (state.IsInvalid()) {
32033205
MaybePunishNodeForBlock(pfrom.GetId(), state, /*via_compact_block*/ true, "invalid header via cmpctblock");
32043206
return;
@@ -3254,10 +3256,10 @@ void PeerLogicValidation::ProcessMessage(CNode& pfrom, const std::string& msg_ty
32543256
}
32553257

32563258
// If we're not close to tip yet, give up and let parallel block fetch work its magic
3257-
if (!fAlreadyInFlight && !CanDirectFetch(chainparams.GetConsensus()))
3259+
if (!fAlreadyInFlight && !CanDirectFetch(m_chainparams.GetConsensus()))
32583260
return;
32593261

3260-
if (IsWitnessEnabled(pindex->pprev, chainparams.GetConsensus()) && !nodestate->fSupportsDesiredCmpctVersion) {
3262+
if (IsWitnessEnabled(pindex->pprev, m_chainparams.GetConsensus()) && !nodestate->fSupportsDesiredCmpctVersion) {
32613263
// Don't bother trying to process compact blocks from v1 peers
32623264
// after segwit activates.
32633265
return;
@@ -3341,16 +3343,17 @@ void PeerLogicValidation::ProcessMessage(CNode& pfrom, const std::string& msg_ty
33413343
}
33423344
} // cs_main
33433345

3344-
if (fProcessBLOCKTXN)
3345-
return ProcessMessage(pfrom, NetMsgType::BLOCKTXN, blockTxnMsg, time_received, chainparams, interruptMsgProc);
3346+
if (fProcessBLOCKTXN) {
3347+
return ProcessMessage(pfrom, NetMsgType::BLOCKTXN, blockTxnMsg, time_received, interruptMsgProc);
3348+
}
33463349

33473350
if (fRevertToHeaderProcessing) {
33483351
// Headers received from HB compact block peers are permitted to be
33493352
// relayed before full validation (see BIP 152), so we don't want to disconnect
33503353
// the peer if the header turns out to be for an invalid block.
33513354
// Note that if a peer tries to build on an invalid chain, that
33523355
// will be detected and the peer will be disconnected/discouraged.
3353-
return ProcessHeadersMessage(pfrom, m_connman, m_chainman, m_mempool, {cmpctblock.header}, chainparams, /*via_compact_block=*/true);
3356+
return ProcessHeadersMessage(pfrom, m_connman, m_chainman, m_mempool, {cmpctblock.header}, m_chainparams, /*via_compact_block=*/true);
33543357
}
33553358

33563359
if (fBlockReconstructed) {
@@ -3370,7 +3373,7 @@ void PeerLogicValidation::ProcessMessage(CNode& pfrom, const std::string& msg_ty
33703373
// we have a chain with at least nMinimumChainWork), and we ignore
33713374
// compact blocks with less work than our tip, it is safe to treat
33723375
// reconstructed compact blocks as having been requested.
3373-
m_chainman.ProcessNewBlock(chainparams, pblock, /*fForceProcessing=*/true, &fNewBlock);
3376+
m_chainman.ProcessNewBlock(m_chainparams, pblock, /*fForceProcessing=*/true, &fNewBlock);
33743377
if (fNewBlock) {
33753378
pfrom.nLastBlockTime = GetTime();
33763379
} else {
@@ -3460,7 +3463,7 @@ void PeerLogicValidation::ProcessMessage(CNode& pfrom, const std::string& msg_ty
34603463
// disk-space attacks), but this should be safe due to the
34613464
// protections in the compact block handler -- see related comment
34623465
// in compact block optimistic reconstruction handling.
3463-
m_chainman.ProcessNewBlock(chainparams, pblock, /*fForceProcessing=*/true, &fNewBlock);
3466+
m_chainman.ProcessNewBlock(m_chainparams, pblock, /*fForceProcessing=*/true, &fNewBlock);
34643467
if (fNewBlock) {
34653468
pfrom.nLastBlockTime = GetTime();
34663469
} else {
@@ -3493,7 +3496,7 @@ void PeerLogicValidation::ProcessMessage(CNode& pfrom, const std::string& msg_ty
34933496
ReadCompactSize(vRecv); // ignore tx count; assume it is 0.
34943497
}
34953498

3496-
return ProcessHeadersMessage(pfrom, m_connman, m_chainman, m_mempool, headers, chainparams, /*via_compact_block=*/false);
3499+
return ProcessHeadersMessage(pfrom, m_connman, m_chainman, m_mempool, headers, m_chainparams, /*via_compact_block=*/false);
34973500
}
34983501

34993502
if (msg_type == NetMsgType::BLOCK)
@@ -3522,7 +3525,7 @@ void PeerLogicValidation::ProcessMessage(CNode& pfrom, const std::string& msg_ty
35223525
mapBlockSource.emplace(hash, std::make_pair(pfrom.GetId(), true));
35233526
}
35243527
bool fNewBlock = false;
3525-
m_chainman.ProcessNewBlock(chainparams, pblock, forceProcessing, &fNewBlock);
3528+
m_chainman.ProcessNewBlock(m_chainparams, pblock, forceProcessing, &fNewBlock);
35263529
if (fNewBlock) {
35273530
pfrom.nLastBlockTime = GetTime();
35283531
} else {
@@ -3751,17 +3754,17 @@ void PeerLogicValidation::ProcessMessage(CNode& pfrom, const std::string& msg_ty
37513754
}
37523755

37533756
if (msg_type == NetMsgType::GETCFILTERS) {
3754-
ProcessGetCFilters(pfrom, vRecv, chainparams, m_connman);
3757+
ProcessGetCFilters(pfrom, vRecv, m_chainparams, m_connman);
37553758
return;
37563759
}
37573760

37583761
if (msg_type == NetMsgType::GETCFHEADERS) {
3759-
ProcessGetCFHeaders(pfrom, vRecv, chainparams, m_connman);
3762+
ProcessGetCFHeaders(pfrom, vRecv, m_chainparams, m_connman);
37603763
return;
37613764
}
37623765

37633766
if (msg_type == NetMsgType::GETCFCHECKPT) {
3764-
ProcessGetCFCheckPt(pfrom, vRecv, chainparams, m_connman);
3767+
ProcessGetCFCheckPt(pfrom, vRecv, m_chainparams, m_connman);
37653768
return;
37663769
}
37673770

@@ -3839,7 +3842,6 @@ bool PeerLogicValidation::MaybeDiscourageAndDisconnect(CNode& pnode)
38393842

38403843
bool PeerLogicValidation::ProcessMessages(CNode* pfrom, std::atomic<bool>& interruptMsgProc)
38413844
{
3842-
const CChainParams& chainparams = Params();
38433845
//
38443846
// Message format
38453847
// (4) message start
@@ -3851,7 +3853,7 @@ bool PeerLogicValidation::ProcessMessages(CNode* pfrom, std::atomic<bool>& inter
38513853
bool fMoreWork = false;
38523854

38533855
if (!pfrom->vRecvGetData.empty())
3854-
ProcessGetData(*pfrom, chainparams, m_connman, m_mempool, interruptMsgProc);
3856+
ProcessGetData(*pfrom, m_chainparams, m_connman, m_mempool, interruptMsgProc);
38553857

38563858
if (!pfrom->orphan_work_set.empty()) {
38573859
std::list<CTransactionRef> removed_txn;
@@ -3916,7 +3918,7 @@ bool PeerLogicValidation::ProcessMessages(CNode* pfrom, std::atomic<bool>& inter
39163918
}
39173919

39183920
try {
3919-
ProcessMessage(*pfrom, msg_type, vRecv, msg.m_time, chainparams, interruptMsgProc);
3921+
ProcessMessage(*pfrom, msg_type, vRecv, msg.m_time, interruptMsgProc);
39203922
if (interruptMsgProc)
39213923
return false;
39223924
if (!pfrom->vRecvGetData.empty())

src/net_processing.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ static const int DISCOURAGEMENT_THRESHOLD{100};
2929

3030
class PeerLogicValidation final : public CValidationInterface, public NetEventsInterface {
3131
public:
32-
PeerLogicValidation(CConnman& connman, BanMan* banman, CScheduler& scheduler, ChainstateManager& chainman, CTxMemPool& pool);
32+
PeerLogicValidation(const CChainParams& chainparams, CConnman& connman, BanMan* banman,
33+
CScheduler& scheduler, ChainstateManager& chainman, CTxMemPool& pool);
3334

3435
/**
3536
* Overridden from CValidationInterface.
@@ -79,8 +80,7 @@ class PeerLogicValidation final : public CValidationInterface, public NetEventsI
7980

8081
/** Process a single message from a peer. Public for fuzz testing */
8182
void ProcessMessage(CNode& pfrom, const std::string& msg_type, CDataStream& vRecv,
82-
const std::chrono::microseconds time_received, const CChainParams& chainparams,
83-
const std::atomic<bool>& interruptMsgProc);
83+
const std::chrono::microseconds time_received, const std::atomic<bool>& interruptMsgProc);
8484

8585
private:
8686
/** Maybe disconnect a peer and discourage future connections from its address.
@@ -90,6 +90,7 @@ class PeerLogicValidation final : public CValidationInterface, public NetEventsI
9090
*/
9191
bool MaybeDiscourageAndDisconnect(CNode& pnode);
9292

93+
const CChainParams& m_chainparams;
9394
CConnman& m_connman;
9495
/** Pointer to this node's banman. May be nullptr - check existence before dereferencing. */
9596
BanMan* const m_banman;

src/test/denialofservice_tests.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,9 @@ BOOST_FIXTURE_TEST_SUITE(denialofservice_tests, TestingSetup)
7979
// work.
8080
BOOST_AUTO_TEST_CASE(outbound_slow_chain_eviction)
8181
{
82+
const CChainParams& chainparams = Params();
8283
auto connman = MakeUnique<CConnman>(0x1337, 0x1337);
83-
auto peerLogic = MakeUnique<PeerLogicValidation>(*connman, nullptr, *m_node.scheduler, *m_node.chainman, *m_node.mempool);
84+
auto peerLogic = MakeUnique<PeerLogicValidation>(chainparams, *connman, nullptr, *m_node.scheduler, *m_node.chainman, *m_node.mempool);
8485

8586
// Mock an outbound peer
8687
CAddress addr1(ip(0xa0b0c001), NODE_NONE);
@@ -149,8 +150,9 @@ static void AddRandomOutboundPeer(std::vector<CNode *> &vNodes, PeerLogicValidat
149150

150151
BOOST_AUTO_TEST_CASE(stale_tip_peer_management)
151152
{
153+
const CChainParams& chainparams = Params();
152154
auto connman = MakeUnique<CConnmanTest>(0x1337, 0x1337);
153-
auto peerLogic = MakeUnique<PeerLogicValidation>(*connman, nullptr, *m_node.scheduler, *m_node.chainman, *m_node.mempool);
155+
auto peerLogic = MakeUnique<PeerLogicValidation>(chainparams, *connman, nullptr, *m_node.scheduler, *m_node.chainman, *m_node.mempool);
154156

155157
const Consensus::Params& consensusParams = Params().GetConsensus();
156158
constexpr int max_outbound_full_relay = MAX_OUTBOUND_FULL_RELAY_CONNECTIONS;
@@ -221,9 +223,10 @@ BOOST_AUTO_TEST_CASE(stale_tip_peer_management)
221223

222224
BOOST_AUTO_TEST_CASE(peer_discouragement)
223225
{
226+
const CChainParams& chainparams = Params();
224227
auto banman = MakeUnique<BanMan>(GetDataDir() / "banlist.dat", nullptr, DEFAULT_MISBEHAVING_BANTIME);
225228
auto connman = MakeUnique<CConnman>(0x1337, 0x1337);
226-
auto peerLogic = MakeUnique<PeerLogicValidation>(*connman, banman.get(), *m_node.scheduler, *m_node.chainman, *m_node.mempool);
229+
auto peerLogic = MakeUnique<PeerLogicValidation>(chainparams, *connman, banman.get(), *m_node.scheduler, *m_node.chainman, *m_node.mempool);
227230

228231
banman->ClearBanned();
229232
CAddress addr1(ip(0xa0b0c001), NODE_NONE);
@@ -268,9 +271,10 @@ BOOST_AUTO_TEST_CASE(peer_discouragement)
268271

269272
BOOST_AUTO_TEST_CASE(DoS_bantime)
270273
{
274+
const CChainParams& chainparams = Params();
271275
auto banman = MakeUnique<BanMan>(GetDataDir() / "banlist.dat", nullptr, DEFAULT_MISBEHAVING_BANTIME);
272276
auto connman = MakeUnique<CConnman>(0x1337, 0x1337);
273-
auto peerLogic = MakeUnique<PeerLogicValidation>(*connman, banman.get(), *m_node.scheduler, *m_node.chainman, *m_node.mempool);
277+
auto peerLogic = MakeUnique<PeerLogicValidation>(chainparams, *connman, banman.get(), *m_node.scheduler, *m_node.chainman, *m_node.mempool);
274278

275279
banman->ClearBanned();
276280
int64_t nStartTime = GetTime();

src/test/fuzz/process_message.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,7 @@ void test_one_input(const std::vector<uint8_t>& buffer)
7676
g_setup->m_node.peer_logic->InitializeNode(&p2p_node);
7777
try {
7878
g_setup->m_node.peer_logic->ProcessMessage(p2p_node, random_message_type, random_bytes_data_stream,
79-
GetTime<std::chrono::microseconds>(), Params(),
80-
std::atomic<bool>{false});
79+
GetTime<std::chrono::microseconds>(), std::atomic<bool>{false});
8180
} catch (const std::ios_base::failure&) {
8281
}
8382
SyncWithValidationInterfaceQueue();

src/test/util/setup_common.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ TestingSetup::TestingSetup(const std::string& chainName, const std::vector<const
169169

170170
m_node.banman = MakeUnique<BanMan>(GetDataDir() / "banlist.dat", nullptr, DEFAULT_MISBEHAVING_BANTIME);
171171
m_node.connman = MakeUnique<CConnman>(0x1337, 0x1337); // Deterministic randomness for tests.
172-
m_node.peer_logic = MakeUnique<PeerLogicValidation>(*m_node.connman, m_node.banman.get(), *m_node.scheduler, *m_node.chainman, *m_node.mempool);
172+
m_node.peer_logic = MakeUnique<PeerLogicValidation>(chainparams, *m_node.connman, m_node.banman.get(), *m_node.scheduler, *m_node.chainman, *m_node.mempool);
173173
{
174174
CConnman::Options options;
175175
options.m_msgproc = m_node.peer_logic.get();

0 commit comments

Comments
 (0)