16typedef std::vector<unsigned char>
valtype;
38 for (
unsigned int i = 0; i < vch.size(); i++)
43 if (i == vch.size()-1 && vch[i] == 0x80)
55#define stacktop(i) (stack.at(size_t(int64_t(stack.size()) + int64_t{i})))
56#define altstacktop(i) (altstack.at(size_t(int64_t(altstack.size()) + int64_t{i})))
57static inline void popstack(std::vector<valtype>& stack)
60 throw std::runtime_error(
"popstack(): stack empty");
122 if (sig.size() < 9)
return false;
123 if (sig.size() > 73)
return false;
126 if (sig[0] != 0x30)
return false;
129 if (sig[1] != sig.size() - 3)
return false;
132 unsigned int lenR = sig[3];
135 if (5 +
lenR >= sig.size())
return false;
142 if ((
size_t)(
lenR +
lenS + 7) != sig.size())
return false;
145 if (sig[2] != 0x02)
return false;
148 if (
lenR == 0)
return false;
151 if (sig[4] & 0x80)
return false;
155 if (
lenR > 1 && (sig[4] == 0x00) && !(sig[5] & 0x80))
return false;
158 if (sig[
lenR + 4] != 0x02)
return false;
161 if (
lenS == 0)
return false;
164 if (sig[
lenR + 6] & 0x80)
return false;
168 if (
lenS > 1 && (sig[
lenR + 6] == 0x00) && !(sig[
lenR + 7] & 0x80))
return false;
240 while (
static_cast<size_t>(end -
pc) >= b.
size() && std::equal(b.
begin(), b.
end(),
pc))
251 script = std::move(result);
273class ConditionStack {
276 static constexpr uint32_t NO_FALSE = std::numeric_limits<uint32_t>::max();
281 uint32_t m_first_false_pos = NO_FALSE;
284 bool empty()
const {
return m_stack_size == 0; }
285 bool all_true()
const {
return m_first_false_pos == NO_FALSE; }
286 void push_back(
bool f)
288 if (m_first_false_pos == NO_FALSE && !
f) {
291 m_first_false_pos = m_stack_size;
299 if (m_first_false_pos == m_stack_size) {
301 m_first_false_pos = NO_FALSE;
307 if (m_first_false_pos == NO_FALSE) {
309 m_first_false_pos = m_stack_size - 1;
310 }
else if (m_first_false_pos == m_stack_size - 1) {
312 m_first_false_pos = NO_FALSE;
357 success = !sig.empty();
363 if (
execdata.m_validation_weight_left < 0) {
367 if (pubkey.size() == 0) {
369 }
else if (pubkey.size() == 32) {
434 execdata.m_codeseparator_pos = 0xFFFFFFFFUL;
435 execdata.m_codeseparator_pos_init =
true;
509 stack.push_back(
bn.getvch());
529 if (stack.size() < 1)
568 if (stack.size() < 1)
610 if (stack.size() < 1)
617 if (vch.size() > 1 || (vch.size() == 1 && vch[0] != 1)) {
625 if (vch.size() == 1 && vch[0] != 1)
657 if (stack.size() < 1)
679 if (stack.size() < 1)
698 if (stack.size() < 2)
708 if (stack.size() < 2)
712 stack.push_back(
vch1);
713 stack.push_back(
vch2);
720 if (stack.size() < 3)
725 stack.push_back(
vch1);
726 stack.push_back(
vch2);
727 stack.push_back(
vch3);
734 if (stack.size() < 4)
738 stack.push_back(
vch1);
739 stack.push_back(
vch2);
746 if (stack.size() < 6)
750 stack.erase(stack.end()-6, stack.end()-4);
751 stack.push_back(
vch1);
752 stack.push_back(
vch2);
759 if (stack.size() < 4)
769 if (stack.size() < 1)
773 stack.push_back(vch);
781 stack.push_back(
bn.getvch());
788 if (stack.size() < 1)
797 if (stack.size() < 1)
800 stack.push_back(vch);
807 if (stack.size() < 2)
809 stack.erase(stack.end() - 2);
816 if (stack.size() < 2)
819 stack.push_back(vch);
828 if (stack.size() < 2)
836 stack.erase(stack.end()-n-1);
837 stack.push_back(vch);
846 if (stack.size() < 3)
856 if (stack.size() < 2)
865 if (stack.size() < 2)
868 stack.insert(stack.end()-2, vch);
876 if (stack.size() < 1)
879 stack.push_back(
bn.getvch());
892 if (stack.size() < 2)
927 if (stack.size() < 1)
938 default:
assert(!
"invalid opcode");
break;
941 stack.push_back(
bn.getvch());
960 if (stack.size() < 2)
986 default:
assert(!
"invalid opcode");
break;
990 stack.push_back(
bn.getvch());
1005 if (stack.size() < 3)
1029 if (stack.size() < 1)
1063 if (stack.size() < 2)
1096 bool success =
true;
1101 stack.push_back((num + (success ? 1 : 0)).getvch());
1113 if ((
int)stack.size() < i)
1127 if ((
int)stack.size() < i)
1135 if ((
int)stack.size() < i)
1199 if (stack.size() < 1)
1254class CTransactionSignatureSerializer
1259 const unsigned int nIn;
1260 const bool fAnyoneCanPay;
1261 const bool fHashSingle;
1262 const bool fHashNone;
1272 template<
typename S>
1295 template<
typename S>
1309 if (
nInput != nIn && (fHashSingle || fHashNone))
1313 ::Serialize(s, txTo.vin[
nInput].nSequence);
1317 template<
typename S>
1319 if (fHashSingle &&
nOutput != nIn)
1323 ::Serialize(s, txTo.vout[
nOutput]);
1327 template<
typename S>
1332 unsigned int nInputs = fAnyoneCanPay ? 1 : txTo.vin.size();
1337 unsigned int nOutputs = fHashNone ? 0 : (fHashSingle ? nIn+1 : txTo.vout.size());
1351 for (
const auto&
txin : txTo.vin) {
1354 return ss.GetSHA256();
1362 for (
const auto&
txin : txTo.vin) {
1365 return ss.GetSHA256();
1373 for (
const auto& txout : txTo.vout) {
1376 return ss.GetSHA256();
1386 return ss.GetSHA256();
1394 ss << txout.scriptPubKey;
1396 return ss.GetSHA256();
1417 if (!txTo.vin[
inpos].scriptWitness.IsNull()) {
1479 assert(!
"Unknown MissingDataBehavior value");
1583 auto& entry = m_cache_entries[CacheIndex(
hash_type)];
1584 if (entry.has_value()) {
1595 auto& entry = m_cache_entries[CacheIndex(
hash_type)];
1602 assert(nIn < txTo.vin.size());
1607 if (nIn >= txTo.vout.size()) {
1620 return ss.GetHash();
1639 }
else if ((nHashType & 0x1f) ==
SIGHASH_SINGLE && nIn < txTo.vout.size()) {
1653 ss << txTo.vin[nIn].prevout;
1656 ss << txTo.vin[nIn].nSequence;
1660 ss << txTo.nLockTime;
1663 CTransactionSignatureSerializer<T>
txTmp(txTo, scriptCode, nIn, nHashType);
1676 return ss.GetHash();
1702 int nHashType =
vchSig.back();
1731 if (sig.size() == 65) {
1762 if (nLockTime > (
int64_t)txTo->nLockTime)
1790 if (txTo->version < 2)
1880 if (std::lexicographical_compare(
a.begin(),
a.end(), b.begin(), b.end())) {
1896 for (
int i = 0; i <
path_len; ++i) {
1914 return q.CheckTapTweak(
p, merkle_root,
control[0] & 1);
1920 std::span stack{witness.
stack};
1926 if (stack.size() == 0) {
1939 if (stack.size() != 2) {
1951 if (stack.size() >= 2 && !stack.back().empty() && stack.back()[0] ==
ANNEX_TAG) {
1960 if (stack.size() == 1) {
1977 execdata.m_tapleaf_hash_init =
true;
1982 execdata.m_validation_weight_left_init =
true;
2005 if (witness ==
nullptr) {
2018 std::vector<std::vector<unsigned char> > stack,
stackCopy;
2038 if (scriptSig.
size() != 0) {
2105 if (stack.size() != 1) {
2154 std::vector<unsigned char> data;
2155 while (
pc < scriptSig.
end()) {
2170#define FLAG_NAME(flag) {std::string(#flag), SCRIPT_VERIFY_##flag}
2171 static const std::map<std::string, script_verify_flag_name>
g_names_to_enum{
2200 std::vector<std::string>
res;
2206 if ((
flags & flag) != 0) {
2211 if (leftover != 0) {
std::vector< unsigned char > valtype
int64_t CAmount
Amount in satoshis (Can be negative)
virtual bool CheckLockTime(const CScriptNum &nLockTime) const
virtual bool CheckSchnorrSignature(std::span< const unsigned char > sig, std::span< const unsigned char > pubkey, SigVersion sigversion, ScriptExecutionData &execdata, ScriptError *serror=nullptr) const
virtual bool CheckSequence(const CScriptNum &nSequence) const
virtual bool CheckECDSASignature(const std::vector< unsigned char > &scriptSig, const std::vector< unsigned char > &vchPubKey, const CScript &scriptCode, SigVersion sigversion) const
A hasher class for Bitcoin's 160-bit hash (SHA-256 + RIPEMD-160).
CHash160 & Write(std::span< const unsigned char > input)
void Finalize(std::span< unsigned char > output)
A hasher class for Bitcoin's 256-bit hash (double SHA-256).
void Finalize(std::span< unsigned char > output)
CHash256 & Write(std::span< const unsigned char > input)
An encapsulated public key.
static constexpr unsigned int COMPRESSED_SIZE
static bool CheckLowS(const std::vector< unsigned char > &vchSig)
Check whether a signature is normalized (lower-S).
bool Verify(const uint256 &hash, const std::vector< unsigned char > &vchSig) const
Verify a DER signature (~72 bytes).
static constexpr unsigned int SIZE
secp256k1:
A hasher class for RIPEMD-160.
CRIPEMD160 & Write(const unsigned char *data, size_t len)
void Finalize(unsigned char hash[OUTPUT_SIZE])
CSHA1 & Write(const unsigned char *data, size_t len)
void Finalize(unsigned char hash[OUTPUT_SIZE])
A hasher class for SHA-256.
void Finalize(unsigned char hash[OUTPUT_SIZE])
CSHA256 & Write(const unsigned char *data, size_t len)
Serialized script, used inside transaction inputs and outputs.
bool IsPushOnly(const_iterator pc) const
Called by IsStandardTx and P2SH/BIP62 VerifyScript (which makes it consensus-critical).
bool IsPayToScriptHash() const
bool IsPayToAnchor() const
bool GetOp(const_iterator &pc, opcodetype &opcodeRet, std::vector< unsigned char > &vchRet) const
bool IsWitnessProgram(int &version, std::vector< unsigned char > &program) const
The basic transaction that is broadcasted on the network and contained in blocks.
static const uint32_t SEQUENCE_LOCKTIME_DISABLE_FLAG
If this flag is set, CTxIn::nSequence is NOT interpreted as a relative lock-time.
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().
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...
An output of a transaction.
bool CheckSchnorrSignature(std::span< const unsigned char > sig, std::span< const unsigned char > pubkey, SigVersion sigversion, ScriptExecutionData &execdata, ScriptError *serror=nullptr) const override
bool CheckECDSASignature(const std::vector< unsigned char > &scriptSig, const std::vector< unsigned char > &vchPubKey, const CScript &scriptCode, SigVersion sigversion) const override
bool CheckLockTime(const CScriptNum &nLockTime) const override
virtual bool VerifySchnorrSignature(std::span< const unsigned char > sig, const XOnlyPubKey &pubkey, const uint256 &sighash) const
virtual bool VerifyECDSASignature(const std::vector< unsigned char > &vchSig, const CPubKey &vchPubKey, const uint256 &sighash) const
bool CheckSequence(const CScriptNum &nSequence) const override
A writer stream (for serialization) that computes a 256-bit hash.
uint256 GetSHA256()
Compute the SHA256 hash of all data written to this object.
Data structure to cache SHA256 midstates for the ECDSA sighash calculations (bare,...
void Store(int32_t hash_type, const CScript &script_code, const HashWriter &writer) noexcept
Store into this cache object the provided SHA256 midstate.
bool Load(int32_t hash_type, const CScript &script_code, HashWriter &writer) const noexcept
Load into writer the SHA256 midstate if found in this cache.
int CacheIndex(int32_t hash_type) const noexcept
Given a hash_type, find which of the 6 cache entries is to be used.
bool VerifySchnorr(const uint256 &msg, std::span< const unsigned char > sigbytes) const
Verify a Schnorr signature against this public key.
static constexpr unsigned int size()
iterator insert(iterator pos, const T &value)
constexpr value_type as_int() const
HashWriter TaggedHash(const std::string &tag)
Return a HashWriter primed for tagged hashes (as specified in BIP 340).
uint256 SHA256Uint256(const uint256 &input)
Single-SHA256 a 32-byte input (represented as uint256).
#define T(expected, seed, data)
uint256 ComputeTapbranchHash(std::span< const unsigned char > a, std::span< const unsigned char > b)
Compute the BIP341 tapbranch hash from two branches.
const std::map< std::string, script_verify_flag_name > & ScriptFlagNamesToEnum()
static bool IsDefinedHashtypeSignature(const valtype &vchSig)
bool SignatureHashSchnorr(uint256 &hash_out, ScriptExecutionData &execdata, const T &tx_to, uint32_t in_pos, uint8_t hash_type, SigVersion sigversion, const PrecomputedTransactionData &cache, MissingDataBehavior mdb)
static bool EvalChecksigTapscript(const valtype &sig, const valtype &pubkey, ScriptExecutionData &execdata, script_verify_flags flags, const BaseSignatureChecker &checker, SigVersion sigversion, ScriptError *serror, bool &success)
static bool IsCompressedPubKey(const valtype &vchPubKey)
static bool IsValidSignatureEncoding(const std::vector< unsigned char > &sig)
A canonical signature exists of: <30> <total len> <02> <len R> <R> <02> <len S> <hashtype> Where R a...
uint256 ComputeTaprootMerkleRoot(std::span< const unsigned char > control, const uint256 &tapleaf_hash)
Compute the BIP341 taproot script tree Merkle root from control block and leaf hash.
bool CastToBool(const valtype &vch)
int FindAndDelete(CScript &script, const CScript &b)
static bool EvalChecksig(const valtype &sig, const valtype &pubkey, CScript::const_iterator pbegincodehash, CScript::const_iterator pend, ScriptExecutionData &execdata, script_verify_flags flags, const BaseSignatureChecker &checker, SigVersion sigversion, ScriptError *serror, bool &success)
Helper for OP_CHECKSIG, OP_CHECKSIGVERIFY, and (in Tapscript) OP_CHECKSIGADD.
const HashWriter HASHER_TAPBRANCH
Hasher with tag "TapBranch" pre-fed to it.
static void popstack(std::vector< valtype > &stack)
static bool IsLowDERSignature(const valtype &vchSig, ScriptError *serror)
size_t CountWitnessSigOps(const CScript &scriptSig, const CScript &scriptPubKey, const CScriptWitness &witness, script_verify_flags flags)
uint256 ComputeTapleafHash(uint8_t leaf_version, std::span< const unsigned char > script)
Compute the BIP341 tapleaf hash from leaf version & script.
bool EvalScript(std::vector< std::vector< unsigned char > > &stack, const CScript &script, script_verify_flags flags, const BaseSignatureChecker &checker, SigVersion sigversion, ScriptExecutionData &execdata, ScriptError *serror)
uint256 SignatureHash(const CScript &scriptCode, const T &txTo, unsigned int nIn, int32_t nHashType, const CAmount &amount, SigVersion sigversion, const PrecomputedTransactionData *cache, SigHashCache *sighash_cache)
static bool ExecuteWitnessScript(const std::span< const valtype > &stack_span, const CScript &exec_script, script_verify_flags flags, SigVersion sigversion, const BaseSignatureChecker &checker, ScriptExecutionData &execdata, ScriptError *serror)
static size_t WitnessSigOps(int witversion, const std::vector< unsigned char > &witprogram, const CScriptWitness &witness)
std::vector< unsigned char > valtype
static bool IsCompressedOrUncompressedPubKey(const valtype &vchPubKey)
std::vector< std::string > GetScriptFlagNames(script_verify_flags flags)
bool CheckSignatureEncoding(const std::vector< unsigned char > &vchSig, script_verify_flags flags, ScriptError *serror)
#define stacktop(i)
Script is a stack machine (like Forth) that evaluates a predicate returning a bool indicating valid o...
const HashWriter HASHER_TAPLEAF
Hasher with tag "TapLeaf" pre-fed to it.
static bool VerifyWitnessProgram(const CScriptWitness &witness, int witversion, const std::vector< unsigned char > &program, script_verify_flags flags, const BaseSignatureChecker &checker, ScriptError *serror, bool is_p2sh)
bool VerifyScript(const CScript &scriptSig, const CScript &scriptPubKey, const CScriptWitness *witness, script_verify_flags flags, const BaseSignatureChecker &checker, ScriptError *serror)
static bool HandleMissingData(MissingDataBehavior mdb)
static bool CheckPubKeyEncoding(const valtype &vchPubKey, script_verify_flags flags, const SigVersion &sigversion, ScriptError *serror)
static bool EvalChecksigPreTapscript(const valtype &vchSig, const valtype &vchPubKey, CScript::const_iterator pbegincodehash, CScript::const_iterator pend, script_verify_flags flags, const BaseSignatureChecker &checker, SigVersion sigversion, ScriptError *serror, bool &fSuccess)
static bool VerifyTaprootCommitment(const std::vector< unsigned char > &control, const std::vector< unsigned char > &program, const uint256 &tapleaf_hash)
const HashWriter HASHER_TAPSIGHASH
Hasher with tag "TapSighash" pre-fed to it.
static constexpr size_t WITNESS_V0_KEYHASH_SIZE
@ TAPROOT
Witness v1 with 32-byte program, not BIP16 P2SH-wrapped, key path spending; see BIP 341.
@ BASE
Bare scripts and BIP16 P2SH-wrapped redeemscripts.
@ TAPSCRIPT
Witness v1 with 32-byte program, not BIP16 P2SH-wrapped, script path spending, leaf version 0xc0; see...
@ WITNESS_V0
Witness v0 (P2WPKH and P2WSH); see BIP 141.
static constexpr uint8_t TAPROOT_LEAF_MASK
static constexpr uint8_t TAPROOT_LEAF_TAPSCRIPT
static constexpr size_t WITNESS_V0_SCRIPTHASH_SIZE
Signature hash sizes.
@ SIGHASH_DEFAULT
Taproot only; implied when sighash byte is missing, and equivalent to SIGHASH_ALL.
static constexpr size_t TAPROOT_CONTROL_NODE_SIZE
static constexpr size_t WITNESS_V1_TAPROOT_SIZE
MissingDataBehavior
Enum to specify what *TransactionSignatureChecker's behavior should be when dealing with missing tran...
@ ASSERT_FAIL
Abort execution through assertion failure (for consensus code)
@ FAIL
Just act as if the signature was invalid.
static constexpr size_t TAPROOT_CONTROL_MAX_SIZE
@ SCRIPT_VERIFY_NULLDUMMY
@ SCRIPT_VERIFY_STRICTENC
@ SCRIPT_VERIFY_CHECKSEQUENCEVERIFY
@ SCRIPT_VERIFY_CLEANSTACK
@ SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY
@ SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_NOPS
@ SCRIPT_VERIFY_DISCOURAGE_OP_SUCCESS
@ SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_TAPROOT_VERSION
@ SCRIPT_VERIFY_SIGPUSHONLY
@ SCRIPT_VERIFY_WITNESS_PUBKEYTYPE
@ SCRIPT_VERIFY_MINIMALIF
@ SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM
@ SCRIPT_VERIFY_MINIMALDATA
@ SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_PUBKEYTYPE
@ SCRIPT_VERIFY_CONST_SCRIPTCODE
static constexpr script_verify_flags SCRIPT_VERIFY_NONE
Script verification flags.
static constexpr size_t TAPROOT_CONTROL_BASE_SIZE
#define S(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p)
bool CheckMinimalPush(const std::vector< unsigned char > &data, opcodetype opcode)
bool IsOpSuccess(const opcodetype &opcode)
Test for OP_SUCCESSx opcodes as defined by BIP342.
static constexpr int64_t VALIDATION_WEIGHT_PER_SIGOP_PASSED
static const unsigned int LOCKTIME_THRESHOLD
static const unsigned int MAX_SCRIPT_ELEMENT_SIZE
static const int MAX_SCRIPT_SIZE
opcodetype
Script opcodes.
static const int MAX_STACK_SIZE
static const int MAX_OPS_PER_SCRIPT
static constexpr int64_t VALIDATION_WEIGHT_OFFSET
static const int MAX_PUBKEYS_PER_MULTISIG
static constexpr unsigned int ANNEX_TAG
enum ScriptError_t ScriptError
@ SCRIPT_ERR_OP_CODESEPARATOR
@ SCRIPT_ERR_SIG_PUSHONLY
@ SCRIPT_ERR_DISCOURAGE_UPGRADABLE_PUBKEYTYPE
@ SCRIPT_ERR_NUMEQUALVERIFY
@ SCRIPT_ERR_TAPSCRIPT_CHECKMULTISIG
@ SCRIPT_ERR_DISABLED_OPCODE
@ SCRIPT_ERR_DISCOURAGE_UPGRADABLE_TAPROOT_VERSION
@ SCRIPT_ERR_INVALID_ALTSTACK_OPERATION
@ SCRIPT_ERR_DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM
@ SCRIPT_ERR_TAPSCRIPT_EMPTY_PUBKEY
@ SCRIPT_ERR_TAPSCRIPT_MINIMALIF
@ SCRIPT_ERR_UNKNOWN_ERROR
@ SCRIPT_ERR_WITNESS_PROGRAM_WRONG_LENGTH
@ SCRIPT_ERR_SIG_HASHTYPE
@ SCRIPT_ERR_CHECKSIGVERIFY
@ SCRIPT_ERR_WITNESS_MALLEATED_P2SH
@ SCRIPT_ERR_SCHNORR_SIG_SIZE
@ SCRIPT_ERR_WITNESS_MALLEATED
@ SCRIPT_ERR_DISCOURAGE_UPGRADABLE_NOPS
@ SCRIPT_ERR_TAPSCRIPT_VALIDATION_WEIGHT
@ SCRIPT_ERR_INVALID_STACK_OPERATION
@ SCRIPT_ERR_DISCOURAGE_OP_SUCCESS
@ SCRIPT_ERR_WITNESS_UNEXPECTED
@ SCRIPT_ERR_NEGATIVE_LOCKTIME
@ SCRIPT_ERR_WITNESS_PROGRAM_MISMATCH
@ SCRIPT_ERR_SIG_NULLFAIL
@ SCRIPT_ERR_SIG_NULLDUMMY
@ SCRIPT_ERR_CHECKMULTISIGVERIFY
@ SCRIPT_ERR_TAPROOT_WRONG_CONTROL_SIZE
@ SCRIPT_ERR_UNSATISFIED_LOCKTIME
@ SCRIPT_ERR_WITNESS_PUBKEYTYPE
@ SCRIPT_ERR_SIG_FINDANDDELETE
@ SCRIPT_ERR_PUBKEY_COUNT
@ SCRIPT_ERR_WITNESS_PROGRAM_WITNESS_EMPTY
@ SCRIPT_ERR_SCHNORR_SIG_HASHTYPE
@ SCRIPT_ERR_UNBALANCED_CONDITIONAL
void Serialize(Stream &, V)=delete
void WriteCompactSize(SizeComputer &os, uint64_t nSize)
uint64_t GetSerializeSize(const T &t)
T & SpanPopBack(std::span< T > &span)
A span is an object that can refer to a contiguous sequence of objects.
A mutable version of CTransaction.
std::vector< std::vector< unsigned char > > stack
void Init(const T &tx, std::vector< CTxOut > &&spent_outputs, bool force=false)
Initialize this PrecomputedTransactionData with transaction data.
uint256 m_sequences_single_hash
bool m_bip341_taproot_ready
Whether the 5 fields above are initialized.
PrecomputedTransactionData()=default
bool m_bip143_segwit_ready
Whether the 3 fields above are initialized.
uint256 m_prevouts_single_hash
uint256 m_spent_amounts_single_hash
uint256 m_spent_scripts_single_hash
bool m_spent_outputs_ready
Whether m_spent_outputs is initialized.
uint256 m_outputs_single_hash
std::vector< CTxOut > m_spent_outputs
constexpr auto Ticks(Dur2 d)
Helper to count the seconds of a duration/time_point.