/workdir/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 <cstddef> |
14 | | #include <optional> |
15 | | #include <string> |
16 | | #include <string_view> |
17 | | #include <tuple> |
18 | | #include <type_traits> |
19 | | #include <variant> |
20 | | |
21 | | /** transaction_identifier represents the two canonical transaction identifier |
22 | | * types (txid, wtxid).*/ |
23 | | template <bool has_witness> |
24 | | class transaction_identifier |
25 | | { |
26 | | uint256 m_wrapped; |
27 | | |
28 | | // Note: Use FromUint256 externally instead. |
29 | 8.77k | transaction_identifier(const uint256& wrapped) : m_wrapped{wrapped} {}transaction_identifier<false>::transaction_identifier(uint256 const&) Line | Count | Source | 29 | 8.47k | transaction_identifier(const uint256& wrapped) : m_wrapped{wrapped} {} |
transaction_identifier<true>::transaction_identifier(uint256 const&) Line | Count | Source | 29 | 304 | transaction_identifier(const uint256& wrapped) : m_wrapped{wrapped} {} |
|
30 | | |
31 | 5.71k | constexpr int Compare(const transaction_identifier<has_witness>& other) const { return m_wrapped.Compare(other.m_wrapped); }transaction_identifier<false>::Compare(transaction_identifier<false> const&) const Line | Count | Source | 31 | 5.71k | constexpr int Compare(const transaction_identifier<has_witness>& other) const { return m_wrapped.Compare(other.m_wrapped); } |
Unexecuted instantiation: transaction_identifier<true>::Compare(transaction_identifier<true> const&) const |
32 | | template <typename Other> |
33 | | constexpr int Compare(const Other& other) const |
34 | | { |
35 | | static_assert(ALWAYS_FALSE<Other>, "Forbidden comparison type"); |
36 | | return 0; |
37 | | } |
38 | | |
39 | | public: |
40 | 7.27k | transaction_identifier() : m_wrapped{} {}transaction_identifier<false>::transaction_identifier() Line | Count | Source | 40 | 7.27k | transaction_identifier() : m_wrapped{} {} |
Unexecuted instantiation: transaction_identifier<true>::transaction_identifier() |
41 | | consteval explicit transaction_identifier(std::string_view hex_str) : m_wrapped{uint256{hex_str}} {} |
42 | | |
43 | | template <typename Other> |
44 | 5.71k | bool operator==(const Other& other) const { return Compare(other) == 0; }bool transaction_identifier<false>::operator==<transaction_identifier<false> >(transaction_identifier<false> const&) const Line | Count | Source | 44 | 5.71k | bool operator==(const Other& other) const { return Compare(other) == 0; } |
Unexecuted instantiation: bool transaction_identifier<true>::operator==<transaction_identifier<true> >(transaction_identifier<true> const&) const |
45 | | template <typename Other> |
46 | 0 | std::strong_ordering operator<=>(const Other& other) const { return Compare(other) <=> 0; }Unexecuted instantiation: std::strong_ordering transaction_identifier<false>::operator<=><transaction_identifier<false> >(transaction_identifier<false> const&) const Unexecuted instantiation: std::strong_ordering transaction_identifier<true>::operator<=><transaction_identifier<true> >(transaction_identifier<true> const&) const |
47 | | |
48 | 269 | const uint256& ToUint256() const LIFETIMEBOUND { return m_wrapped; }transaction_identifier<false>::ToUint256() const Line | Count | Source | 48 | 269 | const uint256& ToUint256() const LIFETIMEBOUND { return m_wrapped; } |
Unexecuted instantiation: transaction_identifier<true>::ToUint256() const |
49 | 8.77k | static transaction_identifier FromUint256(const uint256& id) { return {id}; }transaction_identifier<false>::FromUint256(uint256 const&) Line | Count | Source | 49 | 8.47k | static transaction_identifier FromUint256(const uint256& id) { return {id}; } |
transaction_identifier<true>::FromUint256(uint256 const&) Line | Count | Source | 49 | 304 | static transaction_identifier FromUint256(const uint256& id) { return {id}; } |
|
50 | | |
51 | | /** Wrapped `uint256` methods. */ |
52 | 0 | constexpr bool IsNull() const { return m_wrapped.IsNull(); } |
53 | 0 | constexpr void SetNull() { m_wrapped.SetNull(); } |
54 | | static std::optional<transaction_identifier> FromHex(std::string_view hex) |
55 | 0 | { |
56 | 0 | auto u{uint256::FromHex(hex)}; |
57 | 0 | if (!u) return std::nullopt; Branch (57:13): [True: 0, False: 0]
Branch (57:13): [True: 0, False: 0]
|
58 | 0 | return FromUint256(*u); |
59 | 0 | } Unexecuted instantiation: transaction_identifier<false>::FromHex(std::basic_string_view<char, std::char_traits<char> >) Unexecuted instantiation: transaction_identifier<true>::FromHex(std::basic_string_view<char, std::char_traits<char> >) |
60 | 0 | std::string GetHex() const { return m_wrapped.GetHex(); }Unexecuted instantiation: transaction_identifier<false>::GetHex[abi:cxx11]() const Unexecuted instantiation: transaction_identifier<true>::GetHex[abi:cxx11]() const |
61 | 0 | std::string ToString() const { return m_wrapped.ToString(); }Unexecuted instantiation: transaction_identifier<false>::ToString[abi:cxx11]() const Unexecuted instantiation: transaction_identifier<true>::ToString[abi:cxx11]() const |
62 | | static constexpr auto size() { return decltype(m_wrapped)::size(); } |
63 | | constexpr const std::byte* data() const { return reinterpret_cast<const std::byte*>(m_wrapped.data()); } |
64 | 0 | constexpr const std::byte* begin() const { return reinterpret_cast<const std::byte*>(m_wrapped.begin()); }Unexecuted instantiation: transaction_identifier<true>::begin() const Unexecuted instantiation: transaction_identifier<false>::begin() const |
65 | 0 | constexpr const std::byte* end() const { return reinterpret_cast<const std::byte*>(m_wrapped.end()); } |
66 | 19.8k | template <typename Stream> void Serialize(Stream& s) const { m_wrapped.Serialize(s); }void transaction_identifier<false>::Serialize<ParamsStream<SizeComputer&, TransactionSerParams> >(ParamsStream<SizeComputer&, TransactionSerParams>&) const Line | Count | Source | 66 | 3.28k | template <typename Stream> void Serialize(Stream& s) const { m_wrapped.Serialize(s); } |
Unexecuted instantiation: void transaction_identifier<false>::Serialize<ParamsStream<DataStream&, TransactionSerParams> >(ParamsStream<DataStream&, TransactionSerParams>&) const Unexecuted instantiation: void transaction_identifier<false>::Serialize<DataStream>(DataStream&) const void transaction_identifier<false>::Serialize<ParamsStream<VectorWriter&, TransactionSerParams> >(ParamsStream<VectorWriter&, TransactionSerParams>&) const Line | Count | Source | 66 | 3.28k | template <typename Stream> void Serialize(Stream& s) const { m_wrapped.Serialize(s); } |
Unexecuted instantiation: void transaction_identifier<false>::Serialize<ParamsStream<ParamsStream<VectorWriter&, TransactionSerParams>&, TransactionSerParams> >(ParamsStream<ParamsStream<VectorWriter&, TransactionSerParams>&, TransactionSerParams>&) const Unexecuted instantiation: void transaction_identifier<false>::Serialize<AutoFile>(AutoFile&) const void transaction_identifier<false>::Serialize<HashWriter>(HashWriter&) const Line | Count | Source | 66 | 4.92k | template <typename Stream> void Serialize(Stream& s) const { m_wrapped.Serialize(s); } |
Unexecuted instantiation: void transaction_identifier<false>::Serialize<ParamsStream<BufferedWriter<AutoFile>&, TransactionSerParams> >(ParamsStream<BufferedWriter<AutoFile>&, TransactionSerParams>&) const Unexecuted instantiation: void transaction_identifier<false>::Serialize<ParamsStream<AutoFile&, TransactionSerParams> >(ParamsStream<AutoFile&, TransactionSerParams>&) const Unexecuted instantiation: void transaction_identifier<true>::Serialize<HashWriter>(HashWriter&) const void transaction_identifier<false>::Serialize<ParamsStream<HashWriter&, TransactionSerParams> >(ParamsStream<HashWriter&, TransactionSerParams>&) const Line | Count | Source | 66 | 8.39k | template <typename Stream> void Serialize(Stream& s) const { m_wrapped.Serialize(s); } |
|
67 | 7.05k | template <typename Stream> void Unserialize(Stream& s) { m_wrapped.Unserialize(s); }void transaction_identifier<false>::Unserialize<ParamsStream<SpanReader&, TransactionSerParams> >(ParamsStream<SpanReader&, TransactionSerParams>&) Line | Count | Source | 67 | 7.05k | template <typename Stream> void Unserialize(Stream& s) { m_wrapped.Unserialize(s); } |
Unexecuted instantiation: void transaction_identifier<false>::Unserialize<SpanReader>(SpanReader&) Unexecuted instantiation: void transaction_identifier<false>::Unserialize<DataStream>(DataStream&) Unexecuted instantiation: void transaction_identifier<false>::Unserialize<ParamsStream<DataStream&, TransactionSerParams> >(ParamsStream<DataStream&, TransactionSerParams>&) Unexecuted instantiation: void transaction_identifier<false>::Unserialize<ParamsStream<AutoFile&, TransactionSerParams> >(ParamsStream<AutoFile&, TransactionSerParams>&) Unexecuted instantiation: void transaction_identifier<false>::Unserialize<AutoFile>(AutoFile&) Unexecuted instantiation: void transaction_identifier<false>::Unserialize<ParamsStream<BufferedFile&, TransactionSerParams> >(ParamsStream<BufferedFile&, TransactionSerParams>&) |
68 | | }; |
69 | | |
70 | | /** Txid commits to all transaction fields except the witness. */ |
71 | | using Txid = transaction_identifier<false>; |
72 | | /** Wtxid commits to all transaction fields including the witness. */ |
73 | | using Wtxid = transaction_identifier<true>; |
74 | | |
75 | | template <typename T> |
76 | | concept TxidOrWtxid = std::is_same_v<T, Txid> || std::is_same_v<T, Wtxid>; |
77 | | |
78 | | class GenTxid : public std::variant<Txid, Wtxid> |
79 | | { |
80 | | public: |
81 | | using variant::variant; |
82 | | |
83 | 0 | bool IsWtxid() const { return std::holds_alternative<Wtxid>(*this); } |
84 | | |
85 | | const uint256& ToUint256() const LIFETIMEBOUND |
86 | 0 | { |
87 | 0 | return std::visit([](const auto& id) -> const uint256& { return id.ToUint256(); }, *this);Unexecuted instantiation: uint256 const& GenTxid::ToUint256() const::{lambda(auto:1 const&)#1}::operator()<transaction_identifier<false> >(transaction_identifier<false> const&) constUnexecuted instantiation: uint256 const& GenTxid::ToUint256() const::{lambda(auto:1 const&)#1}::operator()<transaction_identifier<true> >(transaction_identifier<true> const&) const |
88 | 0 | } |
89 | | |
90 | | friend auto operator<=>(const GenTxid& a, const GenTxid& b) |
91 | 0 | { |
92 | | // Use a reference for read-only access to the hash, avoiding a copy that might not be optimized away. |
93 | 0 | return std::tuple<bool, const uint256&>(a.IsWtxid(), a.ToUint256()) <=> std::tuple<bool, const uint256&>(b.IsWtxid(), b.ToUint256()); |
94 | 0 | } |
95 | | }; |
96 | | |
97 | | #endif // BITCOIN_PRIMITIVES_TRANSACTION_IDENTIFIER_H |