/Users/eugenesiegel/btc/bitcoin/src/primitives/transaction.h
| Line | Count | Source (jump to first uncovered line) | 
| 1 |  | // Copyright (c) 2009-2010 Satoshi Nakamoto | 
| 2 |  | // Copyright (c) 2009-2022 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 |  | #include <uint256.h> | 
| 15 |  |  | 
| 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 |  |  | 
| 27 |  | /** An outpoint - a combination of a transaction hash and an index n into its vout */ | 
| 28 |  | class COutPoint | 
| 29 |  | { | 
| 30 |  | public: | 
| 31 |  |     Txid hash; | 
| 32 |  |     uint32_t n; | 
| 33 |  |  | 
| 34 |  |     static constexpr uint32_t NULL_INDEX = std::numeric_limits<uint32_t>::max(); | 
| 35 |  |  | 
| 36 | 27.0M |     COutPoint(): n(NULL_INDEX) { } | 
| 37 | 39.1M |     COutPoint(const Txid& hashIn, uint32_t nIn): hash(hashIn), n(nIn) { } | 
| 38 |  |  | 
| 39 | 47.8M |     SERIALIZE_METHODS(COutPoint, obj) { READWRITE(obj.hash, obj.n); }| Line | Count | Source |  | 145 | 5.60M | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 |     SERIALIZE_METHODS(COutPoint, obj) { READWRITE(obj.hash, obj.n); }| Line | Count | Source |  | 145 | 4.97M | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 |     SERIALIZE_METHODS(COutPoint, obj) { READWRITE(obj.hash, obj.n); }| Line | Count | Source |  | 145 | 0 | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 |     SERIALIZE_METHODS(COutPoint, obj) { READWRITE(obj.hash, obj.n); }| Line | Count | Source |  | 145 | 5.37M | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 |     SERIALIZE_METHODS(COutPoint, obj) { READWRITE(obj.hash, obj.n); }| Line | Count | Source |  | 145 | 0 | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 |     SERIALIZE_METHODS(COutPoint, obj) { READWRITE(obj.hash, obj.n); }| Line | Count | Source |  | 145 | 0 | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 |     SERIALIZE_METHODS(COutPoint, obj) { READWRITE(obj.hash, obj.n); }| Line | Count | Source |  | 145 | 0 | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 |     SERIALIZE_METHODS(COutPoint, obj) { READWRITE(obj.hash, obj.n); }| Line | Count | Source |  | 145 | 311k | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 |     SERIALIZE_METHODS(COutPoint, obj) { READWRITE(obj.hash, obj.n); }| Line | Count | Source |  | 145 | 0 | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 |     SERIALIZE_METHODS(COutPoint, obj) { READWRITE(obj.hash, obj.n); }| Line | Count | Source |  | 145 | 504k | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 |     SERIALIZE_METHODS(COutPoint, obj) { READWRITE(obj.hash, obj.n); }| Line | Count | Source |  | 145 | 162k | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 |     SERIALIZE_METHODS(COutPoint, obj) { READWRITE(obj.hash, obj.n); }| Line | Count | Source |  | 145 | 0 | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 |     SERIALIZE_METHODS(COutPoint, obj) { READWRITE(obj.hash, obj.n); }| Line | Count | Source |  | 145 | 0 | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 |     SERIALIZE_METHODS(COutPoint, obj) { READWRITE(obj.hash, obj.n); }| Line | Count | Source |  | 145 | 30.8M | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
_ZN9COutPoint16SerializationOpsI12ParamsStreamIR12SizeComputer20TransactionSerParamsEKS_15ActionSerializeEEvRT0_RT_T1_| Line | Count | Source |  | 39 | 5.60M |     SERIALIZE_METHODS(COutPoint, obj) { READWRITE(obj.hash, obj.n); }| Line | Count | Source |  | 145 | 5.60M | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 | 
_ZN9COutPoint16SerializationOpsI12ParamsStreamIR10DataStream20TransactionSerParamsES_17ActionUnserializeEEvRT0_RT_T1_| Line | Count | Source |  | 39 | 4.97M |     SERIALIZE_METHODS(COutPoint, obj) { READWRITE(obj.hash, obj.n); }| Line | Count | Source |  | 145 | 4.97M | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 | 
Unexecuted instantiation: _ZN9COutPoint16SerializationOpsI10DataStreamS_17ActionUnserializeEEvRT0_RT_T1__ZN9COutPoint16SerializationOpsI12ParamsStreamIR12VectorWriter20TransactionSerParamsEKS_15ActionSerializeEEvRT0_RT_T1_| Line | Count | Source |  | 39 | 5.37M |     SERIALIZE_METHODS(COutPoint, obj) { READWRITE(obj.hash, obj.n); }| Line | Count | Source |  | 145 | 5.37M | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 | 
Unexecuted instantiation: _ZN9COutPoint16SerializationOpsI12ParamsStreamIR10DataStream20TransactionSerParamsEKS_15ActionSerializeEEvRT0_RT_T1_Unexecuted instantiation: _ZN9COutPoint16SerializationOpsI10DataStreamKS_15ActionSerializeEEvRT0_RT_T1_Unexecuted instantiation: _ZN9COutPoint16SerializationOpsI12ParamsStreamIRS1_IR12VectorWriter20TransactionSerParamsES4_EKS_15ActionSerializeEEvRT0_RT_T1__ZN9COutPoint16SerializationOpsI12ParamsStreamIR10SpanReader20TransactionSerParamsES_17ActionUnserializeEEvRT0_RT_T1_| Line | Count | Source |  | 39 | 311k |     SERIALIZE_METHODS(COutPoint, obj) { READWRITE(obj.hash, obj.n); }| Line | Count | Source |  | 145 | 311k | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 | 
Unexecuted instantiation: _ZN9COutPoint16SerializationOpsI12ParamsStreamIR8AutoFile20TransactionSerParamsES_17ActionUnserializeEEvRT0_RT_T1__ZN9COutPoint16SerializationOpsI10HashWriterKS_15ActionSerializeEEvRT0_RT_T1_| Line | Count | Source |  | 39 | 504k |     SERIALIZE_METHODS(COutPoint, obj) { READWRITE(obj.hash, obj.n); }| Line | Count | Source |  | 145 | 504k | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 | 
_ZN9COutPoint16SerializationOpsI12ParamsStreamIR14BufferedWriterI8AutoFileE20TransactionSerParamsEKS_15ActionSerializeEEvRT0_RT_T1_| Line | Count | Source |  | 39 | 162k |     SERIALIZE_METHODS(COutPoint, obj) { READWRITE(obj.hash, obj.n); }| Line | Count | Source |  | 145 | 162k | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 | 
Unexecuted instantiation: _ZN9COutPoint16SerializationOpsI12ParamsStreamIR8AutoFile20TransactionSerParamsEKS_15ActionSerializeEEvRT0_RT_T1_Unexecuted instantiation: _ZN9COutPoint16SerializationOpsI12ParamsStreamIR12BufferedFile20TransactionSerParamsES_17ActionUnserializeEEvRT0_RT_T1__ZN9COutPoint16SerializationOpsI12ParamsStreamIR10HashWriter20TransactionSerParamsEKS_15ActionSerializeEEvRT0_RT_T1_| Line | Count | Source |  | 39 | 30.8M |     SERIALIZE_METHODS(COutPoint, obj) { READWRITE(obj.hash, obj.n); }| Line | Count | Source |  | 145 | 30.8M | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 | 
 | 
| 40 |  |  | 
| 41 | 2.00M |     void SetNull() { hash.SetNull(); n = NULL_INDEX; } | 
| 42 | 59.4M |     bool IsNull() const { return (hash.IsNull() && n == NULL_INDEX1.13M); } | 
| 43 |  |  | 
| 44 |  |     friend bool operator<(const COutPoint& a, const COutPoint& b) | 
| 45 | 201M |     { | 
| 46 | 201M |         return std::tie(a.hash, a.n) < std::tie(b.hash, b.n); | 
| 47 | 201M |     } | 
| 48 |  |  | 
| 49 |  |     friend bool operator==(const COutPoint& a, const COutPoint& b) | 
| 50 | 79.0M |     { | 
| 51 | 79.0M |         return (a.hash == b.hash && a.n == b.n); | 
| 52 | 79.0M |     } | 
| 53 |  |  | 
| 54 |  |     friend bool operator!=(const COutPoint& a, const COutPoint& b) | 
| 55 | 0 |     { | 
| 56 | 0 |         return !(a == b); | 
| 57 | 0 |     } | 
| 58 |  |  | 
| 59 |  |     std::string ToString() const; | 
| 60 |  | }; | 
| 61 |  |  | 
| 62 |  | /** An input of a transaction.  It contains the location of the previous | 
| 63 |  |  * transaction's output that it claims and a signature that matches the | 
| 64 |  |  * output's public key. | 
| 65 |  |  */ | 
| 66 |  | class CTxIn | 
| 67 |  | { | 
| 68 |  | public: | 
| 69 |  |     COutPoint prevout; | 
| 70 |  |     CScript scriptSig; | 
| 71 |  |     uint32_t nSequence; | 
| 72 |  |     CScriptWitness scriptWitness; //!< Only serialized through CTransaction | 
| 73 |  |  | 
| 74 |  |     /** | 
| 75 |  |      * Setting nSequence to this value for every input in a transaction | 
| 76 |  |      * disables nLockTime/IsFinalTx(). | 
| 77 |  |      * It fails OP_CHECKLOCKTIMEVERIFY/CheckLockTime() for any input that has | 
| 78 |  |      * it set (BIP 65). | 
| 79 |  |      * It has SEQUENCE_LOCKTIME_DISABLE_FLAG set (BIP 68/112). | 
| 80 |  |      */ | 
| 81 |  |     static const uint32_t SEQUENCE_FINAL = 0xffffffff; | 
| 82 |  |     /** | 
| 83 |  |      * This is the maximum sequence number that enables both nLockTime and | 
| 84 |  |      * OP_CHECKLOCKTIMEVERIFY (BIP 65). | 
| 85 |  |      * It has SEQUENCE_LOCKTIME_DISABLE_FLAG set (BIP 68/112). | 
| 86 |  |      */ | 
| 87 |  |     static const uint32_t MAX_SEQUENCE_NONFINAL{SEQUENCE_FINAL - 1}; | 
| 88 |  |  | 
| 89 |  |     // Below flags apply in the context of BIP 68. BIP 68 requires the tx | 
| 90 |  |     // version to be set to 2, or higher. | 
| 91 |  |     /** | 
| 92 |  |      * If this flag is set, CTxIn::nSequence is NOT interpreted as a | 
| 93 |  |      * relative lock-time. | 
| 94 |  |      * It skips SequenceLocks() for any input that has it set (BIP 68). | 
| 95 |  |      * It fails OP_CHECKSEQUENCEVERIFY/CheckSequence() for any input that has | 
| 96 |  |      * it set (BIP 112). | 
| 97 |  |      */ | 
| 98 |  |     static const uint32_t SEQUENCE_LOCKTIME_DISABLE_FLAG = (1U << 31); | 
| 99 |  |  | 
| 100 |  |     /** | 
| 101 |  |      * If CTxIn::nSequence encodes a relative lock-time and this flag | 
| 102 |  |      * is set, the relative lock-time has units of 512 seconds, | 
| 103 |  |      * otherwise it specifies blocks with a granularity of 1. */ | 
| 104 |  |     static const uint32_t SEQUENCE_LOCKTIME_TYPE_FLAG = (1 << 22); | 
| 105 |  |  | 
| 106 |  |     /** | 
| 107 |  |      * If CTxIn::nSequence encodes a relative lock-time, this mask is | 
| 108 |  |      * applied to extract that lock-time from the sequence field. */ | 
| 109 |  |     static const uint32_t SEQUENCE_LOCKTIME_MASK = 0x0000ffff; | 
| 110 |  |  | 
| 111 |  |     /** | 
| 112 |  |      * In order to use the same number of bits to encode roughly the | 
| 113 |  |      * same wall-clock duration, and because blocks are naturally | 
| 114 |  |      * limited to occur every 600s on average, the minimum granularity | 
| 115 |  |      * for time-based relative lock-time is fixed at 512 seconds. | 
| 116 |  |      * Converting from CTxIn::nSequence to seconds is performed by | 
| 117 |  |      * multiplying by 512 = 2^9, or equivalently shifting up by | 
| 118 |  |      * 9 bits. */ | 
| 119 |  |     static const int SEQUENCE_LOCKTIME_GRANULARITY = 9; | 
| 120 |  |  | 
| 121 |  |     CTxIn() | 
| 122 | 13.5M |     { | 
| 123 | 13.5M |         nSequence = SEQUENCE_FINAL; | 
| 124 | 13.5M |     } | 
| 125 |  |  | 
| 126 |  |     explicit CTxIn(COutPoint prevoutIn, CScript scriptSigIn=CScript(), uint32_t nSequenceIn=SEQUENCE_FINAL); | 
| 127 |  |     CTxIn(Txid hashPrevTx, uint32_t nOut, CScript scriptSigIn=CScript(), uint32_t nSequenceIn=SEQUENCE_FINAL); | 
| 128 |  |  | 
| 129 | 47.3M |     SERIALIZE_METHODS(CTxIn, obj) { READWRITE(obj.prevout, obj.scriptSig, obj.nSequence); }| Line | Count | Source |  | 145 | 5.60M | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 |     SERIALIZE_METHODS(CTxIn, obj) { READWRITE(obj.prevout, obj.scriptSig, obj.nSequence); }| Line | Count | Source |  | 145 | 4.97M | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 |     SERIALIZE_METHODS(CTxIn, obj) { READWRITE(obj.prevout, obj.scriptSig, obj.nSequence); }| Line | Count | Source |  | 145 | 5.37M | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 |     SERIALIZE_METHODS(CTxIn, obj) { READWRITE(obj.prevout, obj.scriptSig, obj.nSequence); }| Line | Count | Source |  | 145 | 0 | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 |     SERIALIZE_METHODS(CTxIn, obj) { READWRITE(obj.prevout, obj.scriptSig, obj.nSequence); }| Line | Count | Source |  | 145 | 0 | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 |     SERIALIZE_METHODS(CTxIn, obj) { READWRITE(obj.prevout, obj.scriptSig, obj.nSequence); }| Line | Count | Source |  | 145 | 0 | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 |     SERIALIZE_METHODS(CTxIn, obj) { READWRITE(obj.prevout, obj.scriptSig, obj.nSequence); }| Line | Count | Source |  | 145 | 0 | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 |     SERIALIZE_METHODS(CTxIn, obj) { READWRITE(obj.prevout, obj.scriptSig, obj.nSequence); }| Line | Count | Source |  | 145 | 311k | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 |     SERIALIZE_METHODS(CTxIn, obj) { READWRITE(obj.prevout, obj.scriptSig, obj.nSequence); }| Line | Count | Source |  | 145 | 0 | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 |     SERIALIZE_METHODS(CTxIn, obj) { READWRITE(obj.prevout, obj.scriptSig, obj.nSequence); }| Line | Count | Source |  | 145 | 162k | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 |     SERIALIZE_METHODS(CTxIn, obj) { READWRITE(obj.prevout, obj.scriptSig, obj.nSequence); }| Line | Count | Source |  | 145 | 0 | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 |     SERIALIZE_METHODS(CTxIn, obj) { READWRITE(obj.prevout, obj.scriptSig, obj.nSequence); }| Line | Count | Source |  | 145 | 0 | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 |     SERIALIZE_METHODS(CTxIn, obj) { READWRITE(obj.prevout, obj.scriptSig, obj.nSequence); }| Line | Count | Source |  | 145 | 30.8M | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
_ZN5CTxIn16SerializationOpsI12ParamsStreamIR12SizeComputer20TransactionSerParamsEKS_15ActionSerializeEEvRT0_RT_T1_| Line | Count | Source |  | 129 | 5.60M |     SERIALIZE_METHODS(CTxIn, obj) { READWRITE(obj.prevout, obj.scriptSig, obj.nSequence); }| Line | Count | Source |  | 145 | 5.60M | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 | 
_ZN5CTxIn16SerializationOpsI12ParamsStreamIR10DataStream20TransactionSerParamsES_17ActionUnserializeEEvRT0_RT_T1_| Line | Count | Source |  | 129 | 4.97M |     SERIALIZE_METHODS(CTxIn, obj) { READWRITE(obj.prevout, obj.scriptSig, obj.nSequence); }| Line | Count | Source |  | 145 | 4.97M | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 | 
_ZN5CTxIn16SerializationOpsI12ParamsStreamIR12VectorWriter20TransactionSerParamsEKS_15ActionSerializeEEvRT0_RT_T1_| Line | Count | Source |  | 129 | 5.37M |     SERIALIZE_METHODS(CTxIn, obj) { READWRITE(obj.prevout, obj.scriptSig, obj.nSequence); }| Line | Count | Source |  | 145 | 5.37M | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 | 
Unexecuted instantiation: _ZN5CTxIn16SerializationOpsI12ParamsStreamIR10DataStream20TransactionSerParamsEKS_15ActionSerializeEEvRT0_RT_T1_Unexecuted instantiation: _ZN5CTxIn16SerializationOpsI10DataStreamS_17ActionUnserializeEEvRT0_RT_T1_Unexecuted instantiation: _ZN5CTxIn16SerializationOpsI10DataStreamKS_15ActionSerializeEEvRT0_RT_T1_Unexecuted instantiation: _ZN5CTxIn16SerializationOpsI12ParamsStreamIRS1_IR12VectorWriter20TransactionSerParamsES4_EKS_15ActionSerializeEEvRT0_RT_T1__ZN5CTxIn16SerializationOpsI12ParamsStreamIR10SpanReader20TransactionSerParamsES_17ActionUnserializeEEvRT0_RT_T1_| Line | Count | Source |  | 129 | 311k |     SERIALIZE_METHODS(CTxIn, obj) { READWRITE(obj.prevout, obj.scriptSig, obj.nSequence); }| Line | Count | Source |  | 145 | 311k | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 | 
Unexecuted instantiation: _ZN5CTxIn16SerializationOpsI12ParamsStreamIR8AutoFile20TransactionSerParamsES_17ActionUnserializeEEvRT0_RT_T1__ZN5CTxIn16SerializationOpsI12ParamsStreamIR14BufferedWriterI8AutoFileE20TransactionSerParamsEKS_15ActionSerializeEEvRT0_RT_T1_| Line | Count | Source |  | 129 | 162k |     SERIALIZE_METHODS(CTxIn, obj) { READWRITE(obj.prevout, obj.scriptSig, obj.nSequence); }| Line | Count | Source |  | 145 | 162k | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 | 
Unexecuted instantiation: _ZN5CTxIn16SerializationOpsI12ParamsStreamIR8AutoFile20TransactionSerParamsEKS_15ActionSerializeEEvRT0_RT_T1_Unexecuted instantiation: _ZN5CTxIn16SerializationOpsI12ParamsStreamIR12BufferedFile20TransactionSerParamsES_17ActionUnserializeEEvRT0_RT_T1__ZN5CTxIn16SerializationOpsI12ParamsStreamIR10HashWriter20TransactionSerParamsEKS_15ActionSerializeEEvRT0_RT_T1_| Line | Count | Source |  | 129 | 30.8M |     SERIALIZE_METHODS(CTxIn, obj) { READWRITE(obj.prevout, obj.scriptSig, obj.nSequence); }| Line | Count | Source |  | 145 | 30.8M | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 | 
 | 
| 130 |  |  | 
| 131 |  |     friend bool operator==(const CTxIn& a, const CTxIn& b) | 
| 132 | 0 |     { | 
| 133 | 0 |         return (a.prevout   == b.prevout && | 
| 134 | 0 |                 a.scriptSig == b.scriptSig && | 
| 135 | 0 |                 a.nSequence == b.nSequence); | 
| 136 | 0 |     } | 
| 137 |  |  | 
| 138 |  |     friend bool operator!=(const CTxIn& a, const CTxIn& b) | 
| 139 | 0 |     { | 
| 140 | 0 |         return !(a == b); | 
| 141 | 0 |     } | 
| 142 |  |  | 
| 143 |  |     std::string ToString() const; | 
| 144 |  | }; | 
| 145 |  |  | 
| 146 |  | /** An output of a transaction.  It contains the public key that the next input | 
| 147 |  |  * must be able to sign with to claim it. | 
| 148 |  |  */ | 
| 149 |  | class CTxOut | 
| 150 |  | { | 
| 151 |  | public: | 
| 152 |  |     CAmount nValue; | 
| 153 |  |     CScript scriptPubKey; | 
| 154 |  |  | 
| 155 |  |     CTxOut() | 
| 156 | 40.0M |     { | 
| 157 | 40.0M |         SetNull(); | 
| 158 | 40.0M |     } | 
| 159 |  |  | 
| 160 |  |     CTxOut(const CAmount& nValueIn, CScript scriptPubKeyIn); | 
| 161 |  |  | 
| 162 | 63.0M |     SERIALIZE_METHODS(CTxOut, obj) { READWRITE(obj.nValue, obj.scriptPubKey); }| Line | Count | Source |  | 145 | 6.36M | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 |     SERIALIZE_METHODS(CTxOut, obj) { READWRITE(obj.nValue, obj.scriptPubKey); }| Line | Count | Source |  | 145 | 6.32M | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 |     SERIALIZE_METHODS(CTxOut, obj) { READWRITE(obj.nValue, obj.scriptPubKey); }| Line | Count | Source |  | 145 | 6.97M | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 |     SERIALIZE_METHODS(CTxOut, obj) { READWRITE(obj.nValue, obj.scriptPubKey); }| Line | Count | Source |  | 145 | 0 | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 |     SERIALIZE_METHODS(CTxOut, obj) { READWRITE(obj.nValue, obj.scriptPubKey); }| Line | Count | Source |  | 145 | 0 | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 |     SERIALIZE_METHODS(CTxOut, obj) { READWRITE(obj.nValue, obj.scriptPubKey); }| Line | Count | Source |  | 145 | 1.82M | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 |     SERIALIZE_METHODS(CTxOut, obj) { READWRITE(obj.nValue, obj.scriptPubKey); }| Line | Count | Source |  | 145 | 0 | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 |     SERIALIZE_METHODS(CTxOut, obj) { READWRITE(obj.nValue, obj.scriptPubKey); }| Line | Count | Source |  | 145 | 0 | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 |     SERIALIZE_METHODS(CTxOut, obj) { READWRITE(obj.nValue, obj.scriptPubKey); }| Line | Count | Source |  | 145 | 619k | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 |     SERIALIZE_METHODS(CTxOut, obj) { READWRITE(obj.nValue, obj.scriptPubKey); }| Line | Count | Source |  | 145 | 0 | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 |     SERIALIZE_METHODS(CTxOut, obj) { READWRITE(obj.nValue, obj.scriptPubKey); }| Line | Count | Source |  | 145 | 0 | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 |     SERIALIZE_METHODS(CTxOut, obj) { READWRITE(obj.nValue, obj.scriptPubKey); }| Line | Count | Source |  | 145 | 504k | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 |     SERIALIZE_METHODS(CTxOut, obj) { READWRITE(obj.nValue, obj.scriptPubKey); }| Line | Count | Source |  | 145 | 190k | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 |     SERIALIZE_METHODS(CTxOut, obj) { READWRITE(obj.nValue, obj.scriptPubKey); }| Line | Count | Source |  | 145 | 0 | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 |     SERIALIZE_METHODS(CTxOut, obj) { READWRITE(obj.nValue, obj.scriptPubKey); }| Line | Count | Source |  | 145 | 0 | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 |     SERIALIZE_METHODS(CTxOut, obj) { READWRITE(obj.nValue, obj.scriptPubKey); }| Line | Count | Source |  | 145 | 40.2M | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
_ZN6CTxOut16SerializationOpsI12ParamsStreamIR12SizeComputer20TransactionSerParamsEKS_15ActionSerializeEEvRT0_RT_T1_| Line | Count | Source |  | 162 | 6.36M |     SERIALIZE_METHODS(CTxOut, obj) { READWRITE(obj.nValue, obj.scriptPubKey); }| Line | Count | Source |  | 145 | 6.36M | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 | 
_ZN6CTxOut16SerializationOpsI12ParamsStreamIR10DataStream20TransactionSerParamsES_17ActionUnserializeEEvRT0_RT_T1_| Line | Count | Source |  | 162 | 6.32M |     SERIALIZE_METHODS(CTxOut, obj) { READWRITE(obj.nValue, obj.scriptPubKey); }| Line | Count | Source |  | 145 | 6.32M | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 | 
_ZN6CTxOut16SerializationOpsI12ParamsStreamIR12VectorWriter20TransactionSerParamsEKS_15ActionSerializeEEvRT0_RT_T1_| Line | Count | Source |  | 162 | 6.97M |     SERIALIZE_METHODS(CTxOut, obj) { READWRITE(obj.nValue, obj.scriptPubKey); }| Line | Count | Source |  | 145 | 6.97M | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 | 
Unexecuted instantiation: _ZN6CTxOut16SerializationOpsI12ParamsStreamIR10DataStream20TransactionSerParamsEKS_15ActionSerializeEEvRT0_RT_T1_Unexecuted instantiation: _ZN6CTxOut16SerializationOpsI10DataStreamS_17ActionUnserializeEEvRT0_RT_T1__ZN6CTxOut16SerializationOpsI12SizeComputerKS_15ActionSerializeEEvRT0_RT_T1_| Line | Count | Source |  | 162 | 1.82M |     SERIALIZE_METHODS(CTxOut, obj) { READWRITE(obj.nValue, obj.scriptPubKey); }| Line | Count | Source |  | 145 | 1.82M | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 | 
Unexecuted instantiation: _ZN6CTxOut16SerializationOpsI10DataStreamKS_15ActionSerializeEEvRT0_RT_T1_Unexecuted instantiation: _ZN6CTxOut16SerializationOpsI12ParamsStreamIRS1_IR12VectorWriter20TransactionSerParamsES4_EKS_15ActionSerializeEEvRT0_RT_T1__ZN6CTxOut16SerializationOpsI12ParamsStreamIR10SpanReader20TransactionSerParamsES_17ActionUnserializeEEvRT0_RT_T1_| Line | Count | Source |  | 162 | 619k |     SERIALIZE_METHODS(CTxOut, obj) { READWRITE(obj.nValue, obj.scriptPubKey); }| Line | Count | Source |  | 145 | 619k | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 | 
Unexecuted instantiation: _ZN6CTxOut16SerializationOpsI10SpanReaderS_17ActionUnserializeEEvRT0_RT_T1_Unexecuted instantiation: _ZN6CTxOut16SerializationOpsI12ParamsStreamIR8AutoFile20TransactionSerParamsES_17ActionUnserializeEEvRT0_RT_T1__ZN6CTxOut16SerializationOpsI10HashWriterKS_15ActionSerializeEEvRT0_RT_T1_| Line | Count | Source |  | 162 | 504k |     SERIALIZE_METHODS(CTxOut, obj) { READWRITE(obj.nValue, obj.scriptPubKey); }| Line | Count | Source |  | 145 | 504k | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 | 
_ZN6CTxOut16SerializationOpsI12ParamsStreamIR14BufferedWriterI8AutoFileE20TransactionSerParamsEKS_15ActionSerializeEEvRT0_RT_T1_| Line | Count | Source |  | 162 | 190k |     SERIALIZE_METHODS(CTxOut, obj) { READWRITE(obj.nValue, obj.scriptPubKey); }| Line | Count | Source |  | 145 | 190k | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 | 
Unexecuted instantiation: _ZN6CTxOut16SerializationOpsI12ParamsStreamIR8AutoFile20TransactionSerParamsEKS_15ActionSerializeEEvRT0_RT_T1_Unexecuted instantiation: _ZN6CTxOut16SerializationOpsI12ParamsStreamIR12BufferedFile20TransactionSerParamsES_17ActionUnserializeEEvRT0_RT_T1__ZN6CTxOut16SerializationOpsI12ParamsStreamIR10HashWriter20TransactionSerParamsEKS_15ActionSerializeEEvRT0_RT_T1_| Line | Count | Source |  | 162 | 40.2M |     SERIALIZE_METHODS(CTxOut, obj) { READWRITE(obj.nValue, obj.scriptPubKey); }| Line | Count | Source |  | 145 | 40.2M | #define READWRITE(...) (ser_action.SerReadWriteMany(s, __VA_ARGS__)) | 
 | 
 | 
| 163 |  |  | 
| 164 |  |     void SetNull() | 
| 165 | 46.5M |     { | 
| 166 | 46.5M |         nValue = -1; | 
| 167 | 46.5M |         scriptPubKey.clear(); | 
| 168 | 46.5M |     } | 
| 169 |  |  | 
| 170 |  |     bool IsNull() const | 
| 171 | 115M |     { | 
| 172 | 115M |         return (nValue == -1); | 
| 173 | 115M |     } | 
| 174 |  |  | 
| 175 |  |     friend bool operator==(const CTxOut& a, const CTxOut& b) | 
| 176 | 801k |     { | 
| 177 | 801k |         return (a.nValue       == b.nValue && | 
| 178 | 801k |                 a.scriptPubKey == b.scriptPubKey); | 
| 179 | 801k |     } | 
| 180 |  |  | 
| 181 |  |     friend bool operator!=(const CTxOut& a, const CTxOut& b) | 
| 182 | 307k |     { | 
| 183 | 307k |         return !(a == b); | 
| 184 | 307k |     } | 
| 185 |  |  | 
| 186 |  |     std::string ToString() const; | 
| 187 |  | }; | 
| 188 |  |  | 
| 189 |  | struct CMutableTransaction; | 
| 190 |  |  | 
| 191 |  | struct TransactionSerParams { | 
| 192 |  |     const bool allow_witness; | 
| 193 |  |     SER_PARAMS_OPFUNC | 
| 194 |  | }; | 
| 195 |  | static constexpr TransactionSerParams TX_WITH_WITNESS{.allow_witness = true}; | 
| 196 |  | static constexpr TransactionSerParams TX_NO_WITNESS{.allow_witness = false}; | 
| 197 |  |  | 
| 198 |  | /** | 
| 199 |  |  * Basic transaction serialization format: | 
| 200 |  |  * - uint32_t version | 
| 201 |  |  * - std::vector<CTxIn> vin | 
| 202 |  |  * - std::vector<CTxOut> vout | 
| 203 |  |  * - uint32_t nLockTime | 
| 204 |  |  * | 
| 205 |  |  * Extended transaction serialization format: | 
| 206 |  |  * - uint32_t version | 
| 207 |  |  * - unsigned char dummy = 0x00 | 
| 208 |  |  * - unsigned char flags (!= 0) | 
| 209 |  |  * - std::vector<CTxIn> vin | 
| 210 |  |  * - std::vector<CTxOut> vout | 
| 211 |  |  * - if (flags & 1): | 
| 212 |  |  *   - CScriptWitness scriptWitness; (deserialized into CTxIn) | 
| 213 |  |  * - uint32_t nLockTime | 
| 214 |  |  */ | 
| 215 |  | template<typename Stream, typename TxType> | 
| 216 |  | void UnserializeTransaction(TxType& tx, Stream& s, const TransactionSerParams& params) | 
| 217 | 5.28M | { | 
| 218 | 5.28M |     const bool fAllowWitness = params.allow_witness; | 
| 219 |  |  | 
| 220 | 5.28M |     s >> tx.version; | 
| 221 | 5.28M |     unsigned char flags = 0; | 
| 222 | 5.28M |     tx.vin.clear(); | 
| 223 | 5.28M |     tx.vout.clear(); | 
| 224 |  |     /* Try to read the vin. In case the dummy is there, this will be read as an empty vector. */ | 
| 225 | 5.28M |     s >> tx.vin; | 
| 226 | 5.28M |     if (tx.vin.size() == 0 && fAllowWitness) { | 
| 227 |  |         /* We read a dummy or an empty vin. */ | 
| 228 | 5.28M |         s >> flags; | 
| 229 | 5.28M |         if (flags != 0) { | 
| 230 | 5.28M |             s >> tx.vin; | 
| 231 | 5.28M |             s >> tx.vout; | 
| 232 | 5.28M |         } | 
| 233 | 5.28M |     } else { | 
| 234 |  |         /* We read a non-empty vin. Assume a normal vout follows. */ | 
| 235 | 0 |         s >> tx.vout; | 
| 236 | 0 |     } | 
| 237 | 5.28M |     if ((flags & 1) && fAllowWitness) { | 
| 238 |  |         /* The witness flag is present, and we support witnesses. */ | 
| 239 | 5.28M |         flags ^= 1; | 
| 240 | 10.5M |         for (size_t i = 0; i < tx.vin.size(); i++5.28M) { | 
| 241 | 5.28M |             s >> tx.vin[i].scriptWitness.stack; | 
| 242 | 5.28M |         } | 
| 243 | 5.28M |         if (!tx.HasWitness()) { | 
| 244 |  |             /* It's illegal to encode witnesses when all witness stacks are empty. */ | 
| 245 | 0 |             throw std::ios_base::failure("Superfluous witness record"); | 
| 246 | 0 |         } | 
| 247 | 5.28M |     } | 
| 248 | 5.28M |     if (flags) { | 
| 249 |  |         /* Unknown flag in the serialization */ | 
| 250 | 0 |         throw std::ios_base::failure("Unknown transaction optional data"); | 
| 251 | 0 |     } | 
| 252 | 5.28M |     s >> tx.nLockTime; | 
| 253 | 5.28M | } _Z22UnserializeTransactionI12ParamsStreamIR10DataStream20TransactionSerParamsE19CMutableTransactionEvRT0_RT_RKS3_| Line | Count | Source |  | 217 | 4.97M | { |  | 218 | 4.97M |     const bool fAllowWitness = params.allow_witness; |  | 219 |  |  |  | 220 | 4.97M |     s >> tx.version; |  | 221 | 4.97M |     unsigned char flags = 0; |  | 222 | 4.97M |     tx.vin.clear(); |  | 223 | 4.97M |     tx.vout.clear(); |  | 224 |  |     /* Try to read the vin. In case the dummy is there, this will be read as an empty vector. */ |  | 225 | 4.97M |     s >> tx.vin; |  | 226 | 4.97M |     if (tx.vin.size() == 0 && fAllowWitness) { |  | 227 |  |         /* We read a dummy or an empty vin. */ |  | 228 | 4.97M |         s >> flags; |  | 229 | 4.97M |         if (flags != 0) { |  | 230 | 4.97M |             s >> tx.vin; |  | 231 | 4.97M |             s >> tx.vout; |  | 232 | 4.97M |         } |  | 233 | 4.97M |     } else { |  | 234 |  |         /* We read a non-empty vin. Assume a normal vout follows. */ |  | 235 | 0 |         s >> tx.vout; |  | 236 | 0 |     } |  | 237 | 4.97M |     if ((flags & 1) && fAllowWitness) { |  | 238 |  |         /* The witness flag is present, and we support witnesses. */ |  | 239 | 4.97M |         flags ^= 1; |  | 240 | 9.94M |         for (size_t i = 0; i < tx.vin.size(); i++4.97M) { |  | 241 | 4.97M |             s >> tx.vin[i].scriptWitness.stack; |  | 242 | 4.97M |         } |  | 243 | 4.97M |         if (!tx.HasWitness()) { |  | 244 |  |             /* It's illegal to encode witnesses when all witness stacks are empty. */ |  | 245 | 0 |             throw std::ios_base::failure("Superfluous witness record"); |  | 246 | 0 |         } |  | 247 | 4.97M |     } |  | 248 | 4.97M |     if (flags) { |  | 249 |  |         /* Unknown flag in the serialization */ |  | 250 | 0 |         throw std::ios_base::failure("Unknown transaction optional data"); |  | 251 | 0 |     } |  | 252 | 4.97M |     s >> tx.nLockTime; |  | 253 | 4.97M | } | 
_Z22UnserializeTransactionI12ParamsStreamIR10SpanReader20TransactionSerParamsE19CMutableTransactionEvRT0_RT_RKS3_| Line | Count | Source |  | 217 | 311k | { |  | 218 | 311k |     const bool fAllowWitness = params.allow_witness; |  | 219 |  |  |  | 220 | 311k |     s >> tx.version; |  | 221 | 311k |     unsigned char flags = 0; |  | 222 | 311k |     tx.vin.clear(); |  | 223 | 311k |     tx.vout.clear(); |  | 224 |  |     /* Try to read the vin. In case the dummy is there, this will be read as an empty vector. */ |  | 225 | 311k |     s >> tx.vin; |  | 226 | 311k |     if (tx.vin.size() == 0 && fAllowWitness) { |  | 227 |  |         /* We read a dummy or an empty vin. */ |  | 228 | 311k |         s >> flags; |  | 229 | 311k |         if (flags != 0) { |  | 230 | 311k |             s >> tx.vin; |  | 231 | 311k |             s >> tx.vout; |  | 232 | 311k |         } |  | 233 | 311k |     } else { |  | 234 |  |         /* We read a non-empty vin. Assume a normal vout follows. */ |  | 235 | 0 |         s >> tx.vout; |  | 236 | 0 |     } |  | 237 | 311k |     if ((flags & 1) && fAllowWitness) { |  | 238 |  |         /* The witness flag is present, and we support witnesses. */ |  | 239 | 311k |         flags ^= 1; |  | 240 | 622k |         for (size_t i = 0; i < tx.vin.size(); i++311k) { |  | 241 | 311k |             s >> tx.vin[i].scriptWitness.stack; |  | 242 | 311k |         } |  | 243 | 311k |         if (!tx.HasWitness()) { |  | 244 |  |             /* It's illegal to encode witnesses when all witness stacks are empty. */ |  | 245 | 0 |             throw std::ios_base::failure("Superfluous witness record"); |  | 246 | 0 |         } |  | 247 | 311k |     } |  | 248 | 311k |     if (flags) { |  | 249 |  |         /* Unknown flag in the serialization */ |  | 250 | 0 |         throw std::ios_base::failure("Unknown transaction optional data"); |  | 251 | 0 |     } |  | 252 | 311k |     s >> tx.nLockTime; |  | 253 | 311k | } | 
Unexecuted instantiation: _Z22UnserializeTransactionI10DataStream19CMutableTransactionEvRT0_RT_RK20TransactionSerParamsUnexecuted instantiation: _Z22UnserializeTransactionI12ParamsStreamIR8AutoFile20TransactionSerParamsE19CMutableTransactionEvRT0_RT_RKS3_Unexecuted instantiation: _Z22UnserializeTransactionI12ParamsStreamIR12BufferedFile20TransactionSerParamsE19CMutableTransactionEvRT0_RT_RKS3_ | 
| 254 |  |  | 
| 255 |  | template<typename Stream, typename TxType> | 
| 256 |  | void SerializeTransaction(const TxType& tx, Stream& s, const TransactionSerParams& params) | 
| 257 | 42.0M | { | 
| 258 | 42.0M |     const bool fAllowWitness = params.allow_witness; | 
| 259 |  |  | 
| 260 | 42.0M |     s << tx.version; | 
| 261 | 42.0M |     unsigned char flags = 0; | 
| 262 |  |     // Consistency check | 
| 263 | 42.0M |     if (fAllowWitness) { | 
| 264 |  |         /* Check whether witnesses need to be serialized. */ | 
| 265 | 20.5M |         if (tx.HasWitness()) { | 
| 266 | 20.5M |             flags |= 1; | 
| 267 | 20.5M |         } | 
| 268 | 20.5M |     } | 
| 269 | 42.0M |     if (flags) { | 
| 270 |  |         /* Use extended format in case witnesses are to be serialized. */ | 
| 271 | 20.5M |         std::vector<CTxIn> vinDummy; | 
| 272 | 20.5M |         s << vinDummy; | 
| 273 | 20.5M |         s << flags; | 
| 274 | 20.5M |     } | 
| 275 | 42.0M |     s << tx.vin; | 
| 276 | 42.0M |     s << tx.vout; | 
| 277 | 42.0M |     if (flags & 1) { | 
| 278 | 41.0M |         for (size_t i = 0; i < tx.vin.size(); i++20.5M) { | 
| 279 | 20.5M |             s << tx.vin[i].scriptWitness.stack; | 
| 280 | 20.5M |         } | 
| 281 | 20.5M |     } | 
| 282 | 42.0M |     s << tx.nLockTime; | 
| 283 | 42.0M | } _Z20SerializeTransactionI12ParamsStreamIR12SizeComputer20TransactionSerParamsE12CTransactionEvRKT0_RT_RKS3_| Line | Count | Source |  | 257 | 5.60M | { |  | 258 | 5.60M |     const bool fAllowWitness = params.allow_witness; |  | 259 |  |  |  | 260 | 5.60M |     s << tx.version; |  | 261 | 5.60M |     unsigned char flags = 0; |  | 262 |  |     // Consistency check |  | 263 | 5.60M |     if (fAllowWitness) { |  | 264 |  |         /* Check whether witnesses need to be serialized. */ |  | 265 | 1.68M |         if (tx.HasWitness()) { |  | 266 | 1.68M |             flags |= 1; |  | 267 | 1.68M |         } |  | 268 | 1.68M |     } |  | 269 | 5.60M |     if (flags) { |  | 270 |  |         /* Use extended format in case witnesses are to be serialized. */ |  | 271 | 1.68M |         std::vector<CTxIn> vinDummy; |  | 272 | 1.68M |         s << vinDummy; |  | 273 | 1.68M |         s << flags; |  | 274 | 1.68M |     } |  | 275 | 5.60M |     s << tx.vin; |  | 276 | 5.60M |     s << tx.vout; |  | 277 | 5.60M |     if (flags & 1) { |  | 278 | 3.36M |         for (size_t i = 0; i < tx.vin.size(); i++1.68M) { |  | 279 | 1.68M |             s << tx.vin[i].scriptWitness.stack; |  | 280 | 1.68M |         } |  | 281 | 1.68M |     } |  | 282 | 5.60M |     s << tx.nLockTime; |  | 283 | 5.60M | } | 
_Z20SerializeTransactionI12ParamsStreamIR12VectorWriter20TransactionSerParamsE12CTransactionEvRKT0_RT_RKS3_| Line | Count | Source |  | 257 | 5.37M | { |  | 258 | 5.37M |     const bool fAllowWitness = params.allow_witness; |  | 259 |  |  |  | 260 | 5.37M |     s << tx.version; |  | 261 | 5.37M |     unsigned char flags = 0; |  | 262 |  |     // Consistency check |  | 263 | 5.37M |     if (fAllowWitness) { |  | 264 |  |         /* Check whether witnesses need to be serialized. */ |  | 265 | 5.37M |         if (tx.HasWitness()) { |  | 266 | 5.37M |             flags |= 1; |  | 267 | 5.37M |         } |  | 268 | 5.37M |     } |  | 269 | 5.37M |     if (flags) { |  | 270 |  |         /* Use extended format in case witnesses are to be serialized. */ |  | 271 | 5.37M |         std::vector<CTxIn> vinDummy; |  | 272 | 5.37M |         s << vinDummy; |  | 273 | 5.37M |         s << flags; |  | 274 | 5.37M |     } |  | 275 | 5.37M |     s << tx.vin; |  | 276 | 5.37M |     s << tx.vout; |  | 277 | 5.37M |     if (flags & 1) { |  | 278 | 10.7M |         for (size_t i = 0; i < tx.vin.size(); i++5.37M) { |  | 279 | 5.37M |             s << tx.vin[i].scriptWitness.stack; |  | 280 | 5.37M |         } |  | 281 | 5.37M |     } |  | 282 | 5.37M |     s << tx.nLockTime; |  | 283 | 5.37M | } | 
Unexecuted instantiation: _Z20SerializeTransactionI12ParamsStreamIR10DataStream20TransactionSerParamsE12CTransactionEvRKT0_RT_RKS3_Unexecuted instantiation: _Z20SerializeTransactionI12ParamsStreamIR12SizeComputer20TransactionSerParamsE19CMutableTransactionEvRKT0_RT_RKS3_Unexecuted instantiation: _Z20SerializeTransactionI12ParamsStreamIR10DataStream20TransactionSerParamsE19CMutableTransactionEvRKT0_RT_RKS3_Unexecuted instantiation: _Z20SerializeTransactionI12ParamsStreamIRS0_IR12VectorWriter20TransactionSerParamsES3_E12CTransactionEvRKT0_RT_RKS3__Z20SerializeTransactionI12ParamsStreamIR14BufferedWriterI8AutoFileE20TransactionSerParamsE12CTransactionEvRKT0_RT_RKS5_| Line | Count | Source |  | 257 | 162k | { |  | 258 | 162k |     const bool fAllowWitness = params.allow_witness; |  | 259 |  |  |  | 260 | 162k |     s << tx.version; |  | 261 | 162k |     unsigned char flags = 0; |  | 262 |  |     // Consistency check |  | 263 | 162k |     if (fAllowWitness) { |  | 264 |  |         /* Check whether witnesses need to be serialized. */ |  | 265 | 162k |         if (tx.HasWitness()) { |  | 266 | 162k |             flags |= 1; |  | 267 | 162k |         } |  | 268 | 162k |     } |  | 269 | 162k |     if (flags) { |  | 270 |  |         /* Use extended format in case witnesses are to be serialized. */ |  | 271 | 162k |         std::vector<CTxIn> vinDummy; |  | 272 | 162k |         s << vinDummy; |  | 273 | 162k |         s << flags; |  | 274 | 162k |     } |  | 275 | 162k |     s << tx.vin; |  | 276 | 162k |     s << tx.vout; |  | 277 | 162k |     if (flags & 1) { |  | 278 | 324k |         for (size_t i = 0; i < tx.vin.size(); i++162k) { |  | 279 | 162k |             s << tx.vin[i].scriptWitness.stack; |  | 280 | 162k |         } |  | 281 | 162k |     } |  | 282 | 162k |     s << tx.nLockTime; |  | 283 | 162k | } | 
Unexecuted instantiation: _Z20SerializeTransactionI12ParamsStreamIR8AutoFile20TransactionSerParamsE12CTransactionEvRKT0_RT_RKS3_Unexecuted instantiation: _Z20SerializeTransactionI12ParamsStreamIR10HashWriter20TransactionSerParamsE19CMutableTransactionEvRKT0_RT_RKS3__Z20SerializeTransactionI12ParamsStreamIR10HashWriter20TransactionSerParamsE12CTransactionEvRKT0_RT_RKS3_| Line | Count | Source |  | 257 | 30.8M | { |  | 258 | 30.8M |     const bool fAllowWitness = params.allow_witness; |  | 259 |  |  |  | 260 | 30.8M |     s << tx.version; |  | 261 | 30.8M |     unsigned char flags = 0; |  | 262 |  |     // Consistency check |  | 263 | 30.8M |     if (fAllowWitness) { |  | 264 |  |         /* Check whether witnesses need to be serialized. */ |  | 265 | 13.2M |         if (tx.HasWitness()) { |  | 266 | 13.2M |             flags |= 1; |  | 267 | 13.2M |         } |  | 268 | 13.2M |     } |  | 269 | 30.8M |     if (flags) { |  | 270 |  |         /* Use extended format in case witnesses are to be serialized. */ |  | 271 | 13.2M |         std::vector<CTxIn> vinDummy; |  | 272 | 13.2M |         s << vinDummy; |  | 273 | 13.2M |         s << flags; |  | 274 | 13.2M |     } |  | 275 | 30.8M |     s << tx.vin; |  | 276 | 30.8M |     s << tx.vout; |  | 277 | 30.8M |     if (flags & 1) { |  | 278 | 26.5M |         for (size_t i = 0; i < tx.vin.size(); i++13.2M) { |  | 279 | 13.2M |             s << tx.vin[i].scriptWitness.stack; |  | 280 | 13.2M |         } |  | 281 | 13.2M |     } |  | 282 | 30.8M |     s << tx.nLockTime; |  | 283 | 30.8M | } | 
 | 
| 284 |  |  | 
| 285 |  | template<typename TxType> | 
| 286 |  | inline CAmount CalculateOutputValue(const TxType& tx) | 
| 287 | 0 | { | 
| 288 | 0 |     return std::accumulate(tx.vout.cbegin(), tx.vout.cend(), CAmount{0}, [](CAmount sum, const auto& txout) { return sum + txout.nValue; }); | 
| 289 | 0 | } | 
| 290 |  |  | 
| 291 |  |  | 
| 292 |  | /** The basic transaction that is broadcasted on the network and contained in | 
| 293 |  |  * blocks.  A transaction can contain multiple inputs and outputs. | 
| 294 |  |  */ | 
| 295 |  | class CTransaction | 
| 296 |  | { | 
| 297 |  | public: | 
| 298 |  |     // Default transaction version. | 
| 299 |  |     static const uint32_t CURRENT_VERSION{2}; | 
| 300 |  |  | 
| 301 |  |     // The local variables are made const to prevent unintended modification | 
| 302 |  |     // without updating the cached hash value. However, CTransaction is not | 
| 303 |  |     // actually immutable; deserialization and assignment are implemented, | 
| 304 |  |     // and bypass the constness. This is safe, as they update the entire | 
| 305 |  |     // structure, including the hash. | 
| 306 |  |     const std::vector<CTxIn> vin; | 
| 307 |  |     const std::vector<CTxOut> vout; | 
| 308 |  |     const uint32_t version; | 
| 309 |  |     const uint32_t nLockTime; | 
| 310 |  |  | 
| 311 |  | private: | 
| 312 |  |     /** Memory only. */ | 
| 313 |  |     const bool m_has_witness; | 
| 314 |  |     const Txid hash; | 
| 315 |  |     const Wtxid m_witness_hash; | 
| 316 |  |  | 
| 317 |  |     Txid ComputeHash() const; | 
| 318 |  |     Wtxid ComputeWitnessHash() const; | 
| 319 |  |  | 
| 320 |  |     bool ComputeHasWitness() const; | 
| 321 |  |  | 
| 322 |  | public: | 
| 323 |  |     /** Convert a CMutableTransaction into a CTransaction. */ | 
| 324 |  |     explicit CTransaction(const CMutableTransaction& tx); | 
| 325 |  |     explicit CTransaction(CMutableTransaction&& tx); | 
| 326 |  |  | 
| 327 |  |     template <typename Stream> | 
| 328 | 42.0M |     inline void Serialize(Stream& s) const { | 
| 329 | 42.0M |         SerializeTransaction(*this, s, s.template GetParams<TransactionSerParams>()); | 
| 330 | 42.0M |     } _ZNK12CTransaction9SerializeI12ParamsStreamIR12SizeComputer20TransactionSerParamsEEEvRT_| Line | Count | Source |  | 328 | 5.60M |     inline void Serialize(Stream& s) const { |  | 329 | 5.60M |         SerializeTransaction(*this, s, s.template GetParams<TransactionSerParams>()); |  | 330 | 5.60M |     } | 
_ZNK12CTransaction9SerializeI12ParamsStreamIR12VectorWriter20TransactionSerParamsEEEvRT_| Line | Count | Source |  | 328 | 5.37M |     inline void Serialize(Stream& s) const { |  | 329 | 5.37M |         SerializeTransaction(*this, s, s.template GetParams<TransactionSerParams>()); |  | 330 | 5.37M |     } | 
Unexecuted instantiation: _ZNK12CTransaction9SerializeI12ParamsStreamIR10DataStream20TransactionSerParamsEEEvRT_Unexecuted instantiation: _ZNK12CTransaction9SerializeI12ParamsStreamIRS1_IR12VectorWriter20TransactionSerParamsES4_EEEvRT__ZNK12CTransaction9SerializeI12ParamsStreamIR14BufferedWriterI8AutoFileE20TransactionSerParamsEEEvRT_| Line | Count | Source |  | 328 | 162k |     inline void Serialize(Stream& s) const { |  | 329 | 162k |         SerializeTransaction(*this, s, s.template GetParams<TransactionSerParams>()); |  | 330 | 162k |     } | 
Unexecuted instantiation: _ZNK12CTransaction9SerializeI12ParamsStreamIR8AutoFile20TransactionSerParamsEEEvRT__ZNK12CTransaction9SerializeI12ParamsStreamIR10HashWriter20TransactionSerParamsEEEvRT_| Line | Count | Source |  | 328 | 30.8M |     inline void Serialize(Stream& s) const { |  | 329 | 30.8M |         SerializeTransaction(*this, s, s.template GetParams<TransactionSerParams>()); |  | 330 | 30.8M |     } | 
 | 
| 331 |  |  | 
| 332 |  |     /** This deserializing constructor is provided instead of an Unserialize method. | 
| 333 |  |      *  Unserialize is not possible, since it would require overwriting const fields. */ | 
| 334 |  |     template <typename Stream> | 
| 335 | 0 |     CTransaction(deserialize_type, const TransactionSerParams& params, Stream& s) : CTransaction(CMutableTransaction(deserialize, params, s)) {} | 
| 336 |  |     template <typename Stream> | 
| 337 | 5.28M |     CTransaction(deserialize_type, Stream& s) : CTransaction(CMutableTransaction(deserialize, s)) {}_ZN12CTransactionC1I12ParamsStreamIR10DataStream20TransactionSerParamsEEE16deserialize_typeRT_| Line | Count | Source |  | 337 | 4.97M |     CTransaction(deserialize_type, Stream& s) : CTransaction(CMutableTransaction(deserialize, s)) {} | 
Unexecuted instantiation: _ZN12CTransactionC1I12ParamsStreamIR8AutoFile20TransactionSerParamsEEE16deserialize_typeRT__ZN12CTransactionC1I12ParamsStreamIR10SpanReader20TransactionSerParamsEEE16deserialize_typeRT_| Line | Count | Source |  | 337 | 311k |     CTransaction(deserialize_type, Stream& s) : CTransaction(CMutableTransaction(deserialize, s)) {} | 
Unexecuted instantiation: _ZN12CTransactionC1I12ParamsStreamIR12BufferedFile20TransactionSerParamsEEE16deserialize_typeRT_ | 
| 338 |  |  | 
| 339 | 193k |     bool IsNull() const { | 
| 340 | 193k |         return vin.empty() && vout.empty()0; | 
| 341 | 193k |     } | 
| 342 |  |  | 
| 343 | 659M |     const Txid& GetHash() const LIFETIMEBOUND { return hash; } | 
| 344 | 38.6M |     const Wtxid& GetWitnessHash() const LIFETIMEBOUND { return m_witness_hash; }; | 
| 345 |  |  | 
| 346 |  |     // Return sum of txouts. | 
| 347 |  |     CAmount GetValueOut() const; | 
| 348 |  |  | 
| 349 |  |     /** | 
| 350 |  |      * Get the total transaction size in bytes, including witness data. | 
| 351 |  |      * "Total Size" defined in BIP141 and BIP144. | 
| 352 |  |      * @return Total transaction size in bytes | 
| 353 |  |      */ | 
| 354 |  |     unsigned int GetTotalSize() const; | 
| 355 |  |  | 
| 356 |  |     bool IsCoinBase() const | 
| 357 | 58.5M |     { | 
| 358 | 58.5M |         return (vin.size() == 1 && vin[0].prevout.IsNull()); | 
| 359 | 58.5M |     } | 
| 360 |  |  | 
| 361 |  |     friend bool operator==(const CTransaction& a, const CTransaction& b) | 
| 362 | 0 |     { | 
| 363 | 0 |         return a.GetWitnessHash() == b.GetWitnessHash(); | 
| 364 | 0 |     } | 
| 365 |  |  | 
| 366 |  |     friend bool operator!=(const CTransaction& a, const CTransaction& b) | 
| 367 | 0 |     { | 
| 368 | 0 |         return !operator==(a, b); | 
| 369 | 0 |     } | 
| 370 |  |  | 
| 371 |  |     std::string ToString() const; | 
| 372 |  |  | 
| 373 | 44.4M |     bool HasWitness() const { return m_has_witness; } | 
| 374 |  | }; | 
| 375 |  |  | 
| 376 |  | /** A mutable version of CTransaction. */ | 
| 377 |  | struct CMutableTransaction | 
| 378 |  | { | 
| 379 |  |     std::vector<CTxIn> vin; | 
| 380 |  |     std::vector<CTxOut> vout; | 
| 381 |  |     uint32_t version; | 
| 382 |  |     uint32_t nLockTime; | 
| 383 |  |  | 
| 384 |  |     explicit CMutableTransaction(); | 
| 385 |  |     explicit CMutableTransaction(const CTransaction& tx); | 
| 386 |  |  | 
| 387 |  |     template <typename Stream> | 
| 388 | 0 |     inline void Serialize(Stream& s) const { | 
| 389 | 0 |         SerializeTransaction(*this, s, s.template GetParams<TransactionSerParams>()); | 
| 390 | 0 |     } Unexecuted instantiation: _ZNK19CMutableTransaction9SerializeI12ParamsStreamIR12SizeComputer20TransactionSerParamsEEEvRT_Unexecuted instantiation: _ZNK19CMutableTransaction9SerializeI12ParamsStreamIR10DataStream20TransactionSerParamsEEEvRT_Unexecuted instantiation: _ZNK19CMutableTransaction9SerializeI12ParamsStreamIR10HashWriter20TransactionSerParamsEEEvRT_ | 
| 391 |  |  | 
| 392 |  |     template <typename Stream> | 
| 393 | 5.28M |     inline void Unserialize(Stream& s) { | 
| 394 | 5.28M |         UnserializeTransaction(*this, s, s.template GetParams<TransactionSerParams>()); | 
| 395 | 5.28M |     } _ZN19CMutableTransaction11UnserializeI12ParamsStreamIR10DataStream20TransactionSerParamsEEEvRT_| Line | Count | Source |  | 393 | 4.97M |     inline void Unserialize(Stream& s) { |  | 394 | 4.97M |         UnserializeTransaction(*this, s, s.template GetParams<TransactionSerParams>()); |  | 395 | 4.97M |     } | 
_ZN19CMutableTransaction11UnserializeI12ParamsStreamIR10SpanReader20TransactionSerParamsEEEvRT_| Line | Count | Source |  | 393 | 311k |     inline void Unserialize(Stream& s) { |  | 394 | 311k |         UnserializeTransaction(*this, s, s.template GetParams<TransactionSerParams>()); |  | 395 | 311k |     } | 
Unexecuted instantiation: _ZN19CMutableTransaction11UnserializeI12ParamsStreamIR8AutoFile20TransactionSerParamsEEEvRT_Unexecuted instantiation: _ZN19CMutableTransaction11UnserializeI12ParamsStreamIR12BufferedFile20TransactionSerParamsEEEvRT_ | 
| 396 |  |  | 
| 397 |  |     template <typename Stream> | 
| 398 | 0 |     CMutableTransaction(deserialize_type, const TransactionSerParams& params, Stream& s) { | 
| 399 | 0 |         UnserializeTransaction(*this, s, params); | 
| 400 | 0 |     } | 
| 401 |  |  | 
| 402 |  |     template <typename Stream> | 
| 403 | 5.28M |     CMutableTransaction(deserialize_type, Stream& s) { | 
| 404 | 5.28M |         Unserialize(s); | 
| 405 | 5.28M |     } _ZN19CMutableTransactionC2I12ParamsStreamIR10DataStream20TransactionSerParamsEEE16deserialize_typeRT_| Line | Count | Source |  | 403 | 4.97M |     CMutableTransaction(deserialize_type, Stream& s) { |  | 404 | 4.97M |         Unserialize(s); |  | 405 | 4.97M |     } | 
Unexecuted instantiation: _ZN19CMutableTransactionC2I12ParamsStreamIR8AutoFile20TransactionSerParamsEEE16deserialize_typeRT__ZN19CMutableTransactionC2I12ParamsStreamIR10SpanReader20TransactionSerParamsEEE16deserialize_typeRT_| Line | Count | Source |  | 403 | 311k |     CMutableTransaction(deserialize_type, Stream& s) { |  | 404 | 311k |         Unserialize(s); |  | 405 | 311k |     } | 
Unexecuted instantiation: _ZN19CMutableTransactionC2I12ParamsStreamIR12BufferedFile20TransactionSerParamsEEE16deserialize_typeRT_ | 
| 406 |  |  | 
| 407 |  |     /** Compute the hash of this CMutableTransaction. This is computed on the | 
| 408 |  |      * fly, as opposed to GetHash() in CTransaction, which uses a cached result. | 
| 409 |  |      */ | 
| 410 |  |     Txid GetHash() const; | 
| 411 |  |  | 
| 412 |  |     bool HasWitness() const | 
| 413 | 5.28M |     { | 
| 414 | 5.28M |         for (size_t i = 0; i < vin.size(); i++0) { | 
| 415 | 5.28M |             if (!vin[i].scriptWitness.IsNull()) { | 
| 416 | 5.28M |                 return true; | 
| 417 | 5.28M |             } | 
| 418 | 5.28M |         } | 
| 419 | 0 |         return false; | 
| 420 | 5.28M |     } | 
| 421 |  | }; | 
| 422 |  |  | 
| 423 |  | typedef std::shared_ptr<const CTransaction> CTransactionRef; | 
| 424 | 12.3M | template <typename Tx> static inline CTransactionRef MakeTransactionRef(Tx&& txIn) { return std::make_shared<const CTransaction>(std::forward<Tx>(txIn)); }cmpctblock.cpp:_ZL18MakeTransactionRefIR19CMutableTransactionENSt3__110shared_ptrIK12CTransactionEEOT_| Line | Count | Source |  | 424 | 7.99M | template <typename Tx> static inline CTransactionRef MakeTransactionRef(Tx&& txIn) { return std::make_shared<const CTransaction>(std::forward<Tx>(txIn)); } | 
Unexecuted instantiation: mini_miner.cpp:_ZL18MakeTransactionRefIR19CMutableTransactionENSt3__110shared_ptrIK12CTransactionEEOT_Unexecuted instantiation: p2p_headers_presync.cpp:_ZL18MakeTransactionRefIR19CMutableTransactionENSt3__110shared_ptrIK12CTransactionEEOT_Unexecuted instantiation: package_eval.cpp:_ZL18MakeTransactionRefIR19CMutableTransactionENSt3__110shared_ptrIK12CTransactionEEOT_Unexecuted instantiation: txdownloadman.cpp:_ZL18MakeTransactionRefIR19CMutableTransactionENSt3__110shared_ptrIK12CTransactionEEOT_Unexecuted instantiation: tx_pool.cpp:_ZL18MakeTransactionRefIR19CMutableTransactionENSt3__110shared_ptrIK12CTransactionEEOT_Unexecuted instantiation: tx_pool.cpp:_ZL18MakeTransactionRefIRK19CMutableTransactionENSt3__110shared_ptrIK12CTransactionEEOT_Unexecuted instantiation: txorphan.cpp:_ZL18MakeTransactionRefIR19CMutableTransactionENSt3__110shared_ptrIK12CTransactionEEOT_Unexecuted instantiation: txorphan.cpp:_ZL18MakeTransactionRefI19CMutableTransactionENSt3__110shared_ptrIK12CTransactionEEOT_Unexecuted instantiation: utxo_total_supply.cpp:_ZL18MakeTransactionRefIR19CMutableTransactionENSt3__110shared_ptrIK12CTransactionEEOT_Unexecuted instantiation: spend.cpp:_ZL18MakeTransactionRefI19CMutableTransactionENSt3__110shared_ptrIK12CTransactionEEOT_Unexecuted instantiation: mempool.cpp:_ZL18MakeTransactionRefIRK12CTransactionENSt3__110shared_ptrIS1_EEOT_chainparams.cpp:_ZL18MakeTransactionRefI19CMutableTransactionENSt3__110shared_ptrIK12CTransactionEEOT_| Line | Count | Source |  | 424 | 307k | template <typename Tx> static inline CTransactionRef MakeTransactionRef(Tx&& txIn) { return std::make_shared<const CTransaction>(std::forward<Tx>(txIn)); } | 
Unexecuted instantiation: feebumper.cpp:_ZL18MakeTransactionRefI19CMutableTransactionENSt3__110shared_ptrIK12CTransactionEEOT_Unexecuted instantiation: backup.cpp:_ZL18MakeTransactionRefIR19CMutableTransactionENSt3__110shared_ptrIK12CTransactionEEOT_Unexecuted instantiation: wallet.cpp:_ZL18MakeTransactionRefIRK12CTransactionENSt3__110shared_ptrIS1_EEOT_Unexecuted instantiation: mining.cpp:_ZL18MakeTransactionRefI19CMutableTransactionENSt3__110shared_ptrIK12CTransactionEEOT_Unexecuted instantiation: setup_common.cpp:_ZL18MakeTransactionRefIRK19CMutableTransactionENSt3__110shared_ptrIK12CTransactionEEOT_Unexecuted instantiation: setup_common.cpp:_ZL18MakeTransactionRefIR19CMutableTransactionENSt3__110shared_ptrIK12CTransactionEEOT_Unexecuted instantiation: txmempool.cpp:_ZL18MakeTransactionRefIRK19CMutableTransactionENSt3__110shared_ptrIK12CTransactionEEOT_Unexecuted instantiation: miner.cpp:_ZL18MakeTransactionRefIR19CMutableTransactionENSt3__110shared_ptrIK12CTransactionEEOT_Unexecuted instantiation: miner.cpp:_ZL18MakeTransactionRefI19CMutableTransactionENSt3__110shared_ptrIK12CTransactionEEOT_Unexecuted instantiation: mempool.cpp:_ZL18MakeTransactionRefI19CMutableTransactionENSt3__110shared_ptrIK12CTransactionEEOT_validation.cpp:_ZL18MakeTransactionRefI19CMutableTransactionENSt3__110shared_ptrIK12CTransactionEEOT_| Line | Count | Source |  | 424 | 4.01M | template <typename Tx> static inline CTransactionRef MakeTransactionRef(Tx&& txIn) { return std::make_shared<const CTransaction>(std::forward<Tx>(txIn)); } | 
 | 
| 425 |  |  | 
| 426 |  | #endif // BITCOIN_PRIMITIVES_TRANSACTION_H |