aboutsummaryrefslogtreecommitdiff
path: root/src/index
diff options
context:
space:
mode:
authorfurszy <matiasfurszyfer@protonmail.com>2023-06-16 17:32:21 -0300
committerfurszy <matiasfurszyfer@protonmail.com>2023-07-10 10:47:17 -0300
commitc82ef91eae38f385d408b095ebbc8a180ce52ebb (patch)
tree3be2122ba97f94d141a6a9ef40846868828e8199 /src/index
parent430e7027a18870a296abb0bbd9332cbe40d8fdc0 (diff)
downloadbitcoin-c82ef91eae38f385d408b095ebbc8a180ce52ebb.tar.xz
make GetFirstStoredBlock assert that 'start_block' always has data
And transfer the responsibility of verifying whether 'start_block' has data or not to the caller. This is because the 'GetFirstStoredBlock' function responsibility is to return the first block containing data. And the current implementation can return 'start_block' when it has no data!. Which is misleading at least. Edge case behavior change: Previously, if the block tip lacked data but all preceding blocks contained data, there was no prune violation. And now, such scenario will result in a prune violation.
Diffstat (limited to 'src/index')
-rw-r--r--src/index/base.cpp3
1 files changed, 2 insertions, 1 deletions
diff --git a/src/index/base.cpp b/src/index/base.cpp
index 0f25881804..ef3ba72cad 100644
--- a/src/index/base.cpp
+++ b/src/index/base.cpp
@@ -115,7 +115,8 @@ bool BaseIndex::Init()
if (!start_block) {
// index is not built yet
// make sure we have all block data back to the genesis
- prune_violation = m_chainstate->m_blockman.GetFirstStoredBlock(*active_chain.Tip()) != active_chain.Genesis();
+ bool has_tip_data = active_chain.Tip()->nStatus & BLOCK_HAVE_DATA;
+ prune_violation = !has_tip_data || m_chainstate->m_blockman.GetFirstStoredBlock(*active_chain.Tip()) != active_chain.Genesis();
}
// in case the index has a best block set and is not fully synced
// check if we have the required blocks to continue building the index