26typedef std::vector<unsigned char>
valtype;
48 for (
unsigned int i = 0; i < vch.size(); i++)
53 if (i == vch.size()-1 && vch[i] == 0x80)
65#define stacktop(i) (stack.at(size_t(int64_t(stack.size()) + int64_t{i})))
66#define altstacktop(i) (altstack.at(size_t(int64_t(altstack.size()) + int64_t{i})))
67static inline void popstack(std::vector<valtype>& stack)
70 throw std::runtime_error(
"popstack(): stack empty");
132 if (sig.size() < 9)
return false;
133 if (sig.size() > 73)
return false;
136 if (sig[0] != 0x30)
return false;
139 if (sig[1] != sig.size() - 3)
return false;
142 unsigned int lenR = sig[3];
145 if (5 +
lenR >= sig.size())
return false;
152 if ((
size_t)(
lenR +
lenS + 7) != sig.size())
return false;
155 if (sig[2] != 0x02)
return false;
158 if (
lenR == 0)
return false;
161 if (sig[4] & 0x80)
return false;
165 if (
lenR > 1 && (sig[4] == 0x00) && !(sig[5] & 0x80))
return false;
168 if (sig[
lenR + 4] != 0x02)
return false;
171 if (
lenS == 0)
return false;
174 if (sig[
lenR + 6] & 0x80)
return false;
178 if (
lenS > 1 && (sig[
lenR + 6] == 0x00) && !(sig[
lenR + 7] & 0x80))
return false;
250 while (
static_cast<size_t>(end -
pc) >= b.
size() && std::equal(b.
begin(), b.
end(),
pc))
261 script = std::move(result);
283class ConditionStack {
286 static constexpr uint32_t NO_FALSE = std::numeric_limits<uint32_t>::max();
291 uint32_t m_first_false_pos = NO_FALSE;
294 bool empty()
const {
return m_stack_size == 0; }
295 bool all_true()
const {
return m_first_false_pos == NO_FALSE; }
296 void push_back(
bool f)
298 if (m_first_false_pos == NO_FALSE && !
f) {
301 m_first_false_pos = m_stack_size;
309 if (m_first_false_pos == m_stack_size) {
311 m_first_false_pos = NO_FALSE;
317 if (m_first_false_pos == NO_FALSE) {
319 m_first_false_pos = m_stack_size - 1;
320 }
else if (m_first_false_pos == m_stack_size - 1) {
322 m_first_false_pos = NO_FALSE;
367 success = !sig.empty();
373 if (
execdata.m_validation_weight_left < 0) {
377 if (pubkey.size() == 0) {
379 }
else if (pubkey.size() == 32) {
444 execdata.m_codeseparator_pos = 0xFFFFFFFFUL;
445 execdata.m_codeseparator_pos_init =
true;
519 stack.push_back(
bn.getvch());
539 if (stack.size() < 1)
578 if (stack.size() < 1)
620 if (stack.size() < 1)
627 if (vch.size() > 1 || (vch.size() == 1 && vch[0] != 1)) {
635 if (vch.size() == 1 && vch[0] != 1)
667 if (stack.size() < 1)
689 if (stack.size() < 1)
708 if (stack.size() < 2)
718 if (stack.size() < 2)
722 stack.push_back(
vch1);
723 stack.push_back(
vch2);
730 if (stack.size() < 3)
735 stack.push_back(
vch1);
736 stack.push_back(
vch2);
737 stack.push_back(
vch3);
744 if (stack.size() < 4)
748 stack.push_back(
vch1);
749 stack.push_back(
vch2);
756 if (stack.size() < 6)
760 stack.erase(stack.end()-6, stack.end()-4);
761 stack.push_back(
vch1);
762 stack.push_back(
vch2);
769 if (stack.size() < 4)
779 if (stack.size() < 1)
783 stack.push_back(vch);
791 stack.push_back(
bn.getvch());
798 if (stack.size() < 1)
807 if (stack.size() < 1)
810 stack.push_back(vch);
817 if (stack.size() < 2)
819 stack.erase(stack.end() - 2);
826 if (stack.size() < 2)
829 stack.push_back(vch);
838 if (stack.size() < 2)
846 stack.erase(stack.end()-n-1);
847 stack.push_back(vch);
856 if (stack.size() < 3)
866 if (stack.size() < 2)
875 if (stack.size() < 2)
878 stack.insert(stack.end()-2, vch);
886 if (stack.size() < 1)
889 stack.push_back(
bn.getvch());
902 if (stack.size() < 2)
937 if (stack.size() < 1)
948 default:
assert(!
"invalid opcode");
break;
951 stack.push_back(
bn.getvch());
970 if (stack.size() < 2)
996 default:
assert(!
"invalid opcode");
break;
1000 stack.push_back(
bn.getvch());
1015 if (stack.size() < 3)
1039 if (stack.size() < 1)
1073 if (stack.size() < 2)
1106 bool success =
true;
1111 stack.push_back((num + (success ? 1 : 0)).getvch());
1123 if ((
int)stack.size() < i)
1137 if ((
int)stack.size() < i)
1145 if ((
int)stack.size() < i)
1209 if (stack.size() < 1)
1264class CTransactionSignatureSerializer
1269 const unsigned int nIn;
1270 const bool fAnyoneCanPay;
1271 const bool fHashSingle;
1272 const bool fHashNone;
1282 template<
typename S>
1305 template<
typename S>
1319 if (
nInput != nIn && (fHashSingle || fHashNone))
1323 ::Serialize(s, txTo.vin[
nInput].nSequence);
1327 template<
typename S>
1329 if (fHashSingle &&
nOutput != nIn)
1333 ::Serialize(s, txTo.vout[
nOutput]);
1337 template<
typename S>
1342 unsigned int nInputs = fAnyoneCanPay ? 1 : txTo.vin.size();
1347 unsigned int nOutputs = fHashNone ? 0 : (fHashSingle ? nIn+1 : txTo.vout.size());
1361 for (
const auto&
txin : txTo.vin) {
1364 return ss.GetSHA256();
1372 for (
const auto&
txin : txTo.vin) {
1375 return ss.GetSHA256();
1383 for (
const auto& txout : txTo.vout) {
1386 return ss.GetSHA256();
1396 return ss.GetSHA256();
1404 ss << txout.scriptPubKey;
1406 return ss.GetSHA256();
1427 if (!txTo.vin[
inpos].scriptWitness.IsNull()) {
1489 assert(!
"Unknown MissingDataBehavior value");
1593 auto& entry = m_cache_entries[CacheIndex(
hash_type)];
1594 if (entry.has_value()) {
1605 auto& entry = m_cache_entries[CacheIndex(
hash_type)];
1612 assert(nIn < txTo.vin.size());
1617 if (nIn >= txTo.vout.size()) {
1630 return ss.GetHash();
1663 ss << txTo.vin[nIn].prevout;
1666 ss << txTo.vin[nIn].nSequence;
1670 ss << txTo.nLockTime;
1686 return ss.GetHash();
1741 if (sig.size() == 65) {
1772 if (nLockTime > (
int64_t)txTo->nLockTime)
1800 if (txTo->version < 2)
1890 if (std::lexicographical_compare(
a.begin(),
a.end(), b.begin(), b.end())) {
1906 for (
int i = 0; i <
path_len; ++i) {
1924 return q.CheckTapTweak(
p, merkle_root,
control[0] & 1);
1930 std::span stack{witness.
stack};
1936 if (stack.size() == 0) {
1949 if (stack.size() != 2) {
1961 if (stack.size() >= 2 && !stack.back().empty() && stack.back()[0] ==
ANNEX_TAG) {
1970 if (stack.size() == 1) {
1987 execdata.m_tapleaf_hash_init =
true;
1992 execdata.m_validation_weight_left_init =
true;
2015 if (witness ==
nullptr) {
2028 std::vector<std::vector<unsigned char> > stack,
stackCopy;
2048 if (scriptSig.
size() != 0) {
2115 if (stack.size() != 1) {
2164 std::vector<unsigned char>
data;
2165 while (
pc < scriptSig.
end()) {
2180#define FLAG_NAME(flag) {std::string(#flag), SCRIPT_VERIFY_##flag}
2181 static const std::map<std::string, script_verify_flag_name>
g_names_to_enum{
2210 std::vector<std::string>
res;
2216 if ((
flags & flag) != 0) {
2221 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 constexpr uint32_t SEQUENCE_FINAL
Setting nSequence to this value for every input in a transaction disables nLockTime/IsFinalTx().
static constexpr 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...
static constexpr uint32_t SEQUENCE_LOCKTIME_MASK
If CTxIn::nSequence encodes a relative lock-time, this mask is applied to extract that lock-time from...
static constexpr uint32_t SEQUENCE_LOCKTIME_DISABLE_FLAG
If this flag is set, CTxIn::nSequence is NOT interpreted as a relative lock-time.
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
static const PrecomputedData data
Precomputed COutPoint and CCoins values.
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.
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.
constexpr uint8_t TAPROOT_LEAF_MASK
constexpr uint8_t TAPROOT_LEAF_TAPSCRIPT
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.
constexpr size_t TAPROOT_CONTROL_NODE_SIZE
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.
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
constexpr script_verify_flags SCRIPT_VERIFY_NONE
Script verification flags.
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.
constexpr int64_t VALIDATION_WEIGHT_PER_SIGOP_PASSED
constexpr int MAX_SCRIPT_SIZE
opcodetype
Script opcodes.
constexpr unsigned int MAX_SCRIPT_ELEMENT_SIZE
constexpr int MAX_PUBKEYS_PER_MULTISIG
constexpr int MAX_STACK_SIZE
constexpr int64_t VALIDATION_WEIGHT_OFFSET
constexpr unsigned int LOCKTIME_THRESHOLD
constexpr int MAX_OPS_PER_SCRIPT
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.