Branch data Line data Source code
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 : :
11 : : #include <compare>
12 : : #include <cstddef>
13 : : #include <optional>
14 : : #include <string>
15 : : #include <string_view>
16 : : #include <tuple>
17 : : #include <type_traits>
18 : : #include <variant>
19 : :
20 : : /** transaction_identifier represents the two canonical transaction identifier
21 : : * types (txid, wtxid).*/
22 : : template <bool has_witness>
23 : : class transaction_identifier
24 : : {
25 : : uint256 m_wrapped;
26 : :
27 : : // Note: Use FromUint256 externally instead.
28 [ + - ]: 40728228 : transaction_identifier(const uint256& wrapped) : m_wrapped{wrapped} {}
29 : :
30 : : public:
31 [ - + ][ + + ]: 71507279 : transaction_identifier() : m_wrapped{} {}
[ - - + + ]
[ # # # # ]
[ + - + - ]
[ + + + -
+ - ]
32 : : consteval explicit transaction_identifier(std::string_view hex_str) : m_wrapped{uint256{hex_str}} {}
33 : :
34 [ + + ]: 556425358 : constexpr bool operator==(const transaction_identifier&) const = default;
[ + + + + ]
[ + + - + ]
[ + + + +
+ + ][ + +
- - + - +
+ ]
[ + + + +
+ + + + +
+ + + +
+ ]
[ - - - +
- - - - -
- - - - -
- - ]
[ # # # #
# # # # #
# # # # #
# # # # ]
[ + - + +
+ + + + +
+ + + + +
+ + - + +
+ + + + +
- - ]
35 [ + + ]: 1932604082 : constexpr auto operator<=>(const transaction_identifier&) const = default;
36 : :
37 [ + - ]: 835130234 : const uint256& ToUint256() const LIFETIMEBOUND { return m_wrapped; }
[ + - + - ]
[ + - + -
+ - + - ]
[ - - - -
- - + - -
- + - ]
[ + - + -
+ - + - +
- + - + -
- - - - -
- - - + -
+ - + - +
- + - +
- ]
38 [ # # ][ + - ]: 20076790 : static transaction_identifier FromUint256(const uint256& id) { return {id}; }
[ + - + - ]
[ + - + -
+ - ]
39 : :
40 : : /** Wrapped `uint256` methods. */
41 [ + + ]: 75260068 : constexpr bool IsNull() const { return m_wrapped.IsNull(); }
42 : 495125 : constexpr void SetNull() { m_wrapped.SetNull(); }
43 : 52 : static std::optional<transaction_identifier> FromHex(std::string_view hex)
44 : : {
45 [ - + ]: 52 : auto u{uint256::FromHex(hex)};
46 [ - + ]: 52 : if (!u) return std::nullopt;
47 : 52 : return FromUint256(*u);
48 : : }
49 [ + - ]: 160976 : std::string GetHex() const { return m_wrapped.GetHex(); }
[ # # # # ]
[ # # # #
# # ][ # #
# # # # #
# ][ # # #
# # # # #
# # ]
[ # # # #
# # # # #
# # # ]
50 [ + - ]: 5297878 : std::string ToString() const { return m_wrapped.ToString(); }
[ + - + - ]
[ + - + -
+ - ][ # #
# # # # #
# ]
[ # # # #
# # # # #
# # # #
# ]
[ + - + -
+ - + - +
- + - + -
+ - - - -
- - - - -
- - ]
[ # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# # # # #
# ]
[ - - + -
+ - + - +
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- - - - -
- - - -
- ]
[ + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - - -
- - + - +
- + - + -
+ - + - +
- + - + -
+ - - - -
- - - - -
- - - - +
- + - + -
+ - ]
51 : : static constexpr auto size() { return decltype(m_wrapped)::size(); }
52 : : constexpr const std::byte* data() const { return reinterpret_cast<const std::byte*>(m_wrapped.data()); }
53 : 1220127 : constexpr const std::byte* begin() const { return reinterpret_cast<const std::byte*>(m_wrapped.begin()); }
54 : 4007 : constexpr const std::byte* end() const { return reinterpret_cast<const std::byte*>(m_wrapped.end()); }
55 : 6958773081 : template <typename Stream> void Serialize(Stream& s) const { m_wrapped.Serialize(s); }
56 : 17026961 : template <typename Stream> void Unserialize(Stream& s) { m_wrapped.Unserialize(s); }
57 : : };
58 : :
59 : : /** Txid commits to all transaction fields except the witness. */
60 : : using Txid = transaction_identifier<false>;
61 : : /** Wtxid commits to all transaction fields including the witness. */
62 : : using Wtxid = transaction_identifier<true>;
63 : :
64 : : template <typename T>
65 : : concept TxidOrWtxid = std::is_same_v<T, Txid> || std::is_same_v<T, Wtxid>;
66 : :
67 : : class GenTxid : public std::variant<Txid, Wtxid>
68 : : {
69 : : public:
70 [ + - + - ]: 1811514 : using variant::variant;
[ + - + - ]
71 : :
72 [ + + ][ - - : 249989 : bool IsWtxid() const { return std::holds_alternative<Wtxid>(*this); }
- - + + ]
73 : :
74 [ + + - ][ + : 903302 : const uint256& ToUint256() const LIFETIMEBOUND
+ - + +
- ]
75 : : {
76 [ + + - + : 78860547 : return std::visit([](const auto& id) -> const uint256& { return id.ToUint256(); }, *this);
+ ]
[ + + - -
- - - - -
- - - - +
+ - + - -
- - - - +
+ - ]
[ + + - +
+ - + + -
+ + - + +
- + + - +
+ - + + -
+ + - + +
- + + - +
+ - + + -
+ + - + +
- + + + +
- + + - +
+ + + - +
+ + + - +
+ - + + +
+ - + + -
+ + + + -
+ + - + +
+ + - + +
- + + + +
- + + - +
+ + + - +
- + + - +
+ - ]
77 : : }
78 : :
79 : 65069 : friend auto operator<=>(const GenTxid& a, const GenTxid& b)
80 : : {
81 : : // Use a reference for read-only access to the hash, avoiding a copy that might not be optimized away.
82 [ + + - + : 195207 : return std::tuple<bool, const uint256&>(a.IsWtxid(), a.ToUint256()) <=> std::tuple<bool, const uint256&>(b.IsWtxid(), b.ToUint256());
+ - ]
83 : : }
84 : : };
85 : :
86 : : #endif // BITCOIN_PRIMITIVES_TRANSACTION_IDENTIFIER_H
|