Bitcoin ABC  0.24.11
P2P Digital Currency
base.h
Go to the documentation of this file.
1 // Copyright (c) 2017-2018 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 <primitives/block.h>
10 #include <primitives/transaction.h>
11 #include <threadinterrupt.h>
12 #include <validationinterface.h>
13 
14 class CBlockIndex;
15 
16 struct IndexSummary {
17  std::string name;
18  bool synced{false};
20 };
21 
28 protected:
36  class DB : public CDBWrapper {
37  public:
38  DB(const fs::path &path, size_t n_cache_size, bool f_memory = false,
39  bool f_wipe = false, bool f_obfuscate = false);
40 
42  bool ReadBestBlock(CBlockLocator &locator) const;
43 
45  void WriteBestBlock(CDBBatch &batch, const CBlockLocator &locator);
46  };
47 
48 private:
52  std::atomic<bool> m_synced{false};
53 
55  std::atomic<const CBlockIndex *> m_best_block_index{nullptr};
56 
57  std::thread m_thread_sync;
59 
65  void ThreadSync();
66 
77  bool Commit();
78 
79 protected:
80  void BlockConnected(const std::shared_ptr<const CBlock> &block,
81  const CBlockIndex *pindex) override;
82 
83  void ChainStateFlushed(const CBlockLocator &locator) override;
84 
86  virtual bool Init();
87 
89  virtual bool WriteBlock(const CBlock &block, const CBlockIndex *pindex) {
90  return true;
91  }
92 
95  virtual bool CommitInternal(CDBBatch &batch);
96 
99  virtual bool Rewind(const CBlockIndex *current_tip,
100  const CBlockIndex *new_tip);
101 
102  virtual DB &GetDB() const = 0;
103 
105  virtual const char *GetName() const = 0;
106 
107 public:
109  virtual ~BaseIndex();
110 
116  bool BlockUntilSyncedToCurrentChain() const LOCKS_EXCLUDED(::cs_main);
117 
118  void Interrupt();
119 
122  void Start();
123 
125  void Stop();
126 
128  IndexSummary GetSummary() const;
129 };
130 
131 #endif // BITCOIN_INDEX_BASE_H
CValidationInterface
Implement this to subscribe to events generated in validation.
Definition: validationinterface.h:83
block.h
threadinterrupt.h
BaseIndex::ChainStateFlushed
void ChainStateFlushed(const CBlockLocator &locator) override
Notifies listeners of the new active block chain on-disk.
Definition: base.cpp:239
BaseIndex::m_synced
std::atomic< bool > m_synced
Whether the index is in sync with the main chain.
Definition: base.h:52
dbwrapper.h
IndexSummary::synced
bool synced
Definition: base.h:18
IndexSummary::name
std::string name
Definition: base.h:17
CDBBatch
Batch of changes queued to be written to a CDBWrapper.
Definition: dbwrapper.h:48
BaseIndex::Init
virtual bool Init()
Initialize internal state from the database and block index.
Definition: base.cpp:54
transaction.h
IndexSummary::best_block_height
int best_block_height
Definition: base.h:19
BaseIndex::GetSummary
IndexSummary GetSummary() const
Get a summary of the index and its state.
Definition: base.cpp:329
validationinterface.h
BaseIndex::m_thread_sync
std::thread m_thread_sync
Definition: base.h:57
BaseIndex::WriteBlock
virtual bool WriteBlock(const CBlock &block, const CBlockIndex *pindex)
Write update index entries for a newly connected block.
Definition: base.h:89
BaseIndex
Base class for indices of blockchain data.
Definition: base.h:27
BaseIndex::DB::WriteBestBlock
void WriteBestBlock(CDBBatch &batch, const CBlockLocator &locator)
Write block locator of the chain that the txindex is in sync with.
Definition: base.cpp:44
BaseIndex::~BaseIndex
virtual ~BaseIndex()
Destructor interrupts sync thread if running and blocks until it exits.
Definition: base.cpp:49
BaseIndex::Stop
void Stop()
Stops the instance from staying in sync with blockchain updates.
Definition: base.cpp:321
BaseIndex::DB::ReadBestBlock
bool ReadBestBlock(CBlockLocator &locator) const
Read block locator of the chain that the txindex is in sync with.
Definition: base.cpp:36
BaseIndex::Start
void Start()
Start initializes the sync state and registers the instance as a ValidationInterface so that it stays...
Definition: base.cpp:308
cs_main
RecursiveMutex cs_main
Global state.
Definition: validation.cpp:103
BaseIndex::Rewind
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:176
fs::path
Path class wrapper to prepare application code for transition from boost::filesystem library to std::...
Definition: fs.h:33
Interrupt
void Interrupt(NodeContext &node)
Interrupt threads.
Definition: init.cpp:164
BaseIndex::DB::DB
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
BaseIndex::m_best_block_index
std::atomic< const CBlockIndex * > m_best_block_index
The last block in the chain that the index is in sync with.
Definition: base.h:55
CDBWrapper
Definition: dbwrapper.h:171
CBlock
Definition: block.h:55
LOCKS_EXCLUDED
#define LOCKS_EXCLUDED(...)
Definition: threadsafety.h:55
BaseIndex::CommitInternal
virtual bool CommitInternal(CDBBatch &batch)
Virtual method called internally by Commit that can be overridden to atomically commit more index sta...
Definition: base.cpp:169
BaseIndex::BlockConnected
void BlockConnected(const std::shared_ptr< const CBlock > &block, const CBlockIndex *pindex) override
Notifies listeners of a block being connected.
Definition: base.cpp:192
BaseIndex::DB
The database stores a block locator of the chain the database is synced to so that the TxIndex can ef...
Definition: base.h:36
IndexSummary
Definition: base.h:16
BaseIndex::GetDB
virtual DB & GetDB() const =0
CBlockLocator
Describes a place in the block chain to another node such that if the other node doesn't have the sam...
Definition: block.h:100
BaseIndex::ThreadSync
void ThreadSync()
Sync the index with the block index starting from the current best block.
Definition: base.cpp:86
BaseIndex::GetName
virtual const char * GetName() const =0
Get the name of the index for display in logs.
CBlockIndex
The block chain is a tree shaped structure starting with the genesis block at the root,...
Definition: blockindex.h:23
CThreadInterrupt
A helper class for interruptible sleeps.
Definition: threadinterrupt.h:19
BaseIndex::m_interrupt
CThreadInterrupt m_interrupt
Definition: base.h:58
BaseIndex::Commit
bool Commit()
Write the current index state (eg.
Definition: base.cpp:160