Bitcoin Core
32.1.0
P2P Digital Currency
Toggle main menu visibility
Loading...
Searching...
No Matches
src
primitives
transaction_identifier.h
Go to the documentation of this file.
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
22
template
<
bool
has_witness>
23
class
transaction_identifier
24
{
25
uint256
m_wrapped
;
26
27
// Note: Use FromUint256 externally instead.
28
transaction_identifier
(
const
uint256
& wrapped) :
m_wrapped
{wrapped} {}
29
30
public
:
31
transaction_identifier
() :
m_wrapped
{} {}
32
consteval
explicit
transaction_identifier
(std::string_view hex_str) :
m_wrapped
{
uint256
{hex_str}} {}
33
34
constexpr
bool
operator==
(
const
transaction_identifier
&)
const
=
default
;
35
constexpr
auto
operator<=>
(
const
transaction_identifier
&)
const
=
default
;
36
37
const
uint256
&
ToUint256
() const
LIFETIMEBOUND
{
return
m_wrapped
; }
38
static
transaction_identifier
FromUint256
(
const
uint256
&
id
) {
return
{
id
}; }
39
41
constexpr
bool
IsNull
()
const
{
return
m_wrapped
.
IsNull
(); }
42
constexpr
void
SetNull
() {
m_wrapped
.
SetNull
(); }
43
static
std::optional<transaction_identifier>
FromHex
(std::string_view hex)
44
{
45
auto
u{
uint256::FromHex
(hex)};
46
if
(!u)
return
std::nullopt;
47
return
FromUint256
(*u);
48
}
49
std::string
GetHex
()
const
{
return
m_wrapped
.
GetHex
(); }
50
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
constexpr
const
std::byte*
begin
()
const
{
return
reinterpret_cast<
const
std::byte*
>
(
m_wrapped
.
begin
()); }
54
constexpr
const
std::byte*
end
()
const
{
return
reinterpret_cast<
const
std::byte*
>
(
m_wrapped
.
end
()); }
55
template
<
typename
Stream>
void
Serialize
(Stream& s)
const
{
m_wrapped
.
Serialize
(s); }
56
template
<
typename
Stream>
void
Unserialize
(Stream& s) {
m_wrapped
.
Unserialize
(s); }
57
};
58
60
using
Txid
=
transaction_identifier<false>
;
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
using
variant::variant;
71
72
bool
IsWtxid
()
const
{
return
std::holds_alternative<Wtxid>(*
this
); }
73
74
const
uint256
&
ToUint256
() const
LIFETIMEBOUND
75
{
76
return
std::visit([](
const
auto
&
id
) ->
const
uint256
& {
return
id
.ToUint256(); }, *
this
);
77
}
78
79
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
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
attributes.h
LIFETIMEBOUND
#define LIFETIMEBOUND
Definition
attributes.h:16
GenTxid
Definition
transaction_identifier.h:68
GenTxid::IsWtxid
bool IsWtxid() const
Definition
transaction_identifier.h:72
GenTxid::ToUint256
const uint256 & ToUint256() const LIFETIMEBOUND
Definition
transaction_identifier.h:74
GenTxid::operator<=>
friend auto operator<=>(const GenTxid &a, const GenTxid &b)
Definition
transaction_identifier.h:79
base_blob::IsNull
constexpr bool IsNull() const
Definition
uint256.h:50
base_blob::GetHex
std::string GetHex() const
Definition
uint256.cpp:11
base_blob::end
constexpr unsigned char * end()
Definition
uint256.h:102
base_blob::Unserialize
void Unserialize(Stream &s)
Definition
uint256.h:118
base_blob::begin
constexpr unsigned char * begin()
Definition
uint256.h:101
base_blob::ToString
std::string ToString() const
Definition
uint256.cpp:21
base_blob::Serialize
void Serialize(Stream &s) const
Definition
uint256.h:112
base_blob::SetNull
constexpr void SetNull()
Definition
uint256.h:57
base_blob::data
constexpr const unsigned char * data() const
Definition
uint256.h:98
transaction_identifier
transaction_identifier represents the two canonical transaction identifier types (txid,...
Definition
transaction_identifier.h:24
transaction_identifier::ToString
std::string ToString() const
Definition
transaction_identifier.h:50
transaction_identifier::operator<=>
constexpr auto operator<=>(const transaction_identifier &) const =default
transaction_identifier::transaction_identifier
transaction_identifier()
Definition
transaction_identifier.h:31
transaction_identifier::size
static constexpr auto size()
Definition
transaction_identifier.h:51
transaction_identifier::Unserialize
void Unserialize(Stream &s)
Definition
transaction_identifier.h:56
transaction_identifier::Serialize
void Serialize(Stream &s) const
Definition
transaction_identifier.h:55
transaction_identifier::begin
constexpr const std::byte * begin() const
Definition
transaction_identifier.h:53
transaction_identifier::ToUint256
const uint256 & ToUint256() const LIFETIMEBOUND
Definition
transaction_identifier.h:37
transaction_identifier::IsNull
constexpr bool IsNull() const
Wrapped uint256 methods.
Definition
transaction_identifier.h:41
transaction_identifier::transaction_identifier
transaction_identifier(const uint256 &wrapped)
Definition
transaction_identifier.h:28
transaction_identifier::operator==
constexpr bool operator==(const transaction_identifier &) const =default
transaction_identifier::GetHex
std::string GetHex() const
Definition
transaction_identifier.h:49
transaction_identifier::data
constexpr const std::byte * data() const
Definition
transaction_identifier.h:52
transaction_identifier::SetNull
constexpr void SetNull()
Definition
transaction_identifier.h:42
transaction_identifier::FromUint256
static transaction_identifier FromUint256(const uint256 &id)
Definition
transaction_identifier.h:38
transaction_identifier::end
constexpr const std::byte * end() const
Definition
transaction_identifier.h:54
transaction_identifier::transaction_identifier
consteval transaction_identifier(std::string_view hex_str)
Definition
transaction_identifier.h:32
transaction_identifier< false >::m_wrapped
uint256 m_wrapped
Definition
transaction_identifier.h:25
transaction_identifier::FromHex
static std::optional< transaction_identifier > FromHex(std::string_view hex)
Definition
transaction_identifier.h:43
uint256
256-bit opaque blob.
Definition
uint256.h:196
uint256::FromHex
static std::optional< uint256 > FromHex(std::string_view str)
Definition
uint256.h:198
TxidOrWtxid
Definition
transaction_identifier.h:65
Wtxid
transaction_identifier< true > Wtxid
Wtxid commits to all transaction fields including the witness.
Definition
transaction_identifier.h:62
Txid
transaction_identifier< false > Txid
Txid commits to all transaction fields except the witness.
Definition
transaction_identifier.h:60
uint256.h
Generated on
for Bitcoin Core by
1.18.0