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");
69 if (vchPubKey[0] == 0x04) {
74 }
else if (vchPubKey[0] == 0x02 || vchPubKey[0] == 0x03) {
91 if (vchPubKey[0] != 0x02 && vchPubKey[0] != 0x03) {
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;
138 unsigned int lenS = sig[5 + lenR];
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;
180 std::vector<unsigned char> vchSigCopy(vchSig.begin(), vchSig.begin() + vchSig.size() - 1);
191 if (vchSig.size() == 0) {
204 if (vchSig.size() == 0) {
240 while (
static_cast<size_t>(end - pc) >= b.
size() && std::equal(b.
begin(), b.
end(), pc))
247 while (
script.GetOp(pc, opcode));
251 script = std::move(result);
273class ConditionStack {
276 static constexpr uint32_t NO_FALSE = std::numeric_limits<uint32_t>::max();
279 uint32_t m_stack_size = 0;
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;
326 CScript scriptCode(pbegincodehash, pend);
357 success = !sig.empty();
367 if (pubkey.size() == 0) {
369 }
else if (pubkey.size() == 32) {
394 switch (sigversion) {
413 static const valtype vchFalse(0);
415 static const valtype vchTrue(1, 1);
425 ConditionStack vfExec;
426 std::vector<valtype> altstack;
433 uint32_t opcode_pos = 0;
439 for (; pc < pend; ++opcode_pos) {
440 bool fExec = vfExec.all_true();
445 if (!
script.GetOp(pc, opcode, vchPushValue))
482 stack.push_back(vchPushValue);
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)
633 vfExec.push_back(fValue);
657 if (stack.size() < 1)
679 if (stack.size() < 1)
688 if (altstack.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)
832 if (n < 0 || n >= (
int)stack.size())
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)
896 bool fEqual = (vch1 == vch2);
904 stack.push_back(fEqual ? vchTrue : vchFalse);
927 if (stack.size() < 1)
932 case OP_1ADD: bn += bnOne;
break;
933 case OP_1SUB: bn -= bnOne;
break;
935 case OP_ABS:
if (bn < bnZero) bn = -bn;
break;
936 case OP_NOT: bn = (bn == bnZero);
break;
938 default:
assert(!
"invalid opcode");
break;
941 stack.push_back(bn.
getvch());
960 if (stack.size() < 2)
975 case OP_BOOLAND: bn = (bn1 != bnZero && bn2 != bnZero);
break;
976 case OP_BOOLOR: bn = (bn1 != bnZero || bn2 != bnZero);
break;
984 case OP_MIN: bn = (bn1 < bn2 ? bn1 : bn2);
break;
985 case OP_MAX: bn = (bn1 > bn2 ? bn1 : bn2);
break;
986 default:
assert(!
"invalid opcode");
break;
990 stack.push_back(bn.
getvch());
1005 if (stack.size() < 3)
1010 bool fValue = (bn2 <= bn1 && bn1 < bn3);
1014 stack.push_back(fValue ? vchTrue : vchFalse);
1029 if (stack.size() < 1)
1044 stack.push_back(vchHash);
1054 pbegincodehash = pc;
1063 if (stack.size() < 2)
1069 bool fSuccess =
true;
1070 if (!
EvalChecksig(vchSig, vchPubKey, pbegincodehash, pend, execdata,
flags, checker, sigversion, serror, fSuccess))
return false;
1073 stack.push_back(fSuccess ? vchTrue : vchFalse);
1096 bool success =
true;
1097 if (!
EvalChecksig(sig, pubkey, pbegincodehash, pend, execdata,
flags, checker, sigversion, serror, success))
return false;
1101 stack.push_back((num + (success ? 1 : 0)).getvch());
1113 if ((
int)stack.size() < i)
1119 nOpCount += nKeysCount;
1125 int ikey2 = nKeysCount + 2;
1127 if ((
int)stack.size() < i)
1131 if (nSigsCount < 0 || nSigsCount > nKeysCount)
1135 if ((
int)stack.size() < i)
1139 CScript scriptCode(pbegincodehash, pend);
1142 for (
int k = 0;
k < nSigsCount;
k++)
1152 bool fSuccess =
true;
1153 while (fSuccess && nSigsCount > 0)
1179 if (nSigsCount > nKeysCount)
1199 if (stack.size() < 1)
1205 stack.push_back(fSuccess ? vchTrue : vchFalse);
1235 if (!vfExec.empty())
1238 return set_success(serror);
1254class CTransactionSignatureSerializer
1259 const unsigned int nIn;
1260 const bool fAnyoneCanPay;
1264 const bool fHashSingle;
1265 const bool fHashNone;
1269 CTransactionSignatureSerializer(
const T& txToIn,
const CScript& scriptCodeIn,
unsigned int nInIn,
int nHashTypeIn) :
1270 txTo(txToIn), scriptCode(scriptCodeIn), nIn(nInIn),
1276 template<
typename S>
1277 void SerializeScriptCode(
S &
s)
const {
1281 unsigned int nCodeSeparators = 0;
1282 while (scriptCode.
GetOp(it, opcode)) {
1288 while (scriptCode.
GetOp(it, opcode)) {
1290 s.write(std::as_bytes(std::span{&itBegin[0], size_t(it - itBegin - 1)}));
1294 if (itBegin != scriptCode.
end())
1295 s.write(std::as_bytes(std::span{&itBegin[0],
size_t(it - itBegin)}));
1299 template<
typename S>
1300 void SerializeInput(
S &
s,
unsigned int nInput)
const {
1311 SerializeScriptCode(
s);
1313 if (nInput != nIn && (fHashSingle || fHashNone))
1321 template<
typename S>
1322 void SerializeOutput(
S &
s,
unsigned int nOutput)
const {
1323 if (fHashSingle && nOutput != nIn)
1331 template<
typename S>
1336 unsigned int nInputs = fAnyoneCanPay ? 1 : txTo.vin.size();
1338 for (
unsigned int nInput = 0; nInput < nInputs; nInput++)
1339 SerializeInput(
s, nInput);
1341 unsigned int nOutputs = fHashNone ? 0 : (fHashSingle ? nIn+1 : txTo.vout.size());
1343 for (
unsigned int nOutput = 0; nOutput < nOutputs; nOutput++)
1344 SerializeOutput(
s, nOutput);
1352uint256 GetPrevoutsSHA256(
const T& txTo)
1355 for (
const auto& txin : txTo.vin) {
1363uint256 GetSequencesSHA256(
const T& txTo)
1366 for (
const auto& txin : txTo.vin) {
1367 ss << txin.nSequence;
1374uint256 GetOutputsSHA256(
const T& txTo)
1377 for (
const auto& txout : txTo.vout) {
1384uint256 GetSpentAmountsSHA256(
const std::vector<CTxOut>& outputs_spent)
1387 for (
const auto& txout : outputs_spent) {
1394uint256 GetSpentScriptsSHA256(
const std::vector<CTxOut>& outputs_spent)
1397 for (
const auto& txout : outputs_spent) {
1398 ss << txout.scriptPubKey;
1418 bool uses_bip143_segwit = force;
1419 bool uses_bip341_taproot = force;
1420 for (
size_t inpos = 0; inpos < txTo.vin.size() && !(uses_bip143_segwit && uses_bip341_taproot); ++inpos) {
1421 if (!txTo.vin[inpos].scriptWitness.IsNull()) {
1428 uses_bip341_taproot =
true;
1433 uses_bip143_segwit =
true;
1436 if (uses_bip341_taproot && uses_bip143_segwit)
break;
1439 if (uses_bip143_segwit || uses_bip341_taproot) {
1445 if (uses_bip143_segwit) {
1483 assert(!
"Unknown MissingDataBehavior value");
1489 uint8_t ext_flag, key_version;
1490 switch (sigversion) {
1506 assert(in_pos < tx_to.vin.size());
1514 static constexpr uint8_t EPOCH = 0;
1520 if (!(hash_type <= 0x03 || (hash_type >= 0x81 && hash_type <= 0x83)))
return false;
1524 ss << tx_to.version;
1525 ss << tx_to.nLockTime;
1539 const uint8_t spend_type = (ext_flag << 1) + (have_annex ? 1 : 0);
1542 ss << tx_to.vin[in_pos].prevout;
1544 ss << tx_to.vin[in_pos].nSequence;
1554 if (in_pos >= tx_to.vout.size())
return false;
1557 sha_single_output << tx_to.vout[in_pos];
1572 hash_out = ss.GetSHA256();
1587 auto& entry = m_cache_entries[CacheIndex(hash_type)];
1588 if (entry.has_value()) {
1589 if (script_code == entry->first) {
1599 auto& entry = m_cache_entries[CacheIndex(hash_type)];
1600 entry.emplace(script_code, writer);
1606 assert(nIn < txTo.vin.size());
1611 if (nIn >= txTo.vout.size()) {
1621 if (sighash_cache && sighash_cache->
Load(nHashType, scriptCode, ss)) {
1643 }
else if ((nHashType & 0x1f) ==
SIGHASH_SINGLE && nIn < txTo.vout.size()) {
1645 inner_ss << txTo.vout[nIn];
1646 hashOutputs = inner_ss.GetHash();
1657 ss << txTo.vin[nIn].prevout;
1660 ss << txTo.vin[nIn].nSequence;
1664 ss << txTo.nLockTime;
1667 CTransactionSignatureSerializer<T> txTmp(txTo, scriptCode, nIn, nHashType);
1674 if (sighash_cache !=
nullptr) {
1675 sighash_cache->
Store(nHashType, scriptCode, ss);
1680 return ss.GetHash();
1686 return pubkey.
Verify(sighash, vchSig);
1703 std::vector<unsigned char> vchSig(vchSigIn);
1706 int nHashType = vchSig.back();
1712 uint256 sighash =
SignatureHash(scriptCode, *txTo, nIn, nHashType, amount, sigversion, this->txdata, &m_sighash_cache);
1714 if (!VerifyECDSASignature(vchSig, pubkey, sighash))
1725 assert(pubkey_in.size() == 32);
1735 if (sig.size() == 65) {
1741 if (!
SignatureHashSchnorr(sighash, execdata, *txTo, nIn, hashtype, sigversion, *this->txdata, m_mdb)) {
1766 if (nLockTime > (int64_t)txTo->nLockTime)
1790 const int64_t txToSequence = (int64_t)txTo->vin[nIn].nSequence;
1794 if (txTo->version < 2)
1807 const int64_t txToSequenceMasked = txToSequence & nLockTimeMask;
1808 const CScriptNum nSequenceMasked = nSequence & nLockTimeMask;
1826 if (nSequenceMasked > txToSequenceMasked)
1838 std::vector<valtype> stack{stack_span.begin(), stack_span.end()};
1843 while (pc < exec_script.
end()) {
1845 if (!exec_script.
GetOp(pc, opcode)) {
1854 return set_success(serror);
1863 for (
const valtype& elem : stack) {
1868 if (!
EvalScript(stack, exec_script,
flags, checker, sigversion, execdata, serror))
return false;
1884 if (std::lexicographical_compare(a.begin(), a.end(), b.begin(), b.end())) {
1885 ss_branch << a << b;
1887 ss_branch << b << a;
1900 for (
int i = 0; i < path_len; ++i) {
1918 return q.CheckTapTweak(p, merkle_root, control[0] & 1);
1924 std::span stack{witness.
stack};
1927 if (witversion == 0) {
1930 if (stack.size() == 0) {
1934 exec_script =
CScript(script_bytes.begin(), script_bytes.end());
1937 if (memcmp(hash_exec_script.
begin(), program.data(), 32)) {
1943 if (stack.size() != 2) {
1955 if (stack.size() >= 2 && !stack.back().empty() && stack.back()[0] ==
ANNEX_TAG) {
1964 if (stack.size() == 1) {
1969 return set_success(serror);
1992 return set_success(serror);
2009 if (witness ==
nullptr) {
2010 witness = &emptyWitness;
2012 bool hadWitness =
false;
2022 std::vector<std::vector<unsigned char> > stack, stackCopy;
2038 std::vector<unsigned char> witnessprogram;
2042 if (scriptSig.
size() != 0) {
2063 swap(stack, stackCopy);
2070 const valtype& pubKeySerialized = stack.back();
2071 CScript pubKey2(pubKeySerialized.begin(), pubKeySerialized.end());
2086 if (scriptSig !=
CScript() << std::vector<unsigned char>(pubKey2.
begin(), pubKey2.
end())) {
2109 if (stack.size() != 1) {
2119 if (!hadWitness && !witness->
IsNull()) {
2124 return set_success(serror);
2129 if (witversion == 0) {
2151 std::vector<unsigned char> witnessprogram;
2153 return WitnessSigOps(witnessversion, witnessprogram, witness);
2158 std::vector<unsigned char>
data;
2159 while (pc < scriptSig.
end()) {
2165 return WitnessSigOps(witnessversion, witnessprogram, witness);
2174#define FLAG_NAME(flag) {std::string(#flag), SCRIPT_VERIFY_##flag}
2175 static const std::map<std::string, script_verify_flag_name> g_names_to_enum{
2190 FLAG_NAME(DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM),
2194 FLAG_NAME(DISCOURAGE_UPGRADABLE_PUBKEYTYPE),
2196 FLAG_NAME(DISCOURAGE_UPGRADABLE_TAPROOT_VERSION),
2199 return g_names_to_enum;
2204 std::vector<std::string> res;
2210 if ((
flags & flag) != 0) {
2211 res.push_back(
name);
2215 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
unsigned int GetSigOpCount(bool fAccurate) const
Pre-version-0.6, Bitcoin always counted CHECKMULTISIGs as 20 sigops.
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
std::vector< unsigned char > getvch() 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 GetHash()
Compute the double-SHA256 hash of all data written to this object.
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()
constexpr unsigned char * begin()
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).
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
std::optional< uint256 > m_output_hash
The hash of the corresponding output.
uint256 m_tapleaf_hash
The tapleaf hash.
uint256 m_annex_hash
Hash of the annex data.
int64_t m_validation_weight_left
How much validation weight is left (decremented for every successful non-empty signature check).
bool m_annex_present
Whether an annex is present.
bool m_annex_init
Whether m_annex_present and (when needed) m_annex_hash are initialized.
bool m_codeseparator_pos_init
Whether m_codeseparator_pos is initialized.
bool m_tapleaf_hash_init
Whether m_tapleaf_hash is initialized.
bool m_validation_weight_left_init
Whether m_validation_weight_left is initialized.
uint32_t m_codeseparator_pos
Opcode position of the last executed OP_CODESEPARATOR (or 0xFFFFFFFF if none executed).