Skip to content

Commit 0d567da

Browse files
committed
move-mostly: Make pindexBestHeader a ChainMan member
[META] In the next commit, we move the clearing of pindexBestHeader to ChainstateManager::Unload()
1 parent 5d67017 commit 0d567da

File tree

8 files changed

+45
-42
lines changed

8 files changed

+45
-42
lines changed

src/init.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1664,9 +1664,9 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
16641664
tip_info->block_time = chainman.ActiveChain().Tip() ? chainman.ActiveChain().Tip()->GetBlockTime() : Params().GenesisBlock().GetBlockTime();
16651665
tip_info->verification_progress = GuessVerificationProgress(Params().TxData(), chainman.ActiveChain().Tip());
16661666
}
1667-
if (tip_info && ::pindexBestHeader) {
1668-
tip_info->header_height = ::pindexBestHeader->nHeight;
1669-
tip_info->header_time = ::pindexBestHeader->GetBlockTime();
1667+
if (tip_info && chainman.pindexBestHeader) {
1668+
tip_info->header_height = chainman.pindexBestHeader->nHeight;
1669+
tip_info->header_time = chainman.pindexBestHeader->GetBlockTime();
16701670
}
16711671
}
16721672
LogPrintf("nBestHeight = %d\n", chain_active_height);

src/net_processing.cpp

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1499,9 +1499,9 @@ bool PeerManagerImpl::BlockRequestAllowed(const CBlockIndex* pindex)
14991499
{
15001500
AssertLockHeld(cs_main);
15011501
if (m_chainman.ActiveChain().Contains(pindex)) return true;
1502-
return pindex->IsValid(BLOCK_VALID_SCRIPTS) && (pindexBestHeader != nullptr) &&
1503-
(pindexBestHeader->GetBlockTime() - pindex->GetBlockTime() < STALE_RELAY_AGE_LIMIT) &&
1504-
(GetBlockProofEquivalentTime(*pindexBestHeader, *pindex, *pindexBestHeader, m_chainparams.GetConsensus()) < STALE_RELAY_AGE_LIMIT);
1502+
return pindex->IsValid(BLOCK_VALID_SCRIPTS) && (m_chainman.pindexBestHeader != nullptr) &&
1503+
(m_chainman.pindexBestHeader->GetBlockTime() - pindex->GetBlockTime() < STALE_RELAY_AGE_LIMIT) &&
1504+
(GetBlockProofEquivalentTime(*m_chainman.pindexBestHeader, *pindex, *m_chainman.pindexBestHeader, m_chainparams.GetConsensus()) < STALE_RELAY_AGE_LIMIT);
15051505
}
15061506

