/ src / node / chainstate.h
chainstate.h
 1  // Copyright (c) 2021-present The Bitcoin Core developers
 2  // Distributed under the MIT software license, see the accompanying
 3  // file COPYING or http://www.opensource.org/licenses/mit-license.php.
 4  
 5  #ifndef BITCOIN_NODE_CHAINSTATE_H
 6  #define BITCOIN_NODE_CHAINSTATE_H
 7  
 8  #include <util/translation.h>
 9  #include <validation.h>
10  
11  #include <cstdint>
12  #include <functional>
13  #include <tuple>
14  
15  class CTxMemPool;
16  
17  namespace kernel {
18  struct CacheSizes;
19  } // namespace kernel
20  
21  namespace node {
22  
23  struct ChainstateLoadOptions {
24      CTxMemPool* mempool{nullptr};
25      bool coins_db_in_memory{false};
26      // Whether to wipe the chainstate database when loading it. If set, this
27      // will cause the chainstate database to be rebuilt starting from genesis.
28      bool wipe_chainstate_db{false};
29      bool prune{false};
30      //! Setting require_full_verification to true will require all checks at
31      //! check_level (below) to succeed for loading to succeed. Setting it to
32      //! false will skip checks if cache is not big enough to run them, so may be
33      //! helpful for running with a small cache.
34      bool require_full_verification{true};
35      int64_t check_blocks{DEFAULT_CHECKBLOCKS};
36      int64_t check_level{DEFAULT_CHECKLEVEL};
37      std::function<void()> coins_error_cb;
38  };
39  
40  //! Chainstate load status. Simple applications can just check for the success
41  //! case, and treat other cases as errors. More complex applications may want to
42  //! try reindexing in the generic failure case, and pass an interrupt callback
43  //! and exit cleanly in the interrupted case.
44  enum class ChainstateLoadStatus {
45      SUCCESS,
46      FAILURE, //!< Generic failure which reindexing may fix
47      FAILURE_FATAL, //!< Fatal error which should not prompt to reindex
48      FAILURE_INCOMPATIBLE_DB,
49      FAILURE_INSUFFICIENT_DBCACHE,
50      INTERRUPTED,
51  };
52  
53  //! Chainstate load status code and optional error string.
54  using ChainstateLoadResult = std::tuple<ChainstateLoadStatus, bilingual_str>;
55  
56  /** This sequence can have 4 types of outcomes:
57   *
58   *  1. Success
59   *  2. Shutdown requested
60   *    - nothing failed but a shutdown was triggered in the middle of the
61   *      sequence
62   *  3. Soft failure
63   *    - a failure that might be recovered from with a reindex
64   *  4. Hard failure
65   *    - a failure that definitively cannot be recovered from with a reindex
66   *
67   *  LoadChainstate returns a (status code, error string) tuple.
68   */
69  ChainstateLoadResult LoadChainstate(ChainstateManager& chainman, const kernel::CacheSizes& cache_sizes,
70                                      const ChainstateLoadOptions& options);
71  ChainstateLoadResult VerifyLoadedChainstate(ChainstateManager& chainman, const ChainstateLoadOptions& options);
72  } // namespace node
73  
74  #endif // BITCOIN_NODE_CHAINSTATE_H