/root/bitcoin/src/primitives/transaction_identifier.h
Line | Count | Source |
1 | | // Copyright (c) 2023-present The Bitcoin Core developers |
2 | | // Distributed under the MIT software license, see the accompanying |
3 | | // file COPYING or https://opensource.org/license/mit. |
4 | | |
5 | | #ifndef BITCOIN_PRIMITIVES_TRANSACTION_IDENTIFIER_H |
6 | | #define BITCOIN_PRIMITIVES_TRANSACTION_IDENTIFIER_H |
7 | | |
8 | | #include <attributes.h> |
9 | | #include <uint256.h> |
10 | | #include <util/types.h> |
11 | | |
12 | | #include <compare> |
13 | | #include <concepts> |
14 | | #include <tuple> |
15 | | #include <variant> |
16 | | |
17 | | /** transaction_identifier represents the two canonical transaction identifier |
18 | | * types (txid, wtxid).*/ |
19 | | template <bool has_witness> |
20 | | class transaction_identifier |
21 | | { |
22 | | uint256 m_wrapped; |
23 | | |
24 | | // Note: Use FromUint256 externally instead. |
25 | 251k | transaction_identifier(const uint256& wrapped) : m_wrapped{wrapped} {} _ZN22transaction_identifierILb0EEC2ERK7uint256 Line | Count | Source | 25 | 125k | transaction_identifier(const uint256& wrapped) : m_wrapped{wrapped} {} |
_ZN22transaction_identifierILb1EEC2ERK7uint256 Line | Count | Source | 25 | 125k | transaction_identifier(const uint256& wrapped) : m_wrapped{wrapped} {} |
|
26 | | |
27 | 1.75G | constexpr int Compare(const transaction_identifier<has_witness>& other) const { return m_wrapped.Compare(other.m_wrapped); } _ZNK22transaction_identifierILb0EE7CompareERKS0_ Line | Count | Source | 27 | 1.75G | constexpr int Compare(const transaction_identifier<has_witness>& other) const { return m_wrapped.Compare(other.m_wrapped); } |
_ZNK22transaction_identifierILb1EE7CompareERKS0_ Line | Count | Source | 27 | 9.07M | constexpr int Compare(const transaction_identifier<has_witness>& other) const { return m_wrapped.Compare(other.m_wrapped); } |
|
28 | | template <typename Other> |
29 | | constexpr int Compare(const Other& other) const |
30 | | { |
31 | | static_assert(ALWAYS_FALSE<Other>, "Forbidden comparison type"); |
32 | | return 0; |
33 | | } |
34 | | |
35 | | public: |
36 | 1.02M | transaction_identifier() : m_wrapped{} {} _ZN22transaction_identifierILb0EEC2Ev Line | Count | Source | 36 | 1.02M | transaction_identifier() : m_wrapped{} {} |
Unexecuted instantiation: _ZN22transaction_identifierILb1EEC2Ev |
37 | | |
38 | | template <typename Other> |
39 | 20.3M | bool operator==(const Other& other) const { return Compare(other) == 0; } _ZNK22transaction_identifierILb0EEeqIS0_EEbRKT_ Line | Count | Source | 39 | 11.3M | bool operator==(const Other& other) const { return Compare(other) == 0; } |
_ZNK22transaction_identifierILb1EEeqIS0_EEbRKT_ Line | Count | Source | 39 | 9.07M | bool operator==(const Other& other) const { return Compare(other) == 0; } |
|
40 | | template <typename Other> |
41 | 0 | bool operator!=(const Other& other) const { return Compare(other) != 0; } Unexecuted instantiation: _ZNK22transaction_identifierILb0EEneIS0_EEbRKT_ Unexecuted instantiation: _ZNK22transaction_identifierILb1EEneIS0_EEbRKT_ |
42 | | template <typename Other> |
43 | 1.73G | bool operator<(const Other& other) const { return Compare(other) < 0; } _ZNK22transaction_identifierILb0EEltIS0_EEbRKT_ Line | Count | Source | 43 | 1.73G | bool operator<(const Other& other) const { return Compare(other) < 0; } |
Unexecuted instantiation: _ZNK22transaction_identifierILb1EEltIS0_EEbRKT_ |
44 | | |
45 | 27.5M | const uint256& ToUint256() const LIFETIMEBOUND { return m_wrapped; } _ZNK22transaction_identifierILb0EE9ToUint256Ev Line | Count | Source | 45 | 14.6M | const uint256& ToUint256() const LIFETIMEBOUND { return m_wrapped; } |
_ZNK22transaction_identifierILb1EE9ToUint256Ev Line | Count | Source | 45 | 12.9M | const uint256& ToUint256() const LIFETIMEBOUND { return m_wrapped; } |
|
46 | 251k | static transaction_identifier FromUint256(const uint256& id) { return {id}; } _ZN22transaction_identifierILb0EE11FromUint256ERK7uint256 Line | Count | Source | 46 | 125k | static transaction_identifier FromUint256(const uint256& id) { return {id}; } |
_ZN22transaction_identifierILb1EE11FromUint256ERK7uint256 Line | Count | Source | 46 | 125k | static transaction_identifier FromUint256(const uint256& id) { return {id}; } |
|
47 | | |
48 | | /** Wrapped `uint256` methods. */ |
49 | 0 | constexpr bool IsNull() const { return m_wrapped.IsNull(); } |
50 | 0 | constexpr void SetNull() { m_wrapped.SetNull(); } |
51 | | static std::optional<transaction_identifier> FromHex(std::string_view hex) |
52 | 0 | { |
53 | 0 | auto u{uint256::FromHex(hex)}; |
54 | 0 | if (!u) return std::nullopt; |
55 | 0 | return FromUint256(*u); |
56 | 0 | } Unexecuted instantiation: _ZN22transaction_identifierILb0EE7FromHexESt17basic_string_viewIcSt11char_traitsIcEE Unexecuted instantiation: _ZN22transaction_identifierILb1EE7FromHexESt17basic_string_viewIcSt11char_traitsIcEE |
57 | 0 | std::string GetHex() const { return m_wrapped.GetHex(); } Unexecuted instantiation: _ZNK22transaction_identifierILb0EE6GetHexB5cxx11Ev Unexecuted instantiation: _ZNK22transaction_identifierILb1EE6GetHexB5cxx11Ev |
58 | 0 | std::string ToString() const { return m_wrapped.ToString(); } Unexecuted instantiation: _ZNK22transaction_identifierILb0EE8ToStringB5cxx11Ev Unexecuted instantiation: _ZNK22transaction_identifierILb1EE8ToStringB5cxx11Ev |
59 | | static constexpr auto size() { return decltype(m_wrapped)::size(); } |
60 | | constexpr const std::byte* data() const { return reinterpret_cast<const std::byte*>(m_wrapped.data()); } |
61 | 0 | constexpr const std::byte* begin() const { return reinterpret_cast<const std::byte*>(m_wrapped.begin()); } Unexecuted instantiation: _ZNK22transaction_identifierILb1EE5beginEv Unexecuted instantiation: _ZNK22transaction_identifierILb0EE5beginEv |
62 | 0 | constexpr const std::byte* end() const { return reinterpret_cast<const std::byte*>(m_wrapped.end()); } |
63 | 4.86M | template <typename Stream> void Serialize(Stream& s) const { m_wrapped.Serialize(s); } _ZNK22transaction_identifierILb0EE9SerializeI12ParamsStreamIR12SizeComputer20TransactionSerParamsEEEvRT_ Line | Count | Source | 63 | 3.88M | template <typename Stream> void Serialize(Stream& s) const { m_wrapped.Serialize(s); } |
Unexecuted instantiation: _ZNK22transaction_identifierILb0EE9SerializeI12ParamsStreamIR10DataStream20TransactionSerParamsEEEvRT_ Unexecuted instantiation: _ZNK22transaction_identifierILb0EE9SerializeI10DataStreamEEvRT_ Unexecuted instantiation: _ZNK22transaction_identifierILb0EE9SerializeI12ParamsStreamIR12VectorWriter20TransactionSerParamsEEEvRT_ Unexecuted instantiation: _ZNK22transaction_identifierILb0EE9SerializeI12ParamsStreamIRS2_IR12VectorWriter20TransactionSerParamsES5_EEEvRT_ Unexecuted instantiation: _ZNK22transaction_identifierILb0EE9SerializeI8AutoFileEEvRT_ Unexecuted instantiation: _ZNK22transaction_identifierILb0EE9SerializeI10HashWriterEEvRT_ Unexecuted instantiation: _ZNK22transaction_identifierILb0EE9SerializeI12ParamsStreamIR14BufferedWriterI8AutoFileE20TransactionSerParamsEEEvRT_ Unexecuted instantiation: _ZNK22transaction_identifierILb0EE9SerializeI12ParamsStreamIR8AutoFile20TransactionSerParamsEEEvRT_ Unexecuted instantiation: _ZNK22transaction_identifierILb1EE9SerializeI10HashWriterEEvRT_ _ZNK22transaction_identifierILb0EE9SerializeI12ParamsStreamIR10HashWriter20TransactionSerParamsEEEvRT_ Line | Count | Source | 63 | 972k | template <typename Stream> void Serialize(Stream& s) const { m_wrapped.Serialize(s); } |
|
64 | 50.4k | template <typename Stream> void Unserialize(Stream& s) { m_wrapped.Unserialize(s); } Unexecuted instantiation: _ZN22transaction_identifierILb0EE11UnserializeI12ParamsStreamIR10DataStream20TransactionSerParamsEEEvRT_ _ZN22transaction_identifierILb0EE11UnserializeI10DataStreamEEvRT_ Line | Count | Source | 64 | 50.4k | template <typename Stream> void Unserialize(Stream& s) { m_wrapped.Unserialize(s); } |
Unexecuted instantiation: _ZN22transaction_identifierILb0EE11UnserializeI12ParamsStreamIR10SpanReader20TransactionSerParamsEEEvRT_ Unexecuted instantiation: _ZN22transaction_identifierILb0EE11UnserializeI12ParamsStreamIR8AutoFile20TransactionSerParamsEEEvRT_ Unexecuted instantiation: _ZN22transaction_identifierILb0EE11UnserializeI8AutoFileEEvRT_ Unexecuted instantiation: _ZN22transaction_identifierILb0EE11UnserializeI12ParamsStreamIR12BufferedFile20TransactionSerParamsEEEvRT_ |
65 | | }; |
66 | | |
67 | | /** Txid commits to all transaction fields except the witness. */ |
68 | | using Txid = transaction_identifier<false>; |
69 | | /** Wtxid commits to all transaction fields including the witness. */ |
70 | | using Wtxid = transaction_identifier<true>; |
71 | | |
72 | | template <typename T> |
73 | | concept TxidOrWtxid = std::is_same_v<T, Txid> || std::is_same_v<T, Wtxid>; |
74 | | |
75 | | class GenTxid : public std::variant<Txid, Wtxid> |
76 | | { |
77 | | public: |
78 | | using variant::variant; |
79 | | |
80 | 0 | bool IsWtxid() const { return std::holds_alternative<Wtxid>(*this); } |
81 | | |
82 | | const uint256& ToUint256() const LIFETIMEBOUND |
83 | 0 | { |
84 | 0 | return std::visit([](const auto& id) -> const uint256& { return id.ToUint256(); }, *this); Unexecuted instantiation: _ZZNK7GenTxid9ToUint256EvENKUlRKT_E_clI22transaction_identifierILb0EEEERK7uint256S2_ Unexecuted instantiation: _ZZNK7GenTxid9ToUint256EvENKUlRKT_E_clI22transaction_identifierILb1EEEERK7uint256S2_ |
85 | 0 | } |
86 | | |
87 | | friend auto operator<=>(const GenTxid& a, const GenTxid& b) |
88 | 0 | { |
89 | | // Use a reference for read-only access to the hash, avoiding a copy that might not be optimized away. |
90 | 0 | return std::tuple<bool, const uint256&>(a.IsWtxid(), a.ToUint256()) <=> std::tuple<bool, const uint256&>(b.IsWtxid(), b.ToUint256()); |
91 | 0 | } |
92 | | }; |
93 | | |
94 | | #endif // BITCOIN_PRIMITIVES_TRANSACTION_IDENTIFIER_H |