15071507
std::optional<std::string> PeerManagerImpl::FetchBlock(NodeId peer_id, const CBlockIndex& block_index)
@@ -1896,7 +1896,7 @@ void PeerManagerImpl::ProcessGetBlockData(CNode& pfrom, Peer& peer, const CInv&
18961896
const CNetMsgMaker msgMaker(pfrom.GetCommonVersion());
18971897
// disconnect node in case we have reached the outbound limit for serving historical blocks
18981898
if (m_connman.OutboundTargetReached(true) &&
1899-
(((pindexBestHeader != nullptr) && (pindexBestHeader->GetBlockTime() - pindex->GetBlockTime() > HISTORICAL_BLOCK_AGE)) || inv.IsMsgFilteredBlk()) &&
1899+
(((m_chainman.pindexBestHeader != nullptr) && (m_chainman.pindexBestHeader->GetBlockTime() - pindex->GetBlockTime() > HISTORICAL_BLOCK_AGE)) || inv.IsMsgFilteredBlk()) &&
19001900
!pfrom.HasPermission(NetPermissionFlags::Download) // nodes with the download permission may exceed target
19011901
) {
19021902
LogPrint(BCLog::NET, "historical block serving limit reached, disconnect peer=%d\n", pfrom.GetId());
@@ -2173,11 +2173,11 @@ void PeerManagerImpl::ProcessHeadersMessage(CNode& pfrom, const Peer& peer,
21732173
// nUnconnectingHeaders gets reset back to 0.
21742174
if (!m_chainman.m_blockman.LookupBlockIndex(headers[0].hashPrevBlock) && nCount < MAX_BLOCKS_TO_ANNOUNCE) {
21752175
nodestate->nUnconnectingHeaders++;
2176-
m_connman.PushMessage(&pfrom, msgMaker.Make(NetMsgType::GETHEADERS, m_chainman.ActiveChain().GetLocator(pindexBestHeader), uint256()));
2176+
m_connman.PushMessage(&pfrom, msgMaker.Make(NetMsgType::GETHEADERS, m_chainman.ActiveChain().GetLocator(m_chainman.pindexBestHeader), uint256()));
21772177
LogPrint(BCLog::NET, "received header %s: missing prev block %s, sending getheaders (%d) to end (peer=%d, nUnconnectingHeaders=%d)\n",
21782178
headers[0].GetHash().ToString(),
21792179
headers[0].hashPrevBlock.ToString(),
2180-
pindexBestHeader->nHeight,
2180+
m_chainman.pindexBestHeader->nHeight,
21812181
pfrom.GetId(), nodestate->nUnconnectingHeaders);
21822182
// Set hashLastUnknownBlock for this peer, so that if we
21832183
// eventually get the headers - even from a different peer -
@@ -2235,7 +2235,7 @@ void PeerManagerImpl::ProcessHeadersMessage(CNode& pfrom, const Peer& peer,
22352235

22362236
if (nCount == MAX_HEADERS_RESULTS) {
22372237
// Headers message had its maximum size; the peer may have more headers.
2238-
// TODO: optimize: if pindexLast is an ancestor of m_chainman.ActiveChain().Tip or pindexBestHeader, continue
2238+
// TODO: optimize: if pindexLast is an ancestor of m_chainman.ActiveChain().Tip or m_chainman.pindexBestHeader, continue
22392239
// from there instead.
22402240
LogPrint(BCLog::NET, "more getheaders (%d) to end to peer=%d (startheight:%d)\n",
22412241
pindexLast->nHeight, pfrom.GetId(), peer.m_starting_height);
@@ -3102,8 +3102,8 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
31023102
}
31033103

31043104
if (best_block != nullptr) {
3105-
m_connman.PushMessage(&pfrom, msgMaker.Make(NetMsgType::GETHEADERS, m_chainman.ActiveChain().GetLocator(pindexBestHeader), *best_block));
3106-
LogPrint(BCLog::NET, "getheaders (%d) %s to peer=%d\n", pindexBestHeader->nHeight, best_block->ToString(), pfrom.GetId());
3105+
m_connman.PushMessage(&pfrom, msgMaker.Make(NetMsgType::GETHEADERS, m_chainman.ActiveChain().GetLocator(m_chainman.pindexBestHeader), *best_block));
3106+
LogPrint(BCLog::NET, "getheaders (%d) %s to peer=%d\n", m_chainman.pindexBestHeader->nHeight, best_block->ToString(), pfrom.GetId());
31073107
}
31083108

31093109
return;
@@ -3549,7 +3549,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
35493549
if (!m_chainman.m_blockman.LookupBlockIndex(cmpctblock.header.hashPrevBlock)) {
35503550
// Doesn't connect (or is genesis), instead of DoSing in AcceptBlockHeader, request deeper headers
35513551
if (!m_chainman.ActiveChainstate().IsInitialBlockDownload())
3552-
m_connman.PushMessage(&pfrom, msgMaker.Make(NetMsgType::GETHEADERS, m_chainman.ActiveChain().GetLocator(pindexBestHeader), uint256()));
3552+
m_connman.PushMessage(&pfrom, msgMaker.Make(NetMsgType::GETHEADERS, m_chainman.ActiveChain().GetLocator(m_chainman.pindexBestHeader), uint256()));
35533553
return;
35543554
}
35553555

@@ -4670,28 +4670,29 @@ bool PeerManagerImpl::SendMessages(CNode* pto)
46704670
CNodeState &state = *State(pto->GetId());
46714671

46724672
// Start block sync
4673-
if (pindexBestHeader == nullptr)
4674-
pindexBestHeader = m_chainman.ActiveChain().Tip();
4673+
if (m_chainman.pindexBestHeader == nullptr) {
4674+
m_chainman.pindexBestHeader = m_chainman.ActiveChain().Tip();
4675+
}
46754676
bool fFetch = state.fPreferredDownload || (nPreferredDownload == 0 && !pto->fClient && !pto->IsAddrFetchConn()); // Download if this is a nice peer, or we have no nice peers and this one might do.
46764677
if (!state.fSyncStarted && !pto->fClient && !fImporting && !fReindex) {
46774678
// Only actively request headers from a single peer, unless we're close to today.
4678-
if ((nSyncStarted == 0 && fFetch) || pindexBestHeader->GetBlockTime() > GetAdjustedTime() - 24 * 60 * 60) {
4679+
if ((nSyncStarted == 0 && fFetch) || m_chainman.pindexBestHeader->GetBlockTime() > GetAdjustedTime() - 24 * 60 * 60) {
46794680
state.fSyncStarted = true;
46804681
state.m_headers_sync_timeout = current_time + HEADERS_DOWNLOAD_TIMEOUT_BASE +
46814682
(
46824683
// Convert HEADERS_DOWNLOAD_TIMEOUT_PER_HEADER to microseconds before scaling
46834684
// to maintain precision
46844685
std::chrono::microseconds{HEADERS_DOWNLOAD_TIMEOUT_PER_HEADER} *
4685-
(GetAdjustedTime() - pindexBestHeader->GetBlockTime()) / consensusParams.nPowTargetSpacing
4686+
(GetAdjustedTime() - m_chainman.pindexBestHeader->GetBlockTime()) / consensusParams.nPowTargetSpacing
46864687
);
46874688
nSyncStarted++;
4688-
const CBlockIndex *pindexStart = pindexBestHeader;
4689+
const CBlockIndex* pindexStart = m_chainman.pindexBestHeader;
46894690
/* If possible, start at the block preceding the currently
46904691
best known header. This ensures that we always get a
46914692
non-empty list of headers back as long as the peer
46924693
is up-to-date. With a non-empty response, we can initialise
46934694
the peer's known best block. This wouldn't be possible
4694-
if we requested starting at pindexBestHeader and
4695+
if we requested starting at m_chainman.pindexBestHeader and
46954696
got back an empty response. */
46964697
if (pindexStart->pprev)
46974698
pindexStart = pindexStart->pprev;
@@ -5016,7 +5017,7 @@ bool PeerManagerImpl::SendMessages(CNode* pto)
50165017
// Check for headers sync timeouts
50175018
if (state.fSyncStarted && state.m_headers_sync_timeout < std::chrono::microseconds::max()) {
50185019
// Detect whether this is a stalling initial-headers-sync peer
5019-
if (pindexBestHeader->GetBlockTime() <= GetAdjustedTime() - 24 * 60 * 60) {
5020+
if (m_chainman.pindexBestHeader->GetBlockTime() <= GetAdjustedTime() - 24 * 60 * 60) {
50205021
if (current_time > state.m_headers_sync_timeout && nSyncStarted == 1 && (nPreferredDownload - state.fPreferredDownload >= 1)) {
50215022
// Disconnect a peer (without NetPermissionFlags::NoBan permission) if it is our only sync peer,
50225023
// and we have others we could be using instead.

src/node/blockstorage.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ const CBlockIndex* BlockManager::LookupBlockIndex(const uint256& hash) const
8181
return it == m_block_index.end() ? nullptr : &it->second;
8282
}
8383

84-
CBlockIndex* BlockManager::AddToBlockIndex(const CBlockHeader& block)
84+
CBlockIndex* BlockManager::AddToBlockIndex(const CBlockHeader& block, CBlockIndex*& best_header)
8585
{
8686
AssertLockHeld(cs_main);
8787

@@ -106,8 +106,9 @@ CBlockIndex* BlockManager::AddToBlockIndex(const CBlockHeader& block)
106106
pindexNew->nTimeMax = (pindexNew->pprev ? std::max(pindexNew->pprev->nTimeMax, pindexNew->nTime) : pindexNew->nTime);
107107
pindexNew->nChainWork = (pindexNew->pprev ? pindexNew->pprev->nChainWork : 0) + GetBlockProof(*pindexNew);
108108
pindexNew->RaiseValidity(BLOCK_VALID_TREE);
109-
if (pindexBestHeader == nullptr || pindexBestHeader->nChainWork < pindexNew->nChainWork)
110-
pindexBestHeader = pindexNew;
109+
if (best_header == nullptr || best_header->nChainWork < pindexNew->nChainWork) {
110+
best_header = pindexNew;
111+
}
111112

112113
m_dirty_blockindex.insert(pindexNew);
113114

src/node/blockstorage.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ class BlockManager
147147
/** Clear all data members. */
148148
void Unload() EXCLUSIVE_LOCKS_REQUIRED(cs_main);
149149

150-
CBlockIndex* AddToBlockIndex(const CBlockHeader& block) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
150+
CBlockIndex* AddToBlockIndex(const CBlockHeader& block, CBlockIndex*& best_header) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
151151
/** Create a new block index entry for a given block hash */
152152
CBlockIndex* InsertBlockIndex(const uint256& hash) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
153153

src/node/interfaces.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -212,9 +212,10 @@ class NodeImpl : public Node
212212
bool getHeaderTip(int& height, int64_t& block_time) override
213213
{
214214
LOCK(::cs_main);
215-
if (::pindexBestHeader) {
216-
height = ::pindexBestHeader->nHeight;
217-
block_time = ::pindexBestHeader->GetBlockTime();
215+
auto best_header = chainman().pindexBestHeader;
216+
if (best_header) {
217+
height = best_header->nHeight;
218+
block_time = best_header->GetBlockTime();
218219
return true;
219220
}
220221
return false;

src/rpc/blockchain.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1207,7 +1207,7 @@ RPCHelpMan getblockchaininfo()
12071207
UniValue obj(UniValue::VOBJ);
12081208
obj.pushKV("chain", Params().NetworkIDString());
12091209
obj.pushKV("blocks", height);
1210-
obj.pushKV("headers", pindexBestHeader ? pindexBestHeader->nHeight : -1);
1210+
obj.pushKV("headers", chainman.pindexBestHeader ? chainman.pindexBestHeader->nHeight : -1);
12111211
obj.pushKV("bestblockhash", tip->GetBlockHash().GetHex());
12121212
obj.pushKV("difficulty", (double)GetDifficulty(tip));
12131213
obj.pushKV("time", (int64_t)tip->nTime);

src/validation.cpp

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,6 @@ const std::vector<std::string> CHECKLEVEL_DOC {
120120
*/
121121
RecursiveMutex cs_main;
122122

123-
CBlockIndex *pindexBestHeader = nullptr;
124123
Mutex g_best_block_mutex;
125124
std::condition_variable g_best_block_cv;
126125
uint256 g_best_block;
@@ -280,8 +279,9 @@ static bool IsCurrentForFeeEstimation(CChainState& active_chainstate) EXCLUSIVE_
280279
return false;
281280
if (active_chainstate.m_chain.Tip()->GetBlockTime() < count_seconds(GetTime<std::chrono::seconds>() - MAX_FEE_ESTIMATION_TIP_AGE))
282281
return false;
283-
if (active_chainstate.m_chain.Height() < pindexBestHeader->nHeight - 1)
282+
if (active_chainstate.m_chain.Height() < active_chainstate.m_chainman.pindexBestHeader->nHeight - 1) {
284283
return false;
284+
}
285285
return true;
286286
}
287287

@@ -1602,8 +1602,8 @@ void CChainState::InvalidChainFound(CBlockIndex* pindexNew)
16021602
if (!m_chainman.m_best_invalid || pindexNew->nChainWork > m_chainman.m_best_invalid->nChainWork) {
16031603
m_chainman.m_best_invalid = pindexNew;
16041604
}
1605-
if (pindexBestHeader != nullptr && pindexBestHeader->GetAncestor(pindexNew->nHeight) == pindexNew) {
1606-
pindexBestHeader = m_chain.Tip();
1605+
if (m_chainman.pindexBestHeader != nullptr && m_chainman.pindexBestHeader->GetAncestor(pindexNew->nHeight) == pindexNew) {
1606+
m_chainman.pindexBestHeader = m_chain.Tip();
16071607
}
16081608

16091609
LogPrintf("%s: invalid block=%s height=%d log2_work=%f date=%s\n", __func__,
@@ -2029,8 +2029,8 @@ bool CChainState::ConnectBlock(const CBlock& block, BlockValidationState& state,
20292029
BlockMap::const_iterator it = m_blockman.m_block_index.find(hashAssumeValid);
20302030
if (it != m_blockman.m_block_index.end()) {
20312031
if (it->second.GetAncestor(pindex->nHeight) == pindex &&
2032-
pindexBestHeader->GetAncestor(pindex->nHeight) == pindex &&
2033-
pindexBestHeader->nChainWork >= nMinimumChainWork) {
2032+
m_chainman.pindexBestHeader->GetAncestor(pindex->nHeight) == pindex &&
2033+
m_chainman.pindexBestHeader->nChainWork >= nMinimumChainWork) {
20342034
// This block is a member of the assumed verified chain and an ancestor of the best header.
20352035
// Script verification is skipped when connecting blocks under the
20362036
// assumevalid block. Assuming the assumevalid block is valid this
@@ -2045,7 +2045,7 @@ bool CChainState::ConnectBlock(const CBlock& block, BlockValidationState& state,
20452045
// artificially set the default assumed verified block further back.
20462046
// The test against nMinimumChainWork prevents the skipping when denied access to any chain at
20472047
// least as good as the expected chain.
2048-
fScriptChecks = (GetBlockProofEquivalentTime(*pindexBestHeader, *pindex, *pindexBestHeader, m_params.GetConsensus()) <= 60 * 60 * 24 * 7 * 2);
2048+
fScriptChecks = (GetBlockProofEquivalentTime(*m_chainman.pindexBestHeader, *pindex, *m_chainman.pindexBestHeader, m_params.GetConsensus()) <= 60 * 60 * 24 * 7 * 2);
20492049
}
20502050
}
20512051
}
@@ -2904,7 +2904,7 @@ static bool NotifyHeaderTip(CChainState& chainstate) LOCKS_EXCLUDED(cs_main) {
29042904
CBlockIndex* pindexHeader = nullptr;
29052905
{
29062906
LOCK(cs_main);
2907-
pindexHeader = pindexBestHeader;
2907+
pindexHeader = chainstate.m_chainman.pindexBestHeader;
29082908

29092909
if (pindexHeader != pindexHeaderOld) {
29102910
fNotify = true;
@@ -3621,7 +3621,7 @@ bool ChainstateManager::AcceptBlockHeader(const CBlockHeader& block, BlockValida
36213621
}
36223622
}
36233623
}
3624-
CBlockIndex* pindex{m_blockman.AddToBlockIndex(block)};
3624+
CBlockIndex* pindex{m_blockman.AddToBlockIndex(block, pindexBestHeader)};
36253625

36263626
if (ppindex)
36273627
*ppindex = pindex;
@@ -4122,7 +4122,7 @@ void UnloadBlockIndex(CTxMemPool* mempool, ChainstateManager& chainman)
41224122
{
41234123
AssertLockHeld(::cs_main);
41244124
chainman.Unload();
4125-
pindexBestHeader = nullptr;
4125+
chainman.pindexBestHeader = nullptr;
41264126
if (mempool) mempool->clear();
41274127
g_versionbitscache.Clear();
41284128
for (int b = 0; b < VERSIONBITS_NUM_BITS; b++) {
@@ -4239,7 +4239,7 @@ bool CChainState::LoadGenesisBlock()
42394239
if (blockPos.IsNull()) {
42404240
return error("%s: writing genesis block to disk failed", __func__);
42414241
}
4242-
CBlockIndex *pindex = m_blockman.AddToBlockIndex(block);
4242+
CBlockIndex* pindex = m_blockman.AddToBlockIndex(block, m_chainman.pindexBestHeader);
42434243
ReceivedBlockTransactions(block, pindex, blockPos);
42444244
} catch (const std::runtime_error& e) {
42454245
return error("%s: failed to write genesis block: %s", __func__, e.what());

src/validation.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -131,9 +131,6 @@ extern uint256 hashAssumeValid;
131131
/** Minimum work we will assume exists on some valid chain. */
132132
extern arith_uint256 nMinimumChainWork;
133133

134-
/** Best header we've seen so far (used for getheaders queries' starting points). */
135-
extern CBlockIndex *pindexBestHeader;
136-
137134
/** Documentation for argument 'checklevel'. */
138135
extern const std::vector<std::string> CHECKLEVEL_DOC;
139136

@@ -883,6 +880,9 @@ class ChainstateManager
883880
*/
884881
std::set<CBlockIndex*> m_failed_blocks;
885882

883+
/** Best header we've seen so far (used for getheaders queries' starting points). */
884+
CBlockIndex* pindexBestHeader = nullptr;
885+
886886
//! The total number of bytes available for us to use across all in-memory
887887
//! coins caches. This will be split somehow across chainstates.
888888
int64_t m_total_coinstip_cache{0};

0 commit comments

Comments
 (0)