mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-04-30 16:58:56 +02:00
Merge bitcoin/bitcoin#29668: prune, rpc: Check undo data when finding pruneheight
8789dc8f31doc: Add note to getblockfrompeer on missing undo data (Fabian Jahr)4a1975008brpc: Make pruneheight also reflect undo data presence (Fabian Jahr)96b4facc91refactor, blockstorage: Generalize GetFirstStoredBlock (Fabian Jahr) Pull request description: The function `GetFirstStoredBlock()` helps us find the first block for which we have data. So far this function only looked for a block with `BLOCK_HAVE_DATA`. However, this doesn't mean that we also have the undo data of that block, and undo data might be required for what a user would like to do with those blocks. One example of how this might happen is if some blocks were fetched using the `getblockfrompeer` RPC. Blocks fetched from a peer will have data but no undo data. The first commit here allows `GetFirstStoredBlock()` to check for undo data as well by passing a parameter. This alone is useful for #29553 and I would use it there. In the second commit I am applying the undo check to the RPCs that report `pruneheight` to the user. I find this much more intuitive because I think the user expects to be able to do all operations on blocks up until the `pruneheight` but that is not the case if undo data is missing. I personally ran into this once before and now again when testing for assumeutxo when I had used `getblockfrompeer`. The following commit adds test coverage for this change of behavior. The last commit adds a note in the docs of `getblockfrompeer` that undo data will not be available. ACKs for top commit: achow101: ACK8789dc8f31furszy: Code review ACK8789dc8f31. stickies-v: ACK8789dc8f31Tree-SHA512: 90ae8bdd07a496ade579aa25240609c61c9ed173ad38d30533f6c631fe674e5a41727478ade69ca4b71a571ad94c9da4b33ebba6b5d8821109313c2de3bdfb3d
This commit is contained in:
@@ -5,7 +5,9 @@
|
||||
#include <boost/test/unit_test.hpp>
|
||||
|
||||
#include <chain.h>
|
||||
#include <node/blockstorage.h>
|
||||
#include <rpc/blockchain.h>
|
||||
#include <sync.h>
|
||||
#include <test/util/setup_common.h>
|
||||
#include <util/string.h>
|
||||
|
||||
@@ -76,4 +78,36 @@ BOOST_AUTO_TEST_CASE(get_difficulty_for_very_high_target)
|
||||
TestDifficulty(0x12345678, 5913134931067755359633408.0);
|
||||
}
|
||||
|
||||
//! Prune chain from height down to genesis block and check that
|
||||
//! GetPruneHeight returns the correct value
|
||||
static void CheckGetPruneHeight(node::BlockManager& blockman, CChain& chain, int height) EXCLUSIVE_LOCKS_REQUIRED(::cs_main)
|
||||
{
|
||||
AssertLockHeld(::cs_main);
|
||||
|
||||
// Emulate pruning all blocks from `height` down to the genesis block
|
||||
// by unsetting the `BLOCK_HAVE_DATA` flag from `nStatus`
|
||||
for (CBlockIndex* it{chain[height]}; it != nullptr && it->nHeight > 0; it = it->pprev) {
|
||||
it->nStatus &= ~BLOCK_HAVE_DATA;
|
||||
}
|
||||
|
||||
const auto prune_height{GetPruneHeight(blockman, chain)};
|
||||
BOOST_REQUIRE(prune_height.has_value());
|
||||
BOOST_CHECK_EQUAL(*prune_height, height);
|
||||
}
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(get_prune_height, TestChain100Setup)
|
||||
{
|
||||
LOCK(::cs_main);
|
||||
auto& chain = m_node.chainman->ActiveChain();
|
||||
auto& blockman = m_node.chainman->m_blockman;
|
||||
|
||||
// Fresh chain of 100 blocks without any pruned blocks, so std::nullopt should be returned
|
||||
BOOST_CHECK(!GetPruneHeight(blockman, chain).has_value());
|
||||
|
||||
// Start pruning
|
||||
CheckGetPruneHeight(blockman, chain, 1);
|
||||
CheckGetPruneHeight(blockman, chain, 99);
|
||||
CheckGetPruneHeight(blockman, chain, 100);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_SUITE_END()
|
||||
|
||||
Reference in New Issue
Block a user