Skip to content

Commit ca7c0b9

Browse files
committed
Split off VerifyLoadedChainstate
1 parent adf4912 commit ca7c0b9

File tree

3 files changed

+57
-24
lines changed

3 files changed

+57
-24
lines changed

src/init.cpp

+25-13
Original file line numberDiff line numberDiff line change
@@ -1427,9 +1427,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
14271427
fReindexChainState,
14281428
nBlockTreeDBCache,
14291429
nCoinDBCache,
1430-
nCoinCacheUsage,
1431-
args.GetIntArg("-checkblocks", DEFAULT_CHECKBLOCKS),
1432-
args.GetIntArg("-checklevel", DEFAULT_CHECKLEVEL));
1430+
nCoinCacheUsage);
14331431
if (rv.has_value()) {
14341432
switch (rv.value()) {
14351433
case ChainstateLoadingError::ERROR_LOADING_BLOCK_DB:
@@ -1461,20 +1459,34 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
14611459
strLoadError = strprintf(_("Witness data for blocks after height %d requires validation. Please restart with -reindex."),
14621460
chainparams.GetConsensus().SegwitHeight);
14631461
break;
1464-
case ChainstateLoadingError::ERROR_BLOCK_FROM_FUTURE:
1465-
strLoadError = _("The block database contains a block which appears to be from the future. "
1466-
"This may be due to your computer's date and time being set incorrectly. "
1467-
"Only rebuild the block database if you are sure that your computer's date and time are correct");
1468-
break;
1469-
case ChainstateLoadingError::ERROR_CORRUPTED_BLOCK_DB:
1470-
strLoadError = _("Corrupted block database detected");
1471-
break;
14721462
case ChainstateLoadingError::SHUTDOWN_PROBED:
14731463
break;
14741464
}
14751465
} else {
1476-
fLoaded = true;
1477-
LogPrintf(" block index %15dms\n", GetTimeMillis() - load_block_index_start_time);
1466+
auto rv2 = VerifyLoadedChainstate(chainman,
1467+
fReset,
1468+
fReindexChainState,
1469+
chainparams,
1470+
args.GetIntArg("-checkblocks", DEFAULT_CHECKBLOCKS),
1471+
args.GetIntArg("-checklevel", DEFAULT_CHECKLEVEL));
1472+
if (rv2.has_value()) {
1473+
switch (rv2.value()) {
1474+
case ChainstateLoadVerifyError::ERROR_BLOCK_FROM_FUTURE:
1475+
strLoadError = _("The block database contains a block which appears to be from the future. "
1476+
"This may be due to your computer's date and time being set incorrectly. "
1477+
"Only rebuild the block database if you are sure that your computer's date and time are correct");
1478+
break;
1479+
case ChainstateLoadVerifyError::ERROR_CORRUPTED_BLOCK_DB:
1480+
strLoadError = _("Corrupted block database detected");
1481+
break;
1482+
case ChainstateLoadVerifyError::ERROR_GENERIC_FAILURE:
1483+
strLoadError = _("Error opening block database");
1484+
break;
1485+
}
1486+
} else {
1487+
fLoaded = true;
1488+
LogPrintf(" block index %15dms\n", GetTimeMillis() - load_block_index_start_time);
1489+
}
14781490
}
14791491

