// Copyright (c) 2021 The Bitcoin Core developers // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #ifndef BITCOIN_NODE_CHAINSTATE_H #define BITCOIN_NODE_CHAINSTATE_H #include #include #include #include class ChainstateManager; class CTxMemPool; namespace node { struct CacheSizes; struct ChainstateLoadOptions { CTxMemPool* mempool{nullptr}; bool block_tree_db_in_memory{false}; bool coins_db_in_memory{false}; bool reindex{false}; bool reindex_chainstate{false}; bool prune{false}; int64_t check_blocks{DEFAULT_CHECKBLOCKS}; int64_t check_level{DEFAULT_CHECKLEVEL}; std::function check_interrupt; std::function coins_error_cb; }; enum class ChainstateLoadingError { ERROR_LOADING_BLOCK_DB, ERROR_BAD_GENESIS_BLOCK, ERROR_PRUNED_NEEDS_REINDEX, ERROR_LOAD_GENESIS_BLOCK_FAILED, ERROR_CHAINSTATE_UPGRADE_FAILED, ERROR_REPLAYBLOCKS_FAILED, ERROR_LOADCHAINTIP_FAILED, ERROR_GENERIC_BLOCKDB_OPEN_FAILED, ERROR_BLOCKS_WITNESS_INSUFFICIENTLY_VALIDATED, SHUTDOWN_PROBED, }; /** This sequence can have 4 types of outcomes: * * 1. Success * 2. Shutdown requested * - nothing failed but a shutdown was triggered in the middle of the * sequence * 3. Soft failure * - a failure that might be recovered from with a reindex * 4. Hard failure * - a failure that definitively cannot be recovered from with a reindex * * Currently, LoadChainstate returns a std::optional * which: * * - if has_value() * - Either "Soft failure", "Hard failure", or "Shutdown requested", * differentiable by the specific enumerator. * * Note that a return value of SHUTDOWN_PROBED means ONLY that "during * this sequence, when we explicitly checked shutdown_requested() at * arbitrary points, one of those calls returned true". Therefore, a * return value other than SHUTDOWN_PROBED does not guarantee that * shutdown hasn't been called indirectly. * - else * - Success! */ std::optional LoadChainstate(ChainstateManager& chainman, const CacheSizes& cache_sizes, const ChainstateLoadOptions& options); enum class ChainstateLoadVerifyError { ERROR_BLOCK_FROM_FUTURE, ERROR_CORRUPTED_BLOCK_DB, ERROR_GENERIC_FAILURE, }; std::optional VerifyLoadedChainstate(ChainstateManager& chainman, const ChainstateLoadOptions& options); } // namespace node #endif // BITCOIN_NODE_CHAINSTATE_H