Bitcoin Core  31.0.0
P2P Digital Currency
base.h
Go to the documentation of this file.
1 // Copyright (c) 2017-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_INDEX_BASE_H
6 #define BITCOIN_INDEX_BASE_H
7 
8 #include <attributes.h>
9 #include <dbwrapper.h>
10 #include <interfaces/chain.h>
11 #include <kernel/cs_main.h>
12 #include <threadsafety.h>
13 #include <uint256.h>
14 #include <util/fs.h>
15 #include <util/threadinterrupt.h>
16 #include <validationinterface.h>
17 
18 #include <atomic>
19 #include <cstddef>
20 #include <memory>
21 #include <optional>
22 #include <string>
23 #include <thread>
24 
25 class CBlock;
26 class CBlockIndex;
27 class Chainstate;
28 
29 struct CBlockLocator;
30 struct IndexSummary {
31  std::string name;
32  bool synced{false};
35 };
36 namespace interfaces {
37 struct BlockRef;
38 }
39 namespace util {
40 template <unsigned int num_params>
42 }
43 
55 {
56 protected:
64  class DB : public CDBWrapper
65  {
66  public:
67  DB(const fs::path& path, size_t n_cache_size,
68  bool f_memory = false, bool f_wipe = false, bool f_obfuscate = false);
69 
73 
75  void WriteBestBlock(CDBBatch& batch, const CBlockLocator& locator);
76  };
77 
78 private:
80  std::atomic<bool> m_init{false};
88  std::atomic<bool> m_synced{false};
89 
91  std::atomic<const CBlockIndex*> m_best_block_index{nullptr};
92 
93  std::thread m_thread_sync;
95 
104  bool Commit();
105 
107  bool Rewind(const CBlockIndex* current_tip, const CBlockIndex* new_tip);
108 
109  bool ProcessBlock(const CBlockIndex* pindex, const CBlock* block_data = nullptr);
110 
111  virtual bool AllowPrune() const = 0;
112 
113  template <typename... Args>
114  void FatalErrorf(util::ConstevalFormatString<sizeof...(Args)> fmt, const Args&... args);
115 
116 protected:
117  std::unique_ptr<interfaces::Chain> m_chain;
119  const std::string m_name;
120 
121  void BlockConnected(const kernel::ChainstateRole& role, const std::shared_ptr<const CBlock>& block, const CBlockIndex* pindex) override;
122 
123  void ChainStateFlushed(const kernel::ChainstateRole& role, const CBlockLocator& locator) override;
124 
126  [[nodiscard]] virtual bool CustomInit(const std::optional<interfaces::BlockRef>& block) { return true; }
127 
129  [[nodiscard]] virtual bool CustomAppend(const interfaces::BlockInfo& block) { return true; }
130 
133  virtual bool CustomCommit(CDBBatch& batch) { return true; }
134 
136  [[nodiscard]] virtual bool CustomRemove(const interfaces::BlockInfo& block) { return true; }
137 
138  virtual DB& GetDB() const = 0;
139 
141  void SetBestBlockIndex(const CBlockIndex* block);
142 
143 public:
144  BaseIndex(std::unique_ptr<interfaces::Chain> chain, std::string name);
146  virtual ~BaseIndex();
147 
149  const std::string& GetName() const LIFETIMEBOUND { return m_name; }
150 
152  [[nodiscard]] virtual interfaces::Chain::NotifyOptions CustomOptions() { return {}; }
153 
159  bool BlockUntilSyncedToCurrentChain() const LOCKS_EXCLUDED(::cs_main);
160 
161  void Interrupt();
162 
165  [[nodiscard]] bool Init();
166 
168  [[nodiscard]] bool StartBackgroundSync();
169 
175  void Sync();
176 
178  void Stop();
179 
181  IndexSummary GetSummary() const;
182 };
183 
184 #endif // BITCOIN_INDEX_BASE_H
bool Commit()
Write the current index state (eg.
Definition: base.cpp:270
virtual interfaces::Chain::NotifyOptions CustomOptions()
Return custom notification options for index.
Definition: base.h:152
CThreadInterrupt m_interrupt
Definition: base.h:94
BaseIndex(std::unique_ptr< interfaces::Chain > chain, std::string name)
Definition: base.cpp:95
Describes a place in the block chain to another node such that if the other node doesn&#39;t have the sam...
Definition: block.h:116
std::atomic< bool > m_synced
Whether the index is in sync with the main chain.
Definition: base.h:88
Batch of changes queued to be written to a CDBWrapper.
Definition: dbwrapper.h:71
virtual bool CustomAppend(const interfaces::BlockInfo &block)
Write update index entries for a newly connected block.
Definition: base.h:129
Definition: block.h:73
void SetBestBlockIndex(const CBlockIndex *block)
Update the internal best block index as well as the prune lock.
Definition: base.cpp:487
Information about chainstate that notifications are sent from.
Definition: types.h:18
Interrupt(node)
const std::string m_name
Definition: base.h:119
bool ProcessBlock(const CBlockIndex *pindex, const CBlock *block_data=nullptr)
Definition: base.cpp:168
bool Rewind(const CBlockIndex *current_tip, const CBlockIndex *new_tip)
Loop over disconnected blocks and call CustomRemove.
Definition: base.cpp:290
bool synced
Definition: base.h:32
CBlockLocator ReadBestBlock() const
Read block locator of the chain that the index is in sync with.
Definition: base.cpp:78
Implement this to subscribe to events generated in validation and mempool.
void Stop()
Stops the instance from staying in sync with blockchain updates.
Definition: base.cpp:461
The database stores a block locator of the chain the database is synced to so that the index can effi...
Definition: base.h:64
std::thread m_thread_sync
Definition: base.h:93
Definition: init.h:12
Block data sent with blockConnected, blockDisconnected notifications.
Definition: chain.h:19
virtual ~BaseIndex()
Destructor interrupts sync thread if running and blocks until it exits.
Definition: base.cpp:98
Base class for indices of blockchain data.
Definition: base.h:54
void WriteBestBlock(CDBBatch &batch, const CBlockLocator &locator)
Write block locator of the chain that the index is in sync with.
Definition: base.cpp:90
ArgsManager & args
Definition: bitcoind.cpp:277
#define LIFETIMEBOUND
Definition: attributes.h:16
void BlockConnected(const kernel::ChainstateRole &role, const std::shared_ptr< const CBlock > &block, const CBlockIndex *pindex) override
Notifies listeners of a block being connected.
Definition: base.cpp:328
Chainstate stores and provides an API to update our local knowledge of the current best chain...
Definition: validation.h:550
const std::string & GetName() const LIFETIMEBOUND
Get the name of the index for display in logs.
Definition: base.h:149
const char * name
Definition: rest.cpp:48
std::atomic< bool > m_init
Whether the index has been initialized or not.
Definition: base.h:80
void ChainStateFlushed(const kernel::ChainstateRole &role, const CBlockLocator &locator) override
Notifies listeners of the new active block chain on-disk.
Definition: base.cpp:380
Options specifying which chain notifications are required.
Definition: chain.h:318
void Sync()
Sync the index with the block index starting from the current best block.
Definition: base.cpp:201
A wrapper for a compile-time partially validated format string.
Definition: base.h:41
A helper class for interruptible sleeps.
virtual bool CustomInit(const std::optional< interfaces::BlockRef > &block)
Initialize internal state from the database and block index.
Definition: base.h:126
bool StartBackgroundSync()
Starts the initial sync process on a background thread.
Definition: base.cpp:453
virtual bool CustomRemove(const interfaces::BlockInfo &block)
Rewind index by one block during a chain reorg.
Definition: base.h:136
256-bit opaque blob.
Definition: uint256.h:195
virtual bool CustomCommit(CDBBatch &batch)
Virtual method called internally by Commit that can be overridden to atomically commit more index sta...
Definition: base.h:133
std::string name
Definition: base.h:31
#define LOCKS_EXCLUDED(...)
Definition: threadsafety.h:50
int best_block_height
Definition: base.h:33
The block chain is a tree shaped structure starting with the genesis block at the root...
Definition: chain.h:93
Chainstate * m_chainstate
Definition: base.h:118
DB(const fs::path &path, size_t n_cache_size, bool f_memory=false, bool f_wipe=false, bool f_obfuscate=false)
Definition: base.cpp:68
Path class wrapper to block calls to the fs::path(std::string) implicit constructor and the fs::path:...
Definition: fs.h:33
RecursiveMutex cs_main
Mutex to guard access to validation specific variables, such as reading or changing the chainstate...
Definition: cs_main.cpp:8
virtual DB & GetDB() const =0
std::atomic< const CBlockIndex * > m_best_block_index
The last block in the chain that the index is in sync with.
Definition: base.h:91
void FatalErrorf(util::ConstevalFormatString< sizeof...(Args)> fmt, const Args &... args)
Definition: base.cpp:53
uint256 best_block_hash
Definition: base.h:34
virtual bool AllowPrune() const =0
std::unique_ptr< interfaces::Chain > m_chain
Definition: base.h:117
IndexSummary GetSummary() const
Get a summary of the index and its state.
Definition: base.cpp:472