14801492
if (!fLoaded && !ShutdownRequested()) {

src/node/chainstate.cpp

+18-6
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,7 @@ std::optional<ChainstateLoadingError> LoadChainstate(bool fReset,
2020
bool fReindexChainState,
2121
int64_t nBlockTreeDBCache,
2222
int64_t nCoinDBCache,
23-
int64_t nCoinCacheUsage,
24-
unsigned int check_blocks,
25-
unsigned int check_level)
23+
int64_t nCoinCacheUsage)
2624
{
2725
auto is_coinsview_empty = [&](CChainState* chainstate) EXCLUSIVE_LOCKS_REQUIRED(::cs_main) {
2826
return fReset || fReindexChainState || chainstate->CoinsTip().GetBestBlock().IsNull();
@@ -131,6 +129,20 @@ std::optional<ChainstateLoadingError> LoadChainstate(bool fReset,
131129
}
132130
}
133131

132+
return std::nullopt;
133+
}
134+
135+
std::optional<ChainstateLoadVerifyError> VerifyLoadedChainstate(ChainstateManager& chainman,
136+
bool fReset,
137+
bool fReindexChainState,
138+
const CChainParams& chainparams,
139+
unsigned int check_blocks,
140+
unsigned int check_level)
141+
{
142+
auto is_coinsview_empty = [&](CChainState* chainstate) EXCLUSIVE_LOCKS_REQUIRED(::cs_main) {
143+
return fReset || fReindexChainState || chainstate->CoinsTip().GetBestBlock().IsNull();
144+
};
145+
134146
try {
135147
LOCK(cs_main);
136148

@@ -145,20 +157,20 @@ std::optional<ChainstateLoadingError> LoadChainstate(bool fReset,
145157
const CBlockIndex* tip = chainstate->m_chain.Tip();
146158
RPCNotifyBlockChange(tip);
147159
if (tip && tip->nTime > GetTime() + MAX_FUTURE_BLOCK_TIME) {
148-
return ChainstateLoadingError::ERROR_BLOCK_FROM_FUTURE;
160+
return ChainstateLoadVerifyError::ERROR_BLOCK_FROM_FUTURE;
149161
}
150162

151163
if (!CVerifyDB().VerifyDB(
152164
*chainstate, chainparams, chainstate->CoinsDB(),
153165
check_level,
154166
check_blocks)) {
155-
return ChainstateLoadingError::ERROR_CORRUPTED_BLOCK_DB;
167+
return ChainstateLoadVerifyError::ERROR_CORRUPTED_BLOCK_DB;
156168
}
157169
}
158170
}
159171
} catch (const std::exception& e) {
160172
LogPrintf("%s\n", e.what());
161-
return ChainstateLoadingError::ERROR_GENERIC_BLOCKDB_OPEN_FAILED;
173+
return ChainstateLoadVerifyError::ERROR_GENERIC_FAILURE;
162174
}
163175

164176
return std::nullopt;

src/node/chainstate.h

+14-5
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@ enum class ChainstateLoadingError {
2222
ERROR_LOADCHAINTIP_FAILED,
2323
ERROR_GENERIC_BLOCKDB_OPEN_FAILED,
2424
ERROR_BLOCKS_WITNESS_INSUFFICIENTLY_VALIDATED,
25-
ERROR_BLOCK_FROM_FUTURE,
26-
ERROR_CORRUPTED_BLOCK_DB,
2725
SHUTDOWN_PROBED,
2826
};
2927

@@ -61,8 +59,19 @@ std::optional<ChainstateLoadingError> LoadChainstate(bool fReset,
6159
bool fReindexChainState,
6260
int64_t nBlockTreeDBCache,
6361
int64_t nCoinDBCache,
64-
int64_t nCoinCacheUsage,
65-
unsigned int check_blocks,
66-
unsigned int check_level);
62+
int64_t nCoinCacheUsage);
63+
64+
enum class ChainstateLoadVerifyError {
65+
ERROR_BLOCK_FROM_FUTURE,
66+
ERROR_CORRUPTED_BLOCK_DB,
67+
ERROR_GENERIC_FAILURE,
68+
};
69+
70+
std::optional<ChainstateLoadVerifyError> VerifyLoadedChainstate(ChainstateManager& chainman,
71+
bool fReset,
72+
bool fReindexChainState,
73+
const CChainParams& chainparams,
74+
unsigned int check_blocks,
75+
unsigned int check_level);
6776

6877
#endif // BITCOIN_NODE_CHAINSTATE_H

0 commit comments

Comments
 (0)