Skip to content

Commit bd8090b

Browse files
committed
merge bitcoin#18698: Make g_chainman internal to validation
1 parent 2bb3c9c commit bd8090b

18 files changed

+166
-140
lines changed

src/init.cpp

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -293,9 +293,9 @@ void PrepareShutdown(NodeContext& node)
293293
}
294294

295295
// FlushStateToDisk generates a ChainStateFlushed callback, which we should avoid missing
296-
{
296+
if (node.chainman) {
297297
LOCK(cs_main);
298-
for (CChainState* chainstate : g_chainman.GetAll()) {
298+
for (CChainState* chainstate : node.chainman->GetAll()) {
299299
if (chainstate->CanFlushToDisk()) {
300300
chainstate->ForceFlushStateToDisk();
301301
}
@@ -320,9 +320,9 @@ void PrepareShutdown(NodeContext& node)
320320
// up with our current chain to avoid any strange pruning edge cases and make
321321
// next startup faster by avoiding rescan.
322322

323-
{
323+
if (node.chainman) {
324324
LOCK(cs_main);
325-
for (CChainState* chainstate : g_chainman.GetAll()) {
325+
for (CChainState* chainstate : node.chainman->GetAll()) {
326326
if (chainstate->CanFlushToDisk()) {
327327
chainstate->ForceFlushStateToDisk();
328328
chainstate->ResetCoinsViews();
@@ -395,7 +395,8 @@ void Shutdown(NodeContext& node)
395395
// Shutdown part 2: delete wallet instance
396396
globalVerifyHandle.reset();
397397
ECC_Stop();
398-
if (node.mempool) node.mempool = nullptr;
398+
node.mempool = nullptr;
399+
node.chainman = nullptr;
399400
node.scheduler.reset();
400401
LogPrintf("%s: done\n", __func__);
401402
}
@@ -866,7 +867,7 @@ static void CleanupBlockRevFiles()
866867
}
867868
}
868869

869-
static void ThreadImport(std::vector<fs::path> vImportFiles)
870+
static void ThreadImport(ChainstateManager& chainman, std::vector<fs::path> vImportFiles)
870871
{
871872
const CChainParams& chainparams = Params();
872873
util::ThreadRename("loadblk");
@@ -934,9 +935,9 @@ static void ThreadImport(std::vector<fs::path> vImportFiles)
934935
// scan for better chains in the block chain database, that are not yet connected in the active best chain
935936

936937
// We can't hold cs_main during ActivateBestChain even though we're accessing
937-
// the g_chainman unique_ptrs since ABC requires us not to be holding cs_main, so retrieve
938+
// the chainman unique_ptrs since ABC requires us not to be holding cs_main, so retrieve
938939
// the relevant pointers before the ABC call.
939-
for (CChainState* chainstate : WITH_LOCK(::cs_main, return g_chainman.GetAll())) {
940+
for (CChainState* chainstate : WITH_LOCK(::cs_main, return chainman.GetAll())) {
940941
CValidationState state;
941942
if (!chainstate->ActivateBestChain(state, chainparams, nullptr)) {
942943
LogPrintf("Failed to connect best block (%s)\n", FormatStateMessage(state));
@@ -1775,8 +1776,11 @@ bool AppInitMain(const util::Ref& context, NodeContext& node, interfaces::BlockA
17751776
// which are all started after this, may use it from the node context.
17761777
assert(!node.mempool);
17771778
node.mempool = &::mempool;
1779+
assert(!node.chainman);
1780+
node.chainman = &g_chainman;
1781+
ChainstateManager& chainman = EnsureChainman(node);
17781782

1779-
node.peer_logic.reset(new PeerLogicValidation(node.connman.get(), node.banman.get(), *node.scheduler, *node.mempool, gArgs.GetBoolArg("-enablebip61", DEFAULT_ENABLE_BIP61)));
1783+
node.peer_logic.reset(new PeerLogicValidation(node.connman.get(), node.banman.get(), *node.scheduler, *node.chainman, *node.mempool, gArgs.GetBoolArg("-enablebip61", DEFAULT_ENABLE_BIP61)));
17801784
RegisterValidationInterface(node.peer_logic.get());
17811785

17821786
// sanitize comments per BIP-0014, format user agent and check total size
@@ -1977,7 +1981,7 @@ bool AppInitMain(const util::Ref& context, NodeContext& node, interfaces::BlockA
19771981

19781982
try {
19791983
LOCK(cs_main);
1980-
g_chainman.InitializeChainstate();
1984+
chainman.InitializeChainstate();
19811985
UnloadBlockIndex();
19821986

19831987
// new CBlockTreeDB tries to delete the existing file, which
@@ -2008,7 +2012,7 @@ bool AppInitMain(const util::Ref& context, NodeContext& node, interfaces::BlockA
20082012
// block file from disk.
20092013
// Note that it also sets fReindex based on the disk flag!
20102014
// From here on out fReindex and fReset mean something different!
2011-
if (!LoadBlockIndex(chainparams)) {
2015+
if (!chainman.LoadBlockIndex(chainparams)) {
20122016
if (ShutdownRequested()) break;
20132017
strLoadError = _("Error loading block database");
20142018
break;
@@ -2067,7 +2071,7 @@ bool AppInitMain(const util::Ref& context, NodeContext& node, interfaces::BlockA
20672071
// block tree into BlockIndex()!
20682072

20692073
bool failed_chainstate_init = false;
2070-
for (CChainState* chainstate : g_chainman.GetAll()) {
2074+
for (CChainState* chainstate : chainman.GetAll()) {
20712075
LogPrintf("Initializing chainstate %s\n", chainstate->ToString());
20722076
chainstate->InitCoinsDB(
20732077
/* cache_size_bytes */ nCoinDBCache,
@@ -2129,7 +2133,7 @@ bool AppInitMain(const util::Ref& context, NodeContext& node, interfaces::BlockA
21292133
break;
21302134
}
21312135

2132-
for (CChainState* chainstate : g_chainman.GetAll()) {
2136+
for (CChainState* chainstate : chainman.GetAll()) {
21332137
if (!is_coinsview_empty(chainstate)) {
21342138
uiInterface.InitMessage(_("Verifying blocks...").translated);
21352139
if (fHavePruned && gArgs.GetArg("-checkblocks", DEFAULT_CHECKBLOCKS) > MIN_BLOCKS_TO_KEEP) {
@@ -2257,7 +2261,7 @@ bool AppInitMain(const util::Ref& context, NodeContext& node, interfaces::BlockA
22572261
nLocalServices = ServiceFlags(nLocalServices & ~NODE_NETWORK);
22582262
if (!fReindex) {
22592263
LOCK(cs_main);
2260-
for (CChainState* chainstate : g_chainman.GetAll()) {
2264+
for (CChainState* chainstate : chainman.GetAll()) {
22612265
uiInterface.InitMessage(_("Pruning blockstore...").translated);
22622266
chainstate->PruneAndFlush();
22632267
}
@@ -2418,7 +2422,7 @@ bool AppInitMain(const util::Ref& context, NodeContext& node, interfaces::BlockA
24182422
vImportFiles.push_back(strFile);
24192423
}
24202424

2421-
threadGroup.create_thread(std::bind(&ThreadImport, vImportFiles));
2425+
threadGroup.create_thread([=, &chainman] { ThreadImport(chainman, vImportFiles); });
24222426

24232427
// Wait for genesis block to be processed
24242428
{

src/net_processing.cpp

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1171,8 +1171,8 @@ static bool BlockRequestAllowed(const CBlockIndex* pindex, const Consensus::Para
11711171
(GetBlockProofEquivalentTime(*pindexBestHeader, *pindex, *pindexBestHeader, consensusParams) < STALE_RELAY_AGE_LIMIT);
11721172
}
11731173

1174-
PeerLogicValidation::PeerLogicValidation(CConnman* connmanIn, BanMan* banman, CScheduler &scheduler, CTxMemPool& pool, bool enable_bip61)
1175-
: connman(connmanIn), m_banman(banman), m_mempool(pool), m_stale_tip_check_time(0), m_enable_bip61(enable_bip61) {
1174+
PeerLogicValidation::PeerLogicValidation(CConnman* connmanIn, BanMan* banman, CScheduler &scheduler, ChainstateManager& chainman, CTxMemPool& pool, bool enable_bip61)
1175+
: connman(connmanIn), m_banman(banman), m_chainman(chainman), m_mempool(pool), m_stale_tip_check_time(0), m_enable_bip61(enable_bip61) {
11761176
// Initialize global variables that cannot be constructed at startup.
11771177
recentRejects.reset(new CRollingBloomFilter(120000, 0.000001));
11781178

@@ -1873,7 +1873,7 @@ inline void static SendBlockTransactions(const CBlock& block, const BlockTransac
18731873
connman->PushMessage(pfrom, msgMaker.Make(NetMsgType::BLOCKTXN, resp));
18741874
}
18751875

1876-
bool static ProcessHeadersMessage(CNode *pfrom, CConnman *connman, CTxMemPool& mempool, const std::vector<CBlockHeader>& headers, const CChainParams& chainparams, bool punish_duplicate_invalid)
1876+
bool static ProcessHeadersMessage(CNode *pfrom, CConnman *connman, ChainstateManager& chainman, CTxMemPool& mempool, const std::vector<CBlockHeader>& headers, const CChainParams& chainparams, bool punish_duplicate_invalid)
18771877
{
18781878
const CNetMsgMaker msgMaker(pfrom->GetSendVersion());
18791879
size_t nCount = headers.size();
@@ -1936,7 +1936,7 @@ bool static ProcessHeadersMessage(CNode *pfrom, CConnman *connman, CTxMemPool& m
19361936

19371937
CValidationState state;
19381938
CBlockHeader first_invalid_header;
1939-
if (!ProcessNewBlockHeaders(headers, state, chainparams, &pindexLast, &first_invalid_header)) {
1939+
if (!chainman.ProcessNewBlockHeaders(headers, state, chainparams, &pindexLast, &first_invalid_header)) {
19401940
int nDoS;
19411941
if (state.IsInvalid(nDoS)) {
19421942
LOCK(cs_main);
@@ -2437,7 +2437,7 @@ std::pair<bool /*ret*/, bool /*do_return*/> static ValidateDSTX(CCoinJoinBroadca
24372437
return {true, false};
24382438
}
24392439

2440-
bool ProcessMessage(CNode* pfrom, const std::string& msg_type, CDataStream& vRecv, int64_t nTimeReceived, const CChainParams& chainparams, CTxMemPool& mempool, CConnman* connman, BanMan* banman, const std::atomic<bool>& interruptMsgProc, bool enable_bip61)
2440+
bool ProcessMessage(CNode* pfrom, const std::string& msg_type, CDataStream& vRecv, int64_t nTimeReceived, const CChainParams& chainparams, ChainstateManager& chainman, CTxMemPool& mempool, CConnman* connman, BanMan* banman, const std::atomic<bool>& interruptMsgProc, bool enable_bip61)
24412441
{
24422442
LogPrint(BCLog::NET, "received: %s (%u bytes) peer=%d\n", SanitizeString(msg_type), vRecv.size(), pfrom->GetId());
24432443
statsClient.inc("message.received." + SanitizeString(msg_type), 1.0f);
@@ -3391,7 +3391,7 @@ bool ProcessMessage(CNode* pfrom, const std::string& msg_type, CDataStream& vRec
33913391

33923392
const CBlockIndex *pindex = nullptr;
33933393
CValidationState state;
3394-
if (!ProcessNewBlockHeaders({cmpctblock.header}, state, chainparams, &pindex)) {
3394+
if (!chainman.ProcessNewBlockHeaders({cmpctblock.header}, state, chainparams, &pindex)) {
33953395
int nDoS;
33963396
if (state.IsInvalid(nDoS)) {
33973397
if (nDoS > 0) {
@@ -3535,15 +3535,15 @@ bool ProcessMessage(CNode* pfrom, const std::string& msg_type, CDataStream& vRec
35353535
} // cs_main
35363536

35373537
if (fProcessBLOCKTXN)
3538-
return ProcessMessage(pfrom, NetMsgType::BLOCKTXN, blockTxnMsg, nTimeReceived, chainparams, mempool, connman, banman, interruptMsgProc, enable_bip61);
3538+
return ProcessMessage(pfrom, NetMsgType::BLOCKTXN, blockTxnMsg, nTimeReceived, chainparams, chainman, mempool, connman, banman, interruptMsgProc, enable_bip61);
35393539

35403540
if (fRevertToHeaderProcessing) {
35413541
// Headers received from HB compact block peers are permitted to be
35423542
// relayed before full validation (see BIP 152), so we don't want to disconnect
35433543
// the peer if the header turns out to be for an invalid block.
35443544
// Note that if a peer tries to build on an invalid chain, that
35453545
// will be detected and the peer will be banned.
3546-
return ProcessHeadersMessage(pfrom, connman, mempool, {cmpctblock.header}, chainparams, /*punish_duplicate_invalid=*/false);
3546+
return ProcessHeadersMessage(pfrom, connman, chainman, mempool, {cmpctblock.header}, chainparams, /*punish_duplicate_invalid=*/false);
35473547
}
35483548

35493549
if (fBlockReconstructed) {
@@ -3563,7 +3563,7 @@ bool ProcessMessage(CNode* pfrom, const std::string& msg_type, CDataStream& vRec
35633563
// we have a chain with at least nMinimumChainWork), and we ignore
35643564
// compact blocks with less work than our tip, it is safe to treat
35653565
// reconstructed compact blocks as having been requested.
3566-
ProcessNewBlock(chainparams, pblock, /*fForceProcessing=*/true, &fNewBlock);
3566+
chainman.ProcessNewBlock(chainparams, pblock, /*fForceProcessing=*/true, &fNewBlock);
35673567
if (fNewBlock) {
35683568
pfrom->nLastBlockTime = GetTime();
35693569
} else {
@@ -3652,7 +3652,7 @@ bool ProcessMessage(CNode* pfrom, const std::string& msg_type, CDataStream& vRec
36523652
// disk-space attacks), but this should be safe due to the
36533653
// protections in the compact block handler -- see related comment
36543654
// in compact block optimistic reconstruction handling.
3655-
ProcessNewBlock(chainparams, pblock, /*fForceProcessing=*/true, &fNewBlock);
3655+
chainman.ProcessNewBlock(chainparams, pblock, /*fForceProcessing=*/true, &fNewBlock);
36563656
if (fNewBlock) {
36573657
pfrom->nLastBlockTime = GetTime();
36583658
} else {
@@ -3701,7 +3701,7 @@ bool ProcessMessage(CNode* pfrom, const std::string& msg_type, CDataStream& vRec
37013701
// disconnect the peer if it is using one of our outbound connection
37023702
// slots.
37033703
bool should_punish = !pfrom->fInbound && !pfrom->m_manual_connection;
3704-
return ProcessHeadersMessage(pfrom, connman, mempool, headers, chainparams, should_punish);
3704+
return ProcessHeadersMessage(pfrom, connman, chainman, mempool, headers, chainparams, should_punish);
37053705
}
37063706

37073707
if (msg_type == NetMsgType::BLOCK)
@@ -3729,7 +3729,7 @@ bool ProcessMessage(CNode* pfrom, const std::string& msg_type, CDataStream& vRec
37293729
mapBlockSource.emplace(hash, std::make_pair(pfrom->GetId(), true));
37303730
}
37313731
bool fNewBlock = false;
3732-
ProcessNewBlock(chainparams, pblock, forceProcessing, &fNewBlock);
3732+
chainman.ProcessNewBlock(chainparams, pblock, forceProcessing, &fNewBlock);
37333733
if (fNewBlock) {
37343734
pfrom->nLastBlockTime = GetTime();
37353735
} else {
@@ -4163,7 +4163,7 @@ bool PeerLogicValidation::ProcessMessages(CNode* pfrom, std::atomic<bool>& inter
41634163
bool fRet = false;
41644164
try
41654165
{
4166-
fRet = ProcessMessage(pfrom, msg_type, vRecv, msg.m_time, chainparams, m_mempool, connman, m_banman, interruptMsgProc, m_enable_bip61);
4166+
fRet = ProcessMessage(pfrom, msg_type, vRecv, msg.m_time, chainparams, m_chainman, m_mempool, connman, m_banman, interruptMsgProc, m_enable_bip61);
41674167
if (interruptMsgProc)
41684168
return false;
41694169
if (!pfrom->vRecvGetData.empty())

src/net_processing.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include <validationinterface.h>
1313

1414
class CTxMemPool;
15+
class ChainstateManager;
1516

1617
extern CCriticalSection cs_main;
1718

@@ -28,11 +29,12 @@ class PeerLogicValidation final : public CValidationInterface, public NetEventsI
2829
private:
2930
CConnman* const connman;
3031
BanMan* const m_banman;
32+
ChainstateManager& m_chainman;
3133
CTxMemPool& m_mempool;
3234

3335
bool SendRejectsAndCheckIfBanned(CNode* pnode, bool enable_bip61) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
3436
public:
35-
PeerLogicValidation(CConnman* connmanIn, BanMan* banman, CScheduler &scheduler, CTxMemPool& pool, bool enable_bip61);
37+
PeerLogicValidation(CConnman* connmanIn, BanMan* banman, CScheduler &scheduler, ChainstateManager& chainman, CTxMemPool& pool, bool enable_bip61);
3638

3739
/**
3840
* Overridden from CValidationInterface.

src/node/context.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@
55
#ifndef BITCOIN_NODE_CONTEXT_H
66
#define BITCOIN_NODE_CONTEXT_H
77

8+
#include <cassert>
89
#include <memory>
910
#include <vector>
1011

1112
class BanMan;
1213
class CConnman;
1314
class CScheduler;
1415
class CTxMemPool;
16+
class ChainstateManager;
1517
class PeerLogicValidation;
1618
namespace interfaces {
1719
class Chain;
@@ -32,6 +34,7 @@ struct NodeContext {
3234
std::unique_ptr<CConnman> connman;
3335
CTxMemPool* mempool{nullptr}; // Currently a raw pointer because the memory is not managed by this struct
3436
std::unique_ptr<PeerLogicValidation> peer_logic;
37+
ChainstateManager* chainman{nullptr}; // Currently a raw pointer because the memory is not managed by this struct
3538
std::unique_ptr<BanMan> banman;
3639
std::unique_ptr<interfaces::Chain> chain;
3740
std::vector<std::unique_ptr<interfaces::ChainClient>> chain_clients;
@@ -44,4 +47,10 @@ struct NodeContext {
4447
~NodeContext();
4548
};
4649

50+
inline ChainstateManager& EnsureChainman(const NodeContext& node)
51+
{
52+
assert(node.chainman);
53+
return *node.chainman;
54+
}
55+
4756
#endif // BITCOIN_NODE_CONTEXT_H

src/rpc/blockchain.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,12 @@ CTxMemPool& EnsureMemPool(const util::Ref& context)
8080
return *node.mempool;
8181
}
8282

83+
ChainstateManager& EnsureChainman(const util::Ref& context)
84+
{
85+
NodeContext& node = EnsureNodeContext(context);
86+
return EnsureChainman(node);
87+
}
88+
8389
/* Calculate the difficulty for a given block index.
8490
*/
8591
double GetDifficulty(const CBlockIndex* blockindex)

src/rpc/blockchain.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
class CBlock;
1313
class CBlockIndex;
1414
class CTxMemPool;
15+
class ChainstateManager;
1516
class UniValue;
1617
struct NodeContext;
1718
namespace util {
@@ -48,5 +49,6 @@ void CalculatePercentilesBySize(CAmount result[NUM_GETBLOCKSTATS_PERCENTILES], s
4849

4950
NodeContext& EnsureNodeContext(const util::Ref& context);
5051
CTxMemPool& EnsureMemPool(const util::Ref& context);
52+
ChainstateManager& EnsureChainman(const util::Ref& context);
5153

5254
#endif

0 commit comments

Comments
 (0)