Bitcoin Core
31.1.0
P2P Digital Currency
Toggle main menu visibility
Loading...
Searching...
No Matches
src
primitives
transaction.cpp
Go to the documentation of this file.
1
// Copyright (c) 2009-2010 Satoshi Nakamoto
2
// Copyright (c) 2009-present The Bitcoin Core developers
3
// Distributed under the MIT software license, see the accompanying
4
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
5
6
#include <
primitives/transaction.h
>
7
8
#include <
consensus/amount.h
>
9
#include <
crypto/hex_base.h
>
10
#include <hash.h>
11
#include <
primitives/transaction_identifier.h
>
12
#include <
script/script.h
>
13
#include <
serialize.h
>
14
#include <
tinyformat.h
>
15
16
#include <algorithm>
17
#include <cassert>
18
#include <span>
19
#include <stdexcept>
20
21
std::string
COutPoint::ToString
()
const
22
{
23
return
strprintf
(
"COutPoint(%s, %u)"
,
hash
.ToString().substr(0,10),
n
);
24
}
25
26
CTxIn::CTxIn
(
COutPoint
prevoutIn,
CScript
scriptSigIn, uint32_t nSequenceIn)
27
{
28
prevout
= prevoutIn;
29
scriptSig
= scriptSigIn;
30
nSequence
= nSequenceIn;
31
}
32
33
CTxIn::CTxIn
(
Txid
hashPrevTx, uint32_t nOut,
CScript
scriptSigIn, uint32_t nSequenceIn)
34
{
35
prevout
=
COutPoint
(hashPrevTx, nOut);
36
scriptSig
= scriptSigIn;
37
nSequence
= nSequenceIn;
38
}
39
40
std::string
CTxIn::ToString
()
const
41
{
42
std::string str;
43
str +=
"CTxIn("
;
44
str +=
prevout
.ToString();
45
if
(
prevout
.IsNull())
46
str +=
strprintf
(
", coinbase %s"
,
HexStr
(
scriptSig
));
47
else
48
str +=
strprintf
(
", scriptSig=%s"
,
HexStr
(
scriptSig
).substr(0, 24));
49
if
(
nSequence
!=
SEQUENCE_FINAL
)
50
str +=
strprintf
(
", nSequence=%u"
,
nSequence
);
51
str +=
")"
;
52
return
str;
53
}
54
55
CTxOut::CTxOut
(
const
CAmount
& nValueIn,
CScript
scriptPubKeyIn)
56
{
57
nValue
= nValueIn;
58
scriptPubKey
= scriptPubKeyIn;
59
}
60
61
std::string
CTxOut::ToString
()
const
62
{
63
return
strprintf
(
"CTxOut(nValue=%d.%08d, scriptPubKey=%s)"
,
nValue
/
COIN
,
nValue
%
COIN
,
HexStr
(
scriptPubKey
).substr(0, 30));
64
}
65
66
CMutableTransaction::CMutableTransaction
() :
version
{
CTransaction
::CURRENT_VERSION},
nLockTime
{0} {}
67
CMutableTransaction::CMutableTransaction
(
const
CTransaction
& tx) :
vin
(tx.
vin
),
vout
(tx.
vout
),
version
{tx.
version
},
nLockTime
{tx.
nLockTime
} {}
68
69
Txid
CMutableTransaction::GetHash
()
const
70
{
71
return
Txid::FromUint256
((
HashWriter
{} <<
TX_NO_WITNESS
(*
this
)).GetHash());
72
}
73
74
bool
CTransaction::ComputeHasWitness
()
const
75
{
76
return
std::any_of(
vin
.begin(),
vin
.end(), [](
const
auto
& input) {
77
return !input.scriptWitness.IsNull();
78
});
79
}
80
81
Txid
CTransaction::ComputeHash
()
const
82
{
83
return
Txid::FromUint256
((
HashWriter
{} <<
TX_NO_WITNESS
(*
this
)).GetHash());
84
}
85
86
Wtxid
CTransaction::ComputeWitnessHash
()
const
87
{
88
if
(!
HasWitness
()) {
89
return
Wtxid::FromUint256
(
hash
.ToUint256());
90
}
91
92
return
Wtxid::FromUint256
((
HashWriter
{} <<
TX_WITH_WITNESS
(*
this
)).GetHash());
93
}
94
95
CTransaction::CTransaction
(
const
CMutableTransaction
& tx) :
vin
(tx.
vin
),
vout
(tx.
vout
),
version
{tx.
version
},
nLockTime
{tx.
nLockTime
},
m_has_witness
{
ComputeHasWitness
()},
hash
{
ComputeHash
()},
m_witness_hash
{
ComputeWitnessHash
()} {}
96
CTransaction::CTransaction
(
CMutableTransaction
&& tx) :
vin
(
std
::move(tx.
vin
)),
vout
(
std
::move(tx.
vout
)),
version
{tx.
version
},
nLockTime
{tx.
nLockTime
},
m_has_witness
{
ComputeHasWitness
()},
hash
{
ComputeHash
()},
m_witness_hash
{
ComputeWitnessHash
()} {}
97
98
CAmount
CTransaction::GetValueOut
()
const
99
{
100
CAmount
nValueOut = 0;
101
for
(
const
auto
& tx_out :
vout
) {
102
if
(!
MoneyRange
(tx_out.nValue) || !
MoneyRange
(nValueOut + tx_out.nValue))
103
throw
std::runtime_error(std::string(__func__) +
": value out of range"
);
104
nValueOut += tx_out.nValue;
105
}
106
assert
(
MoneyRange
(nValueOut));
107
return
nValueOut;
108
}
109
110
unsigned
int
CTransaction::ComputeTotalSize
()
const
111
{
112
return ::GetSerializeSize(
TX_WITH_WITNESS
(*
this
));
113
}
114
115
std::string
CTransaction::ToString
()
const
116
{
117
std::string str;
118
str +=
strprintf
(
"CTransaction(hash=%s, ver=%u, vin.size=%u, vout.size=%u, nLockTime=%u)\n"
,
119
GetHash
().
ToString
().substr(0,10),
120
version
,
121
vin
.size(),
122
vout
.size(),
123
nLockTime
);
124
for
(
const
auto
& tx_in :
vin
)
125
str +=
" "
+ tx_in.ToString() +
"\n"
;
126
for
(
const
auto
& tx_in :
vin
)
127
str +=
" "
+ tx_in.scriptWitness.ToString() +
"\n"
;
128
for
(
const
auto
& tx_out :
vout
)
129
str +=
" "
+ tx_out.ToString() +
"\n"
;
130
return
str;
131
}
amount.h
MoneyRange
bool MoneyRange(const CAmount &nValue)
Definition
amount.h:27
CAmount
int64_t CAmount
Amount in satoshis (Can be negative).
Definition
amount.h:12
COIN
static constexpr CAmount COIN
The amount of satoshis in one BTC.
Definition
amount.h:15
COutPoint
An outpoint - a combination of a transaction hash and an index n into its vout.
Definition
transaction.h:29
COutPoint::n
uint32_t n
Definition
transaction.h:32
COutPoint::hash
Txid hash
Definition
transaction.h:31
COutPoint::ToString
std::string ToString() const
Definition
transaction.cpp:21
CScript
Serialized script, used inside transaction inputs and outputs.
Definition
script.h:405
CTransaction
The basic transaction that is broadcasted on the network and contained in blocks.
Definition
transaction.h:281
CTransaction::ComputeHash
Txid ComputeHash() const
Definition
transaction.cpp:81
CTransaction::HasWitness
bool HasWitness() const
Definition
transaction.h:353
CTransaction::nLockTime
const uint32_t nLockTime
Definition
transaction.h:294
CTransaction::ComputeTotalSize
unsigned int ComputeTotalSize() const
Calculate the total transaction size in bytes, including witness data.
Definition
transaction.cpp:110
CTransaction::ComputeHasWitness
bool ComputeHasWitness() const
Definition
transaction.cpp:74
CTransaction::CTransaction
CTransaction(const CMutableTransaction &tx)
Convert a CMutableTransaction into a CTransaction.
Definition
transaction.cpp:95
CTransaction::m_witness_hash
const Wtxid m_witness_hash
Definition
transaction.h:300
CTransaction::vout
const std::vector< CTxOut > vout
Definition
transaction.h:292
CTransaction::ToString
std::string ToString() const
Definition
transaction.cpp:115
CTransaction::m_has_witness
const bool m_has_witness
Memory only.
Definition
transaction.h:298
CTransaction::ComputeWitnessHash
Wtxid ComputeWitnessHash() const
Definition
transaction.cpp:86
CTransaction::GetValueOut
CAmount GetValueOut() const
Definition
transaction.cpp:98
CTransaction::GetHash
const Txid & GetHash() const LIFETIMEBOUND
Definition
transaction.h:328
CTransaction::version
const uint32_t version
Definition
transaction.h:293
CTransaction::vin
const std::vector< CTxIn > vin
Definition
transaction.h:291
CTransaction::hash
const Txid hash
Definition
transaction.h:299
CTxIn::nSequence
uint32_t nSequence
Definition
transaction.h:66
CTxIn::SEQUENCE_FINAL
static const uint32_t SEQUENCE_FINAL
Setting nSequence to this value for every input in a transaction disables nLockTime/IsFinalTx().
Definition
transaction.h:76
CTxIn::ToString
std::string ToString() const
Definition
transaction.cpp:40
CTxIn::scriptSig
CScript scriptSig
Definition
transaction.h:65
CTxIn::CTxIn
CTxIn()
Definition
transaction.h:116
CTxIn::prevout
COutPoint prevout
Definition
transaction.h:64
CTxOut::scriptPubKey
CScript scriptPubKey
Definition
transaction.h:143
CTxOut::CTxOut
CTxOut()
Definition
transaction.h:145
CTxOut::nValue
CAmount nValue
Definition
transaction.h:142
CTxOut::ToString
std::string ToString() const
Definition
transaction.cpp:61
HashWriter
A writer stream (for serialization) that computes a 256-bit hash.
Definition
hash.h:101
transaction_identifier< false >::FromUint256
static transaction_identifier FromUint256(const uint256 &id)
Definition
transaction_identifier.h:49
HexStr
std::string HexStr(const std::span< const uint8_t > s)
Convert a span of bytes to a lower-case hexadecimal string.
Definition
hex_base.cpp:30
hex_base.h
std
Definition
common.h:29
transaction.h
TX_NO_WITNESS
static constexpr TransactionSerParams TX_NO_WITNESS
Definition
transaction.h:181
TX_WITH_WITNESS
static constexpr TransactionSerParams TX_WITH_WITNESS
Definition
transaction.h:180
script.h
serialize.h
CMutableTransaction
A mutable version of CTransaction.
Definition
transaction.h:358
CMutableTransaction::CMutableTransaction
CMutableTransaction()
Definition
transaction.cpp:66
CMutableTransaction::vout
std::vector< CTxOut > vout
Definition
transaction.h:360
CMutableTransaction::GetHash
Txid GetHash() const
Compute the hash of this CMutableTransaction.
Definition
transaction.cpp:69
CMutableTransaction::version
uint32_t version
Definition
transaction.h:361
CMutableTransaction::vin
std::vector< CTxIn > vin
Definition
transaction.h:359
CMutableTransaction::nLockTime
uint32_t nLockTime
Definition
transaction.h:362
tinyformat.h
strprintf
#define strprintf
Format arguments and return the string or write to given std::ostream (see tinyformat::format doc for...
Definition
tinyformat.h:1172
transaction_identifier.h
Wtxid
transaction_identifier< true > Wtxid
Wtxid commits to all transaction fields including the witness.
Definition
transaction_identifier.h:73
Txid
transaction_identifier< false > Txid
Txid commits to all transaction fields except the witness.
Definition
transaction_identifier.h:71
assert
assert(!tx.IsCoinBase())
Generated on
for Bitcoin Core by
1.17.0