diff options
author | Jim Posen <jimpo@coinbase.com> | 2017-12-08 10:19:57 -0800 |
---|---|---|
committer | Jim Posen <jimpo@coinbase.com> | 2018-04-25 11:25:07 -0700 |
commit | 34d68bf3a3db2b78c07180416949bbc58bd0b682 (patch) | |
tree | b283962424bb5097ba4f4218dad2f9a6bb1ef3a9 /src/index/txindex.h | |
parent | c88bcec93fa8b969e65b1fe7716bda429276bbd4 (diff) |
[index] Create new TxIndex class.
The TxIndex will be responsible for building the transaction index
concurrently with the main validation thread by implementing
ValidationInterface. This does not process blocks concurrently yet.
Diffstat (limited to 'src/index/txindex.h')
-rw-r--r-- | src/index/txindex.h | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/src/index/txindex.h b/src/index/txindex.h new file mode 100644 index 0000000000..3d42a89635 --- /dev/null +++ b/src/index/txindex.h @@ -0,0 +1,60 @@ +// Copyright (c) 2017-2018 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_INDEX_TXINDEX_H +#define BITCOIN_INDEX_TXINDEX_H + +#include <primitives/block.h> +#include <txdb.h> +#include <uint256.h> +#include <validationinterface.h> + +class CBlockIndex; + +/** + * TxIndex is used to look up transactions included in the blockchain by hash. + * The index is written to a LevelDB database and records the filesystem + * location of each transaction by transaction hash. + */ +class TxIndex final : public CValidationInterface +{ +private: + const std::unique_ptr<TxIndexDB> m_db; + + /// Whether the index is in sync with the main chain. The flag is flipped + /// from false to true once, after which point this starts processing + /// ValidationInterface notifications to stay in sync. + std::atomic<bool> m_synced; + + /// The last block in the chain that the TxIndex is in sync with. + std::atomic<const CBlockIndex*> m_best_block_index; + + /// Initialize internal state from the database and block index. + bool Init(); + + /// Write update index entries for a newly connected block. + bool WriteBlock(const CBlock& block, const CBlockIndex* pindex); + +protected: + void BlockConnected(const std::shared_ptr<const CBlock>& block, const CBlockIndex* pindex, + const std::vector<CTransactionRef>& txn_conflicted) override; + + void SetBestChain(const CBlockLocator& locator) override; + +public: + /// Constructs the TxIndex, which becomes available to be queried. + explicit TxIndex(std::unique_ptr<TxIndexDB> db); + + /// Look up the on-disk location of a transaction by hash. + bool FindTx(const uint256& txid, CDiskTxPos& pos) const; + + /// Start initializes the sync state and registers the instance as a + /// ValidationInterface so that it stays in sync with blockchain updates. + void Start(); + + /// Stops the instance from staying in sync with blockchain updates. + void Stop(); +}; + +#endif // BITCOIN_INDEX_TXINDEX_H |