Bitcoin Core 22.99.0
P2P Digital Currency
base.h
Go to the documentation of this file.
1// Copyright (c) 2017-2020 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 <dbwrapper.h>
9#include <threadinterrupt.h>
10#include <validationinterface.h>
11
12class CBlock;
13class CBlockIndex;
14class CChainState;
15
17 std::string name;
18 bool synced{false};
20};
21
28{
29protected:
37 class DB : public CDBWrapper
38 {
39 public:
40 DB(const fs::path& path, size_t n_cache_size,
41 bool f_memory = false, bool f_wipe = false, bool f_obfuscate = false);
42
44 bool ReadBestBlock(CBlockLocator& locator) const;
45
47 void WriteBestBlock(CDBBatch& batch, const CBlockLocator& locator);
48 };
49
50private:
54 std::atomic<bool> m_synced{false};
55
57 std::atomic<const CBlockIndex*> m_best_block_index{nullptr};
58
59 std::thread m_thread_sync;
61
67 void ThreadSync();
68
77 bool Commit();
78protected:
80
81 void BlockConnected(const std::shared_ptr<const CBlock>& block, const CBlockIndex* pindex) override;
82
83 void ChainStateFlushed(const CBlockLocator& locator) override;
84
85 const CBlockIndex* CurrentIndex() { return m_best_block_index.load(); };
86
88 [[nodiscard]] virtual bool Init();
89
91 virtual bool WriteBlock(const CBlock& block, const CBlockIndex* pindex) { return true; }
92
95 virtual bool CommitInternal(CDBBatch& batch);
96
99 virtual bool Rewind(const CBlockIndex* current_tip, const CBlockIndex* new_tip);
100
101 virtual DB& GetDB() const = 0;
102
104 virtual const char* GetName() const = 0;
105
106public:
108 virtual ~BaseIndex();
109
115 bool BlockUntilSyncedToCurrentChain() const LOCKS_EXCLUDED(::cs_main);
116
117 void Interrupt();
118
121 [[nodiscard]] bool Start(CChainState& active_chainstate);
122
124 void Stop();
125
127 IndexSummary GetSummary() const;
128};
129
130#endif // BITCOIN_INDEX_BASE_H
RecursiveMutex cs_main
Mutex to guard access to validation specific variables, such as reading or changing the chainstate.
Definition: validation.cpp:118
The database stores a block locator of the chain the database is synced to so that the index can effi...
Definition: base.h:38
void WriteBestBlock(CDBBatch &batch, const CBlockLocator &locator)
Write block locator of the chain that the txindex is in sync with.
Definition: base.cpp:45
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:32
bool ReadBestBlock(CBlockLocator &locator) const
Read block locator of the chain that the txindex is in sync with.
Definition: base.cpp:36
Base class for indices of blockchain data.
Definition: base.h:28
void Stop()
Stops the instance from staying in sync with blockchain updates.
Definition: base.cpp:357
virtual bool Init()
Initialize internal state from the database and block index.
Definition: base.cpp:56
void BlockConnected(const std::shared_ptr< const CBlock > &block, const CBlockIndex *pindex) override
Notifies listeners of a block being connected.
Definition: base.cpp:233
virtual const char * GetName() const =0
Get the name of the index for display in logs.
CChainState * m_chainstate
Definition: base.h:79
virtual ~BaseIndex()
Destructor interrupts sync thread if running and blocks until it exits.
Definition: base.cpp:50
virtual bool CommitInternal(CDBBatch &batch)
Virtual method called internally by Commit that can be overridden to atomically commit more index sta...
Definition: base.cpp:206
bool BlockUntilSyncedToCurrentChain() const LOCKS_EXCLUDED(void Interrupt()
Blocks the current thread until the index is caught up to the current state of the block chain.
Definition: base.cpp:338
std::atomic< bool > m_synced
Whether the index is in sync with the main chain.
Definition: base.h:54
CThreadInterrupt m_interrupt
Definition: base.h:60
IndexSummary GetSummary() const
Get a summary of the index and its state.
Definition: base.cpp:366
virtual DB & GetDB() const =0
void ChainStateFlushed(const CBlockLocator &locator) override
Notifies listeners of the new active block chain on-disk.
Definition: base.cpp:275
std::thread m_thread_sync
Definition: base.h:59
bool Commit()
Write the current index state (eg.
Definition: base.cpp:197
virtual bool WriteBlock(const CBlock &block, const CBlockIndex *pindex)
Write update index entries for a newly connected block.
Definition: base.h:91
void ThreadSync()
Sync the index with the block index starting from the current best block.
Definition: base.cpp:125
const CBlockIndex * CurrentIndex()
Definition: base.h:85
virtual bool Rewind(const CBlockIndex *current_tip, const CBlockIndex *new_tip)
Rewind index to an earlier chain tip during a chain reorg.
Definition: base.cpp:213
std::atomic< const CBlockIndex * > m_best_block_index
The last block in the chain that the index is in sync with.
Definition: base.h:57
bool Start(CChainState &active_chainstate)
Start initializes the sync state and registers the instance as a ValidationInterface so that it stays...
Definition: base.cpp:343
Definition: block.h:63
The block chain is a tree shaped structure starting with the genesis block at the root,...
Definition: chain.h:146
CChainState stores and provides an API to update our local knowledge of the current best chain.
Definition: validation.h:544
Batch of changes queued to be written to a CDBWrapper.
Definition: dbwrapper.h:48
Implement this to subscribe to events generated in validation.
Path class wrapper to prepare application code for transition from boost::filesystem library to std::...
Definition: fs.h:34
Describes a place in the block chain to another node such that if the other node doesn't have the sam...
Definition: block.h:115
std::string name
Definition: base.h:17
bool synced
Definition: base.h:18
int best_block_height
Definition: base.h:19
#define LOCKS_EXCLUDED(...)
Definition: threadsafety.h:48