Skip to content

Commit 5bc2077

Browse files
mzumsanderyanofsky
andcommitted
validation: allow to specify frequency for -checkblockindex
This makes it similar to -checkaddrman and -checkmempool, which also allow to run the check occasionally instead of always / never. Co-authored-by: Ryan Ofsky <ryan@ofsky.org>
1 parent d5a631b commit 5bc2077

File tree

6 files changed

+16
-5
lines changed

6 files changed

+16
-5
lines changed

src/init.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -604,7 +604,7 @@ void SetupServerArgs(ArgsManager& argsman)
604604

605605
argsman.AddArg("-checkblocks=<n>", strprintf("How many blocks to check at startup (default: %u, 0 = all)", DEFAULT_CHECKBLOCKS), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
606606
argsman.AddArg("-checklevel=<n>", strprintf("How thorough the block verification of -checkblocks is: %s (0-4, default: %u)", Join(CHECKLEVEL_DOC, ", "), DEFAULT_CHECKLEVEL), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
607-
argsman.AddArg("-checkblockindex", strprintf("Do a consistency check for the block tree, chainstate, and other validation data structures occasionally. (default: %u, regtest: %u)", defaultChainParams->DefaultConsistencyChecks(), regtestChainParams->DefaultConsistencyChecks()), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
607+
argsman.AddArg("-checkblockindex", strprintf("Do a consistency check for the block tree, chainstate, and other validation data structures every <n> operations. Use 0 to disable. (default: %u, regtest: %u)", defaultChainParams->DefaultConsistencyChecks(), regtestChainParams->DefaultConsistencyChecks()), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
608608
argsman.AddArg("-checkaddrman=<n>", strprintf("Run addrman consistency checks every <n> operations. Use 0 to disable. (default: %u)", DEFAULT_ADDRMAN_CONSISTENCY_CHECKS), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
609609
argsman.AddArg("-checkmempool=<n>", strprintf("Run mempool consistency checks every <n> transactions. Use 0 to disable. (default: %u, regtest: %u)", defaultChainParams->DefaultConsistencyChecks(), regtestChainParams->DefaultConsistencyChecks()), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
610610
argsman.AddArg("-checkpoints", strprintf("Enable rejection of any forks from the known historical chain until block %s (default: %u)", defaultChainParams->Checkpoints().GetHeight(), DEFAULT_CHECKPOINTS_ENABLED), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);

src/kernel/chainstatemanager_opts.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ namespace kernel {
3333
struct ChainstateManagerOpts {
3434
const CChainParams& chainparams;
3535
fs::path datadir;
36-
std::optional<bool> check_block_index{};
36+
std::optional<int32_t> check_block_index{};
3737
bool checkpoints_enabled{DEFAULT_CHECKPOINTS_ENABLED};
3838
//! If set, it will override the minimum work we will assume exists on some valid chain.
3939
std::optional<arith_uint256> minimum_chain_work{};

src/node/chainstatemanager_args.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,10 @@
2424
namespace node {
2525
util::Result<void> ApplyArgsManOptions(const ArgsManager& args, ChainstateManager::Options& opts)
2626
{
27-
if (auto value{args.GetBoolArg("-checkblockindex")}) opts.check_block_index = *value;
27+
if (auto value{args.GetIntArg("-checkblockindex")}) {
28+
// Interpret bare -checkblockindex argument as 1 instead of 0.
29+
opts.check_block_index = args.GetArg("-checkblockindex")->empty() ? 1 : *value;
30+
}
2831

2932
if (auto value{args.GetBoolArg("-checkpoints")}) opts.checkpoints_enabled = *value;
3033

src/test/util/setup_common.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,7 @@ ChainTestingSetup::ChainTestingSetup(const ChainType chainType, const std::vecto
238238
const ChainstateManager::Options chainman_opts{
239239
.chainparams = chainparams,
240240
.datadir = m_args.GetDataDirNet(),
241-
.check_block_index = true,
241+
.check_block_index = 1,
242242
.notifications = *m_node.notifications,
243243
.signals = m_node.validation_signals.get(),
244244
.worker_threads_num = 2,

src/validation.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5034,6 +5034,14 @@ void ChainstateManager::LoadExternalBlockFile(
50345034
LogPrintf("Loaded %i blocks from external file in %dms\n", nLoaded, Ticks<std::chrono::milliseconds>(SteadyClock::now() - start));
50355035
}
50365036

5037+
bool ChainstateManager::ShouldCheckBlockIndex() const
5038+
{
5039+
// Assert to verify Flatten() has been called.
5040+
if (!*Assert(m_options.check_block_index)) return false;
5041+
if (GetRand(*m_options.check_block_index) >= 1) return false;
5042+
return true;
5043+
}
5044+
50375045
void ChainstateManager::CheckBlockIndex()
50385046
{
50395047
if (!ShouldCheckBlockIndex()) {

src/validation.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -933,7 +933,7 @@ class ChainstateManager
933933

934934
const CChainParams& GetParams() const { return m_options.chainparams; }
935935
const Consensus::Params& GetConsensus() const { return m_options.chainparams.GetConsensus(); }
936-
bool ShouldCheckBlockIndex() const { return *Assert(m_options.check_block_index); }
936+
bool ShouldCheckBlockIndex() const;
937937
const arith_uint256& MinimumChainWork() const { return *Assert(m_options.minimum_chain_work); }
938938
const uint256& AssumedValidBlock() const { return *Assert(m_options.assumed_valid_block); }
939939
kernel::Notifications& GetNotifications() const { return m_options.notifications; };

0 commit comments

Comments
 (0)