diff options
author | furszy <matiasfurszyfer@protonmail.com> | 2023-06-16 17:32:21 -0300 |
---|---|---|
committer | furszy <matiasfurszyfer@protonmail.com> | 2023-07-10 10:47:17 -0300 |
commit | c82ef91eae38f385d408b095ebbc8a180ce52ebb (patch) | |
tree | 3be2122ba97f94d141a6a9ef40846868828e8199 /src/index | |
parent | 430e7027a18870a296abb0bbd9332cbe40d8fdc0 (diff) | |
download | bitcoin-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.cpp | 3 |
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 |