23#include <validation.h>
43 if (!chainman.LoadBlockIndex()) {
48 if (!chainman.BlockIndex().empty() &&
49 !chainman.m_blockman.LookupBlockIndex(chainman.GetConsensus().hashGenesisBlock)) {
57 if (chainman.m_blockman.m_have_pruned && !options.prune) {
58 return {
ChainstateLoadStatus::FAILURE,
_(
"You need to rebuild the database using -reindex to go back to unpruned mode. This will redownload the entire blockchain")};
65 if (chainman.m_blockman.m_blockfiles_indexed && !chainman.ActiveChainstate().LoadGenesisBlock()) {
70 return options.wipe_chainstate_db || chainstate.CoinsTip().GetBestBlock().IsNull();
73 assert(chainman.m_total_coinstip_cache > 0);
74 assert(chainman.m_total_coinsdb_cache > 0);
81 double init_cache_fraction = chainman.HistoricalChainstate() ? 0.2 : 1.0;
86 for (
const auto& chainstate : chainman.m_chainstates) {
87 LogInfo(
"Initializing chainstate %s", chainstate->ToString());
90 chainstate->InitCoinsDB(
91 chainman.m_total_coinsdb_cache * init_cache_fraction,
92 options.coins_db_in_memory,
93 options.wipe_chainstate_db);
99 if (options.coins_error_cb) {
100 chainstate->CoinsErrorCatcher().AddReadErrCallback(options.coins_error_cb);
105 if (chainstate->CoinsDB().NeedsUpgrade()) {
107 "Please restart with -reindex-chainstate. This will "
108 "rebuild the chainstate database.")};
112 if (!chainstate->ReplayBlocks()) {
117 chainstate->InitCoinsCache(chainman.m_total_coinstip_cache * init_cache_fraction);
118 assert(chainstate->CanFlushToDisk());
120 if (!is_coinsview_empty(*chainstate)) {
122 if (!chainstate->LoadChainTip()) {
125 assert(chainstate->m_chain.Tip() !=
nullptr);
129 const auto& chainstates{chainman.m_chainstates};
130 if (std::any_of(chainstates.begin(), chainstates.end(),
133 chainman.GetConsensus().SegwitHeight)};
139 chainman.MaybeRebalanceCaches();
150 LogInfo(
"Validating signatures for all blocks.");
157 LogInfo(
"Block pruning enabled. Use RPC call pruneblockchain(height) to manually prune block and undo files.");
159 LogInfo(
"Prune configured to target %u MiB on disk for block and undo files.",
172 Chainstate* assumeutxo_cs{chainman.LoadAssumeutxoChainstate()};
176 validated_cs.SetTargetBlock(
nullptr);
177 LogInfo(
"[snapshot] deleting snapshot chainstate due to reindexing");
178 if (!chainman.DeleteChainstate(*assumeutxo_cs)) {
181 assumeutxo_cs =
nullptr;
186 return {init_status, init_error};
197 auto snapshot_completion{assumeutxo_cs
198 ? chainman.MaybeValidateSnapshot(validated_cs, *assumeutxo_cs)
204 LogInfo(
"[snapshot] cleaning up unneeded background chainstate, then reinitializing");
205 if (!chainman.ValidatedSnapshotCleanup(validated_cs, *assumeutxo_cs)) {
212 assert(chainman.m_chainstates.empty());
214 chainman.InitializeChainstate(options.
mempool);
222 return {init_status, init_error};
226 "UTXO snapshot failed to validate. "
227 "Restart to resume normal initial block download, or try loading a different snapshot.")};
241 for (
auto& chainstate : chainman.m_chainstates) {
242 if (!is_coinsview_empty(*chainstate)) {
243 const CBlockIndex* tip = chainstate->m_chain.Tip();
246 "This may be due to your computer's date and time being set incorrectly. "
247 "Only rebuild the block database if you are sure that your computer's date and time are correct")};
251 *chainstate, chainman.
GetConsensus(), chainstate->CoinsDB(),
arith_uint256 UintToArith256(const uint256 &a)
static constexpr int64_t MAX_FUTURE_BLOCK_TIME
Maximum amount of time that a block timestamp is allowed to exceed the current time before the block ...
The block chain is a tree shaped structure starting with the genesis block at the root,...
RAII wrapper for VerifyDB: Verify consistency of the block and coin databases.
VerifyDBResult VerifyDB(Chainstate &chainstate, const Consensus::Params &consensus_params, CCoinsView &coinsview, int nCheckLevel, int nCheckDepth) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
Chainstate stores and provides an API to update our local knowledge of the current best chain.
Interface for managing multiple Chainstate objects, where each chainstate is associated with chainsta...
const uint256 & AssumedValidBlock() const
size_t m_total_coinstip_cache
The total number of bytes available for us to use across all in-memory coins caches.
kernel::Notifications & GetNotifications() const
Chainstate & ActiveChainstate() const
Alternatives to CurrentChainstate() used by older code to query latest chainstate information without...
size_t m_total_coinsdb_cache
The total number of bytes available for us to use across all leveldb coins databases.
const Consensus::Params & GetConsensus() const
const arith_uint256 & MinimumChainWork() const
node::BlockManager m_blockman
A single BlockManager instance is shared across each constructed chainstate to avoid duplicating bloc...
constexpr bool IsNull() const
std::string GetHex() const
std::string GetHex() const
Hex encoding of the number (with the most significant digits first).
static constexpr auto PRUNE_TARGET_MANUAL
uint64_t GetPruneTarget() const
Attempt to stay below this number of bytes of block files.
RecursiveMutex cs_main
Mutex to guard access to validation specific variables, such as reading or changing the chainstate.
@ FAILURE_INCOMPATIBLE_DB
@ FAILURE_FATAL
Fatal error which should not prompt to reindex.
@ FAILURE
Generic failure which reindexing may fix.
@ FAILURE_INSUFFICIENT_DBCACHE
std::tuple< ChainstateLoadStatus, bilingual_str > ChainstateLoadResult
Chainstate load status code and optional error string.
static ChainstateLoadResult CompleteChainstateInitialization(ChainstateManager &chainman, const ChainstateLoadOptions &options) EXCLUSIVE_LOCKS_REQUIRED(
ChainstateLoadResult LoadChainstate(ChainstateManager &chainman, const CacheSizes &cache_sizes, const ChainstateLoadOptions &options)
ChainstateLoadResult VerifyLoadedChainstate(ChainstateManager &chainman, const ChainstateLoadOptions &options)
uint256 nMinimumChainWork
The best chain should have at least this much work.
bool require_full_verification
Setting require_full_verification to true will require all checks at check_level (below) to succeed f...
#define EXCLUSIVE_LOCKS_REQUIRED(...)
consteval auto _(util::TranslatedLiteral str)
bilingual_str Untranslated(std::string original)
Mark a bilingual_str as untranslated.
int64_t GetTime()
DEPRECATED Use either ClockType::now() or Now<TimePointType>() if a cast is needed.