refactor: validation: mark CheckBlockIndex as const

As a check/test method, this function should not mutate logical
state. Mark it as const to better help ensure this.
This commit is contained in:
stickies-v 2025-04-23 15:52:56 +01:00
parent 9a79ee285f
commit 12645d1dee
No known key found for this signature in database
GPG key ID: 5CB1CE6E5E66A757
2 changed files with 18 additions and 18 deletions

View file

@ -5257,7 +5257,7 @@ bool ChainstateManager::ShouldCheckBlockIndex() const
return true; return true;
} }
void ChainstateManager::CheckBlockIndex() void ChainstateManager::CheckBlockIndex() const
{ {
if (!ShouldCheckBlockIndex()) { if (!ShouldCheckBlockIndex()) {
return; return;
@ -5282,7 +5282,7 @@ void ChainstateManager::CheckBlockIndex()
assert(m_best_header); assert(m_best_header);
best_hdr_chain.SetTip(*m_best_header); best_hdr_chain.SetTip(*m_best_header);
std::multimap<CBlockIndex*,CBlockIndex*> forward; std::multimap<const CBlockIndex*, const CBlockIndex*> forward;
for (auto& [_, block_index] : m_blockman.m_block_index) { for (auto& [_, block_index] : m_blockman.m_block_index) {
// Only save indexes in forward that are not part of the best header chain. // Only save indexes in forward that are not part of the best header chain.
if (!best_hdr_chain.Contains(&block_index)) { if (!best_hdr_chain.Contains(&block_index)) {
@ -5293,27 +5293,27 @@ void ChainstateManager::CheckBlockIndex()
} }
assert(forward.size() + best_hdr_chain.Height() + 1 == m_blockman.m_block_index.size()); assert(forward.size() + best_hdr_chain.Height() + 1 == m_blockman.m_block_index.size());
CBlockIndex* pindex = best_hdr_chain[0]; const CBlockIndex* pindex = best_hdr_chain[0];
assert(pindex); assert(pindex);
// Iterate over the entire block tree, using depth-first search. // Iterate over the entire block tree, using depth-first search.
// Along the way, remember whether there are blocks on the path from genesis // Along the way, remember whether there are blocks on the path from genesis
// block being explored which are the first to have certain properties. // block being explored which are the first to have certain properties.
size_t nNodes = 0; size_t nNodes = 0;
int nHeight = 0; int nHeight = 0;
CBlockIndex* pindexFirstInvalid = nullptr; // Oldest ancestor of pindex which is invalid. const CBlockIndex* pindexFirstInvalid = nullptr; // Oldest ancestor of pindex which is invalid.
CBlockIndex* pindexFirstMissing = nullptr; // Oldest ancestor of pindex which does not have BLOCK_HAVE_DATA, since assumeutxo snapshot if used. const CBlockIndex* pindexFirstMissing = nullptr; // Oldest ancestor of pindex which does not have BLOCK_HAVE_DATA, since assumeutxo snapshot if used.
CBlockIndex* pindexFirstNeverProcessed = nullptr; // Oldest ancestor of pindex for which nTx == 0, since assumeutxo snapshot if used. const CBlockIndex* pindexFirstNeverProcessed = nullptr; // Oldest ancestor of pindex for which nTx == 0, since assumeutxo snapshot if used.
CBlockIndex* pindexFirstNotTreeValid = nullptr; // Oldest ancestor of pindex which does not have BLOCK_VALID_TREE (regardless of being valid or not). const CBlockIndex* pindexFirstNotTreeValid = nullptr; // Oldest ancestor of pindex which does not have BLOCK_VALID_TREE (regardless of being valid or not).
CBlockIndex* pindexFirstNotTransactionsValid = nullptr; // Oldest ancestor of pindex which does not have BLOCK_VALID_TRANSACTIONS (regardless of being valid or not), since assumeutxo snapshot if used. const CBlockIndex* pindexFirstNotTransactionsValid = nullptr; // Oldest ancestor of pindex which does not have BLOCK_VALID_TRANSACTIONS (regardless of being valid or not), since assumeutxo snapshot if used.
CBlockIndex* pindexFirstNotChainValid = nullptr; // Oldest ancestor of pindex which does not have BLOCK_VALID_CHAIN (regardless of being valid or not), since assumeutxo snapshot if used. const CBlockIndex* pindexFirstNotChainValid = nullptr; // Oldest ancestor of pindex which does not have BLOCK_VALID_CHAIN (regardless of being valid or not), since assumeutxo snapshot if used.
CBlockIndex* pindexFirstNotScriptsValid = nullptr; // Oldest ancestor of pindex which does not have BLOCK_VALID_SCRIPTS (regardless of being valid or not), since assumeutxo snapshot if used. const CBlockIndex* pindexFirstNotScriptsValid = nullptr; // Oldest ancestor of pindex which does not have BLOCK_VALID_SCRIPTS (regardless of being valid or not), since assumeutxo snapshot if used.
// After checking an assumeutxo snapshot block, reset pindexFirst pointers // After checking an assumeutxo snapshot block, reset pindexFirst pointers
// to earlier blocks that have not been downloaded or validated yet, so // to earlier blocks that have not been downloaded or validated yet, so
// checks for later blocks can assume the earlier blocks were validated and // checks for later blocks can assume the earlier blocks were validated and
// be stricter, testing for more requirements. // be stricter, testing for more requirements.
const CBlockIndex* snap_base{GetSnapshotBaseBlock()}; const CBlockIndex* snap_base{GetSnapshotBaseBlock()};
CBlockIndex *snap_first_missing{}, *snap_first_notx{}, *snap_first_notv{}, *snap_first_nocv{}, *snap_first_nosv{}; const CBlockIndex *snap_first_missing{}, *snap_first_notx{}, *snap_first_notv{}, *snap_first_nocv{}, *snap_first_nosv{};
auto snap_update_firsts = [&] { auto snap_update_firsts = [&] {
if (pindex == snap_base) { if (pindex == snap_base) {
std::swap(snap_first_missing, pindexFirstMissing); std::swap(snap_first_missing, pindexFirstMissing);
@ -5453,7 +5453,7 @@ void ChainstateManager::CheckBlockIndex()
// pindex only needs to be added if it is an ancestor of // pindex only needs to be added if it is an ancestor of
// the snapshot that is being validated. // the snapshot that is being validated.
if (c == &ActiveChainstate() || snap_base->GetAncestor(pindex->nHeight) == pindex) { if (c == &ActiveChainstate() || snap_base->GetAncestor(pindex->nHeight) == pindex) {
assert(c->setBlockIndexCandidates.count(pindex)); assert(c->setBlockIndexCandidates.contains(const_cast<CBlockIndex*>(pindex)));
} }
} }
// If some parent is missing, then it could be that this block was in // If some parent is missing, then it could be that this block was in
@ -5461,11 +5461,11 @@ void ChainstateManager::CheckBlockIndex()
// In this case it must be in m_blocks_unlinked -- see test below. // In this case it must be in m_blocks_unlinked -- see test below.
} }
} else { // If this block sorts worse than the current tip or some ancestor's block has never been seen, it cannot be in setBlockIndexCandidates. } else { // If this block sorts worse than the current tip or some ancestor's block has never been seen, it cannot be in setBlockIndexCandidates.
assert(c->setBlockIndexCandidates.count(pindex) == 0); assert(!c->setBlockIndexCandidates.contains(const_cast<CBlockIndex*>(pindex)));
} }
} }
// Check whether this block is in m_blocks_unlinked. // Check whether this block is in m_blocks_unlinked.
std::pair<std::multimap<CBlockIndex*,CBlockIndex*>::iterator,std::multimap<CBlockIndex*,CBlockIndex*>::iterator> rangeUnlinked = m_blockman.m_blocks_unlinked.equal_range(pindex->pprev); auto rangeUnlinked{m_blockman.m_blocks_unlinked.equal_range(pindex->pprev)};
bool foundInUnlinked = false; bool foundInUnlinked = false;
while (rangeUnlinked.first != rangeUnlinked.second) { while (rangeUnlinked.first != rangeUnlinked.second) {
assert(rangeUnlinked.first->first == pindex->pprev); assert(rangeUnlinked.first->first == pindex->pprev);
@ -5494,7 +5494,7 @@ void ChainstateManager::CheckBlockIndex()
// setBlockIndexCandidates, then it must be in m_blocks_unlinked. // setBlockIndexCandidates, then it must be in m_blocks_unlinked.
for (auto c : GetAll()) { for (auto c : GetAll()) {
const bool is_active = c == &ActiveChainstate(); const bool is_active = c == &ActiveChainstate();
if (!CBlockIndexWorkComparator()(pindex, c->m_chain.Tip()) && c->setBlockIndexCandidates.count(pindex) == 0) { if (!CBlockIndexWorkComparator()(pindex, c->m_chain.Tip()) && !c->setBlockIndexCandidates.contains(const_cast<CBlockIndex*>(pindex))) {
if (pindexFirstInvalid == nullptr) { if (pindexFirstInvalid == nullptr) {
if (is_active || snap_base->GetAncestor(pindex->nHeight) == pindex) { if (is_active || snap_base->GetAncestor(pindex->nHeight) == pindex) {
assert(foundInUnlinked); assert(foundInUnlinked);
@ -5509,7 +5509,7 @@ void ChainstateManager::CheckBlockIndex()
// Try descending into the first subnode. Always process forks first and the best header chain after. // Try descending into the first subnode. Always process forks first and the best header chain after.
snap_update_firsts(); snap_update_firsts();
std::pair<std::multimap<CBlockIndex*,CBlockIndex*>::iterator,std::multimap<CBlockIndex*,CBlockIndex*>::iterator> range = forward.equal_range(pindex); auto range{forward.equal_range(pindex)};
if (range.first != range.second) { if (range.first != range.second) {
// A subnode not part of the best header chain was found. // A subnode not part of the best header chain was found.
pindex = range.first->second; pindex = range.first->second;
@ -5538,7 +5538,7 @@ void ChainstateManager::CheckBlockIndex()
// Find our parent. // Find our parent.
CBlockIndex* pindexPar = pindex->pprev; CBlockIndex* pindexPar = pindex->pprev;
// Find which child we just visited. // Find which child we just visited.
std::pair<std::multimap<CBlockIndex*,CBlockIndex*>::iterator,std::multimap<CBlockIndex*,CBlockIndex*>::iterator> rangePar = forward.equal_range(pindexPar); auto rangePar{forward.equal_range(pindexPar)};
while (rangePar.first->second != pindex) { while (rangePar.first->second != pindex) {
assert(rangePar.first != rangePar.second); // Our parent must have at least the node we're coming from as child. assert(rangePar.first != rangePar.second); // Our parent must have at least the node we're coming from as child.
rangePar.first++; rangePar.first++;

View file

@ -985,7 +985,7 @@ public:
* *
* By default this only executes fully when using the Regtest chain; see: m_options.check_block_index. * By default this only executes fully when using the Regtest chain; see: m_options.check_block_index.
*/ */
void CheckBlockIndex(); void CheckBlockIndex() const;
/** /**
* Alias for ::cs_main. * Alias for ::cs_main.