Branch data Line data Source code
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_TXINDEX_H
6 : : #define BITCOIN_INDEX_TXINDEX_H
7 : :
8 : : #include <index/base.h>
9 : : #include <primitives/transaction.h>
10 : : #include <uint256.h>
11 : :
12 : : #include <cstddef>
13 : : #include <memory>
14 : : #include <optional>
15 : :
16 : : namespace interfaces {
17 : : class Chain;
18 : : }
19 : : namespace txindex_tests {
20 : : class TxIndexTest;
21 : : }
22 : :
23 : : inline constexpr bool DEFAULT_TXINDEX{false};
24 : :
25 : : /// A found transaction and the hash of the block that contains it.
26 [ # # ]: 0 : struct TxIndexResult {
27 : : uint256 block_hash;
28 : : CTransactionRef tx;
29 : : };
30 : :
31 : : /**
32 : : * TxIndex is used to look up transactions included in the blockchain by hash.
33 : : * The index is written to a LevelDB database and records the block sequence
34 : : * number and serialized block offset of each transaction by transaction hash.
35 : : */
36 : : class TxIndex final : public BaseIndex
37 : : {
38 : : protected:
39 : : class DB;
40 : :
41 : : private:
42 : : friend class txindex_tests::TxIndexTest;
43 : : const std::unique_ptr<DB> m_db;
44 : :
45 : 0 : bool AllowPrune() const override { return false; }
46 : :
47 : : /// Look up a transaction among the legacy (full-txid) entries.
48 : : std::optional<TxIndexResult> FindLegacyTx(const Txid& tx_hash) const;
49 : :
50 : : protected:
51 : : bool CustomAppend(const interfaces::BlockInfo& block) override;
52 : :
53 : : BaseIndex::DB& GetDB() const override;
54 : :
55 : : public:
56 : : /// Constructs the index, which becomes available to be queried.
57 : : explicit TxIndex(std::unique_ptr<interfaces::Chain> chain, size_t n_cache_size, bool f_memory = false, bool f_wipe = false);
58 : :
59 : : // Destructor is declared because this class contains a unique_ptr to an incomplete type.
60 : : virtual ~TxIndex() override;
61 : :
62 : : /// Look up a transaction by hash.
63 : : ///
64 : : /// @param[in] tx_hash The hash of the transaction to be returned.
65 : : /// @return the transaction and containing block hash, or nullopt if it is not found
66 : : std::optional<TxIndexResult> FindTx(const Txid& tx_hash) const;
67 : : };
68 : :
69 : : /// The global transaction index, used in GetTransaction. May be null.
70 : : extern std::unique_ptr<TxIndex> g_txindex;
71 : :
72 : : #endif // BITCOIN_INDEX_TXINDEX_H
|