Bitcoin Core 31.0.0
P2P Digital Currency
Loading...
Searching...
No Matches
transaction.h
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#ifndef BITCOIN_PRIMITIVES_TRANSACTION_H
7#define BITCOIN_PRIMITIVES_TRANSACTION_H
8
9#include <attributes.h>
10#include <consensus/amount.h>
11#include <primitives/transaction_identifier.h> // IWYU pragma: export
12#include <script/script.h>
13#include <serialize.h>
14
15#include <compare>
16#include <cstddef>
17#include <cstdint>
18#include <ios>
19#include <limits>
20#include <memory>
21#include <numeric>
22#include <string>
23#include <tuple>
24#include <utility>
25#include <vector>
26
29{
30public:
32 uint32_t n;
33
34 static constexpr uint32_t NULL_INDEX = std::numeric_limits<uint32_t>::max();
35
37 COutPoint(const Txid& hashIn, uint32_t nIn): hash(hashIn), n(nIn) { }
38
39 SERIALIZE_METHODS(COutPoint, obj) { READWRITE(obj.hash, obj.n); }
40
41 void SetNull() { hash.SetNull(); n = NULL_INDEX; }
42 bool IsNull() const { return (hash.IsNull() && n == NULL_INDEX); }
43
44 friend bool operator<(const COutPoint& a, const COutPoint& b)
45 {
46 return std::tie(a.hash, a.n) < std::tie(b.hash, b.n);
47 }
48
49 friend bool operator==(const COutPoint& a, const COutPoint& b)
50 {
51 return (a.hash == b.hash && a.n == b.n);
52 }
53
54 std::string ToString() const;
55};
56
61class CTxIn
62{
63public:
66 uint32_t nSequence;
68
76 static const uint32_t SEQUENCE_FINAL = 0xffffffff;
82 static const uint32_t MAX_SEQUENCE_NONFINAL{SEQUENCE_FINAL - 1};
83
84 // Below flags apply in the context of BIP 68. BIP 68 requires the tx
85 // version to be set to 2, or higher.
93 static const uint32_t SEQUENCE_LOCKTIME_DISABLE_FLAG = (1U << 31);
94
99 static const uint32_t SEQUENCE_LOCKTIME_TYPE_FLAG = (1 << 22);
100
104 static const uint32_t SEQUENCE_LOCKTIME_MASK = 0x0000ffff;
105
114 static const int SEQUENCE_LOCKTIME_GRANULARITY = 9;
115
117 {
119 }
120
121 explicit CTxIn(COutPoint prevoutIn, CScript scriptSigIn=CScript(), uint32_t nSequenceIn=SEQUENCE_FINAL);
122 CTxIn(Txid hashPrevTx, uint32_t nOut, CScript scriptSigIn=CScript(), uint32_t nSequenceIn=SEQUENCE_FINAL);
123
124 SERIALIZE_METHODS(CTxIn, obj) { READWRITE(obj.prevout, obj.scriptSig, obj.nSequence); }
125
126 friend bool operator==(const CTxIn& a, const CTxIn& b)
127 {
128 return (a.prevout == b.prevout &&
129 a.scriptSig == b.scriptSig &&
130 a.nSequence == b.nSequence);
131 }
132
133 std::string ToString() const;
134};
135
140{
141public:
144
146 {
147 SetNull();
148 }
149
150 CTxOut(const CAmount& nValueIn, CScript scriptPubKeyIn);
151
152 SERIALIZE_METHODS(CTxOut, obj) { READWRITE(obj.nValue, obj.scriptPubKey); }
153
154 void SetNull()
155 {
156 nValue = -1;
157 scriptPubKey.clear();
158 }
159
160 bool IsNull() const
161 {
162 return (nValue == -1);
163 }
164
165 friend bool operator==(const CTxOut& a, const CTxOut& b)
166 {
167 return (a.nValue == b.nValue &&
169 }
170
171 std::string ToString() const;
172};
173
175
180static constexpr TransactionSerParams TX_WITH_WITNESS{.allow_witness = true};
181static constexpr TransactionSerParams TX_NO_WITNESS{.allow_witness = false};
182
200template<typename Stream, typename TxType>
201void UnserializeTransaction(TxType& tx, Stream& s, const TransactionSerParams& params)
202{
203 const bool fAllowWitness = params.allow_witness;
204
205 s >> tx.version;
206 unsigned char flags = 0;
207 tx.vin.clear();
208 tx.vout.clear();
209 /* Try to read the vin. In case the dummy is there, this will be read as an empty vector. */
210 s >> tx.vin;
211 if (tx.vin.size() == 0 && fAllowWitness) {
212 /* We read a dummy or an empty vin. */
213 s >> flags;
214 if (flags != 0) {
215 s >> tx.vin;
216 s >> tx.vout;
217 }
218 } else {
219 /* We read a non-empty vin. Assume a normal vout follows. */
220 s >> tx.vout;
221 }
222 if ((flags & 1) && fAllowWitness) {
223 /* The witness flag is present, and we support witnesses. */
224 flags ^= 1;
225 for (size_t i = 0; i < tx.vin.size(); i++) {
226 s >> tx.vin[i].scriptWitness.stack;
227 }
228 if (!tx.HasWitness()) {
229 /* It's illegal to encode witnesses when all witness stacks are empty. */
230 throw std::ios_base::failure("Superfluous witness record");
231 }
232 }
233 if (flags) {
234 /* Unknown flag in the serialization */
235 throw std::ios_base::failure("Unknown transaction optional data");
236 }
237 s >> tx.nLockTime;
238}
239
240template<typename Stream, typename TxType>
241void SerializeTransaction(const TxType& tx, Stream& s, const TransactionSerParams& params)
242{
243 const bool fAllowWitness = params.allow_witness;
244
245 s << tx.version;
246 unsigned char flags = 0;
247 // Consistency check
248 if (fAllowWitness) {
249 /* Check whether witnesses need to be serialized. */
250 if (tx.HasWitness()) {
251 flags |= 1;
252 }
253 }
254 if (flags) {
255 /* Use extended format in case witnesses are to be serialized. */
256 std::vector<CTxIn> vinDummy;
257 s << vinDummy;
258 s << flags;
259 }
260 s << tx.vin;
261 s << tx.vout;
262 if (flags & 1) {
263 for (size_t i = 0; i < tx.vin.size(); i++) {
264 s << tx.vin[i].scriptWitness.stack;
265 }
266 }
267 s << tx.nLockTime;
268}
269
270template<typename TxType>
271inline CAmount CalculateOutputValue(const TxType& tx)
272{
273 return std::accumulate(tx.vout.cbegin(), tx.vout.cend(), CAmount{0}, [](CAmount sum, const auto& txout) { return sum + txout.nValue; });
274}
275
276
281{
282public:
283 // Default transaction version.
284 static const uint32_t CURRENT_VERSION{2};
285
286 // The local variables are made const to prevent unintended modification
287 // without updating the cached hash value. However, CTransaction is not
288 // actually immutable; deserialization and assignment are implemented,
289 // and bypass the constness. This is safe, as they update the entire
290 // structure, including the hash.
291 const std::vector<CTxIn> vin;
292 const std::vector<CTxOut> vout;
293 const uint32_t version;
294 const uint32_t nLockTime;
295
296private:
298 const bool m_has_witness;
299 const Txid hash;
301
302 Txid ComputeHash() const;
304
305 bool ComputeHasWitness() const;
306
307public:
309 explicit CTransaction(const CMutableTransaction& tx);
310 explicit CTransaction(CMutableTransaction&& tx);
311
312 template <typename Stream>
313 inline void Serialize(Stream& s) const {
314 SerializeTransaction(*this, s, s.template GetParams<TransactionSerParams>());
315 }
316
319 template <typename Stream>
321 template <typename Stream>
323
324 bool IsNull() const {
325 return vin.empty() && vout.empty();
326 }
327
328 const Txid& GetHash() const LIFETIMEBOUND { return hash; }
330
331 // Return sum of txouts.
332 CAmount GetValueOut() const;
333
339 unsigned int ComputeTotalSize() const;
340
341 bool IsCoinBase() const
342 {
343 return (vin.size() == 1 && vin[0].prevout.IsNull());
344 }
345
346 friend bool operator==(const CTransaction& a, const CTransaction& b)
347 {
348 return a.GetWitnessHash() == b.GetWitnessHash();
349 }
350
351 std::string ToString() const;
352
353 bool HasWitness() const { return m_has_witness; }
354};
355
358{
359 std::vector<CTxIn> vin;
360 std::vector<CTxOut> vout;
361 uint32_t version;
362 uint32_t nLockTime;
363
364 explicit CMutableTransaction();
365 explicit CMutableTransaction(const CTransaction& tx);
366
367 template <typename Stream>
368 inline void Serialize(Stream& s) const {
369 SerializeTransaction(*this, s, s.template GetParams<TransactionSerParams>());
370 }
371
372 template <typename Stream>
373 inline void Unserialize(Stream& s) {
374 UnserializeTransaction(*this, s, s.template GetParams<TransactionSerParams>());
375 }
376
377 template <typename Stream>
379 UnserializeTransaction(*this, s, params);
380 }
381
382 template <typename Stream>
386
390 Txid GetHash() const;
391
392 bool HasWitness() const
393 {
394 for (size_t i = 0; i < vin.size(); i++) {
395 if (!vin[i].scriptWitness.IsNull()) {
396 return true;
397 }
398 }
399 return false;
400 }
401};
402
403typedef std::shared_ptr<const CTransaction> CTransactionRef;
404template <typename Tx> static inline CTransactionRef MakeTransactionRef(Tx&& txIn) { return std::make_shared<const CTransaction>(std::forward<Tx>(txIn)); }
405
406#endif // BITCOIN_PRIMITIVES_TRANSACTION_H
int64_t CAmount
Amount in satoshis (Can be negative).
Definition amount.h:12
#define LIFETIMEBOUND
Definition attributes.h:16
int flags
An outpoint - a combination of a transaction hash and an index n into its vout.
Definition transaction.h:29
uint32_t n
Definition transaction.h:32
friend bool operator==(const COutPoint &a, const COutPoint &b)
Definition transaction.h:49
SERIALIZE_METHODS(COutPoint, obj)
Definition transaction.h:39
COutPoint(const Txid &hashIn, uint32_t nIn)
Definition transaction.h:37
friend bool operator<(const COutPoint &a, const COutPoint &b)
Definition transaction.h:44
void SetNull()
Definition transaction.h:41
std::string ToString() const
bool IsNull() const
Definition transaction.h:42
static constexpr uint32_t NULL_INDEX
Definition transaction.h:34
Serialized script, used inside transaction inputs and outputs.
Definition script.h:405
The basic transaction that is broadcasted on the network and contained in blocks.
Txid ComputeHash() const
friend bool operator==(const CTransaction &a, const CTransaction &b)
CTransaction(deserialize_type, const TransactionSerParams &params, Stream &s)
This deserializing constructor is provided instead of an Unserialize method.
bool HasWitness() const
bool IsNull() const
const uint32_t nLockTime
CTransaction(deserialize_type, Stream &s)
unsigned int ComputeTotalSize() const
Calculate the total transaction size in bytes, including witness data.
bool ComputeHasWitness() const
CTransaction(const CMutableTransaction &tx)
Convert a CMutableTransaction into a CTransaction.
const Wtxid m_witness_hash
void Serialize(Stream &s) const
const std::vector< CTxOut > vout
std::string ToString() const
const bool m_has_witness
Memory only.
const Wtxid & GetWitnessHash() const LIFETIMEBOUND
Wtxid ComputeWitnessHash() const
bool IsCoinBase() const
CAmount GetValueOut() const
const Txid & GetHash() const LIFETIMEBOUND
static const uint32_t CURRENT_VERSION
const uint32_t version
const std::vector< CTxIn > vin
const Txid hash
static const uint32_t MAX_SEQUENCE_NONFINAL
This is the maximum sequence number that enables both nLockTime and OP_CHECKLOCKTIMEVERIFY (BIP 65).
Definition transaction.h:82
friend bool operator==(const CTxIn &a, const CTxIn &b)
static const uint32_t SEQUENCE_LOCKTIME_DISABLE_FLAG
If this flag is set, CTxIn::nSequence is NOT interpreted as a relative lock-time.
Definition transaction.h:93
uint32_t nSequence
Definition transaction.h:66
static const uint32_t SEQUENCE_LOCKTIME_MASK
If CTxIn::nSequence encodes a relative lock-time, this mask is applied to extract that lock-time from...
static const uint32_t SEQUENCE_FINAL
Setting nSequence to this value for every input in a transaction disables nLockTime/IsFinalTx().
Definition transaction.h:76
std::string ToString() const
CScript scriptSig
Definition transaction.h:65
static const uint32_t SEQUENCE_LOCKTIME_TYPE_FLAG
If CTxIn::nSequence encodes a relative lock-time and this flag is set, the relative lock-time has uni...
Definition transaction.h:99
CScriptWitness scriptWitness
Only serialized through CTransaction.
Definition transaction.h:67
COutPoint prevout
Definition transaction.h:64
static const int SEQUENCE_LOCKTIME_GRANULARITY
In order to use the same number of bits to encode roughly the same wall-clock duration,...
SERIALIZE_METHODS(CTxIn, obj)
CScript scriptPubKey
SERIALIZE_METHODS(CTxOut, obj)
friend bool operator==(const CTxOut &a, const CTxOut &b)
void SetNull()
CAmount nValue
bool IsNull() const
std::string ToString() const
volatile double sum
Definition examples.cpp:10
static constexpr TransactionSerParams TX_NO_WITNESS
void UnserializeTransaction(TxType &tx, Stream &s, const TransactionSerParams &params)
Basic transaction serialization format:
static constexpr TransactionSerParams TX_WITH_WITNESS
void SerializeTransaction(const TxType &tx, Stream &s, const TransactionSerParams &params)
CAmount CalculateOutputValue(const TxType &tx)
static CTransactionRef MakeTransactionRef(Tx &&txIn)
std::shared_ptr< const CTransaction > CTransactionRef
constexpr deserialize_type deserialize
Definition serialize.h:49
#define SER_PARAMS_OPFUNC
Helper macro for SerParams structs.
Definition serialize.h:1212
#define READWRITE(...)
Definition serialize.h:145
A mutable version of CTransaction.
CMutableTransaction(deserialize_type, const TransactionSerParams &params, Stream &s)
bool HasWitness() const
void Unserialize(Stream &s)
void Serialize(Stream &s) const
CMutableTransaction(deserialize_type, Stream &s)
std::vector< CTxOut > vout
Txid GetHash() const
Compute the hash of this CMutableTransaction.
std::vector< CTxIn > vin
bool IsNull() const
Definition script.h:585
const bool allow_witness
Dummy data type to identify deserializing constructors.
Definition serialize.h:48
transaction_identifier< true > Wtxid
Wtxid commits to all transaction fields including the witness.
transaction_identifier< false > Txid
Txid commits to all transaction fields except the witness.