Branch data Line data Source code
1 : : // Copyright (c) 2009-2010 Satoshi Nakamoto
2 : : // Copyright (c) 2009-present The Bitcoin Core developers
3 : : // Distributed under the MIT software license, see the accompanying
4 : : // file COPYING or http://www.opensource.org/licenses/mit-license.php.
5 : :
6 : : #include <script/interpreter.h>
7 : :
8 : : #include <crypto/ripemd160.h>
9 : : #include <crypto/sha1.h>
10 : : #include <crypto/sha256.h>
11 : : #include <pubkey.h>
12 : : #include <script/script.h>
13 : : #include <tinyformat.h>
14 : : #include <uint256.h>
15 : :
16 : : typedef std::vector<unsigned char> valtype;
17 : :
18 : : namespace {
19 : :
20 : 2056477 : inline bool set_success(ScriptError* ret)
21 : : {
22 : 2056477 : if (ret)
23 : 1770768 : *ret = SCRIPT_ERR_OK;
24 : : return true;
25 : : }
26 : :
27 : 2855348 : inline bool set_error(ScriptError* ret, const ScriptError serror)
28 : : {
29 [ - - - - : 771 : if (ret)
- - - + +
- + - + -
+ - ]
30 : 2338377 : *ret = serror;
31 : 2562444 : return false;
32 : : }
33 : :
34 : : } // namespace
35 : :
36 : 832165 : bool CastToBool(const valtype& vch)
37 : : {
38 [ - + + + ]: 838286 : for (unsigned int i = 0; i < vch.size(); i++)
39 : : {
40 [ + + ]: 788825 : if (vch[i] != 0)
41 : : {
42 : : // Can be negative zero
43 [ + + + + ]: 782704 : if (i == vch.size()-1 && vch[i] == 0x80)
44 : : return false;
45 : 782447 : return true;
46 : : }
47 : : }
48 : : return false;
49 : : }
50 : :
51 : : /**
52 : : * Script is a stack machine (like Forth) that evaluates a predicate
53 : : * returning a bool indicating valid or not. There are no loops.
54 : : */
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})))
57 : 4630102 : static inline void popstack(std::vector<valtype>& stack)
58 : : {
59 [ - + ]: 4630102 : if (stack.empty())
60 [ # # ]: 0 : throw std::runtime_error("popstack(): stack empty");
61 : 4630102 : stack.pop_back();
62 : 4630102 : }
63 : :
64 : 70326 : bool static IsCompressedOrUncompressedPubKey(const valtype &vchPubKey) {
65 [ - + + + ]: 70326 : if (vchPubKey.size() < CPubKey::COMPRESSED_SIZE) {
66 : : // Non-canonical public key: too short
67 : : return false;
68 : : }
69 [ + + ]: 69979 : if (vchPubKey[0] == 0x04) {
70 [ - + ]: 5893 : if (vchPubKey.size() != CPubKey::SIZE) {
71 : : // Non-canonical public key: invalid length for uncompressed key
72 : 0 : return false;
73 : : }
74 [ + + + + ]: 64086 : } else if (vchPubKey[0] == 0x02 || vchPubKey[0] == 0x03) {
75 [ - + ]: 62897 : if (vchPubKey.size() != CPubKey::COMPRESSED_SIZE) {
76 : : // Non-canonical public key: invalid length for compressed key
77 : 0 : return false;
78 : : }
79 : : } else {
80 : : // Non-canonical public key: neither compressed nor uncompressed
81 : : return false;
82 : : }
83 : : return true;
84 : : }
85 : :
86 : 42382 : bool static IsCompressedPubKey(const valtype &vchPubKey) {
87 [ - + + + ]: 42382 : if (vchPubKey.size() != CPubKey::COMPRESSED_SIZE) {
88 : : // Non-canonical public key: invalid length for compressed key
89 : : return false;
90 : : }
91 [ + + - + ]: 35132 : if (vchPubKey[0] != 0x02 && vchPubKey[0] != 0x03) {
92 : : // Non-canonical public key: invalid prefix for compressed key
93 : 0 : return false;
94 : : }
95 : : return true;
96 : : }
97 : :
98 : : /**
99 : : * A canonical signature exists of: <30> <total len> <02> <len R> <R> <02> <len S> <S> <hashtype>
100 : : * Where R and S are not negative (their first byte has its highest bit not set), and not
101 : : * excessively padded (do not start with a 0 byte, unless an otherwise negative number follows,
102 : : * in which case a single 0 byte is necessary and even required).
103 : : *
104 : : * See https://bitcointalk.org/index.php?topic=8392.msg127623#msg127623
105 : : *
106 : : * This function is consensus-critical since BIP66.
107 : : */
108 : 224896 : bool static IsValidSignatureEncoding(const std::vector<unsigned char> &sig) {
109 : : // Format: 0x30 [total-length] 0x02 [R-length] [R] 0x02 [S-length] [S] [sighash]
110 : : // * total-length: 1-byte length descriptor of everything that follows,
111 : : // excluding the sighash byte.
112 : : // * R-length: 1-byte length descriptor of the R value that follows.
113 : : // * R: arbitrary-length big-endian encoded R value. It must use the shortest
114 : : // possible encoding for a positive integer (which means no null bytes at
115 : : // the start, except a single one when the next byte has its highest bit set).
116 : : // * S-length: 1-byte length descriptor of the S value that follows.
117 : : // * S: arbitrary-length big-endian encoded S value. The same rules apply.
118 : : // * sighash: 1-byte value indicating what data is hashed (not part of the DER
119 : : // signature)
120 : :
121 : : // Minimum and maximum size constraints.
122 [ - + + + ]: 224896 : if (sig.size() < 9) return false;
123 [ + + ]: 223945 : if (sig.size() > 73) return false;
124 : :
125 : : // A signature is of type 0x30 (compound).
126 [ + + ]: 223802 : if (sig[0] != 0x30) return false;
127 : :
128 : : // Make sure the length covers the entire signature.
129 [ + + ]: 222292 : if (sig[1] != sig.size() - 3) return false;
130 : :
131 : : // Extract the length of the R element.
132 : 212990 : unsigned int lenR = sig[3];
133 : :
134 : : // Make sure the length of the S element is still inside the signature.
135 [ + + ]: 212990 : if (5 + lenR >= sig.size()) return false;
136 : :
137 : : // Extract the length of the S element.
138 [ + + ]: 212849 : unsigned int lenS = sig[5 + lenR];
139 : :
140 : : // Verify that the length of the signature matches the sum of the length
141 : : // of the elements.
142 [ + + ]: 212849 : if ((size_t)(lenR + lenS + 7) != sig.size()) return false;
143 : :
144 : : // Check whether the R element is an integer.
145 [ + + ]: 212714 : if (sig[2] != 0x02) return false;
146 : :
147 : : // Zero-length integers are not allowed for R.
148 [ + + ]: 212573 : if (lenR == 0) return false;
149 : :
150 : : // Negative numbers are not allowed for R.
151 [ + + ]: 212448 : if (sig[4] & 0x80) return false;
152 : :
153 : : // Null bytes at the start of R are not allowed, unless R would
154 : : // otherwise be interpreted as a negative number.
155 [ + + + + : 209986 : if (lenR > 1 && (sig[4] == 0x00) && !(sig[5] & 0x80)) return false;
+ + ]
156 : :
157 : : // Check whether the S element is an integer.
158 [ + + ]: 208968 : if (sig[lenR + 4] != 0x02) return false;
159 : :
160 : : // Zero-length integers are not allowed for S.
161 [ + + ]: 208850 : if (lenS == 0) return false;
162 : :
163 : : // Negative numbers are not allowed for S.
164 [ + + ]: 208718 : if (sig[lenR + 6] & 0x80) return false;
165 : :
166 : : // Null bytes at the start of S are not allowed, unless S would otherwise be
167 : : // interpreted as a negative number.
168 [ + + + + : 208515 : if (lenS > 1 && (sig[lenR + 6] == 0x00) && !(sig[lenR + 7] & 0x80)) return false;
+ + ]
169 : :
170 : : return true;
171 : : }
172 : :
173 : 62136 : bool static IsLowDERSignature(const valtype &vchSig, ScriptError* serror) {
174 [ - + ]: 62136 : if (!IsValidSignatureEncoding(vchSig)) {
175 [ - - ]: 62136 : return set_error(serror, SCRIPT_ERR_SIG_DER);
176 : : }
177 : : // https://bitcoin.stackexchange.com/a/12556:
178 : : // Also note that inside transaction signatures, an extra hashtype byte
179 : : // follows the actual signature data.
180 [ - + ]: 62136 : std::vector<unsigned char> vchSigCopy(vchSig.begin(), vchSig.begin() + vchSig.size() - 1);
181 : : // If the S value is above the order of the curve divided by two, its
182 : : // complement modulo the order could have been used instead, which is
183 : : // one byte shorter when encoded correctly.
184 [ + - + + ]: 62136 : if (!CPubKey::CheckLowS(vchSigCopy)) {
185 [ + - ]: 62489 : return set_error(serror, SCRIPT_ERR_SIG_HIGH_S);
186 : : }
187 : : return true;
188 : 62136 : }
189 : :
190 : 65160 : bool static IsDefinedHashtypeSignature(const valtype &vchSig) {
191 [ - + + - ]: 65160 : if (vchSig.size() == 0) {
192 : : return false;
193 : : }
194 [ + + ]: 65160 : unsigned char nHashType = vchSig[vchSig.size() - 1] & (~(SIGHASH_ANYONECANPAY));
195 [ + + ]: 65160 : if (nHashType < SIGHASH_ALL || nHashType > SIGHASH_SINGLE)
196 : 604 : return false;
197 : :
198 : : return true;
199 : : }
200 : :
201 : 220132 : bool CheckSignatureEncoding(const std::vector<unsigned char> &vchSig, script_verify_flags flags, ScriptError* serror) {
202 : : // Empty signature. Not strictly DER encoded, but allowed to provide a
203 : : // compact way to provide an invalid signature for use with CHECK(MULTI)SIG
204 [ - + + + ]: 220132 : if (vchSig.size() == 0) {
205 : : return true;
206 : : }
207 [ + + + + ]: 200266 : if ((flags & (SCRIPT_VERIFY_DERSIG | SCRIPT_VERIFY_LOW_S | SCRIPT_VERIFY_STRICTENC)) != 0 && !IsValidSignatureEncoding(vchSig)) {
208 [ + + ]: 16660 : return set_error(serror, SCRIPT_ERR_SIG_DER);
209 [ + + + + ]: 183606 : } else if ((flags & SCRIPT_VERIFY_LOW_S) != 0 && !IsLowDERSignature(vchSig, serror)) {
210 : : // serror is set
211 : : return false;
212 [ + + + + ]: 183253 : } else if ((flags & SCRIPT_VERIFY_STRICTENC) != 0 && !IsDefinedHashtypeSignature(vchSig)) {
213 [ + + ]: 604 : return set_error(serror, SCRIPT_ERR_SIG_HASHTYPE);
214 : : }
215 : : return true;
216 : : }
217 : :
218 : 201278 : bool static CheckPubKeyEncoding(const valtype &vchPubKey, script_verify_flags flags, const SigVersion &sigversion, ScriptError* serror) {
219 [ + + + + ]: 201278 : if ((flags & SCRIPT_VERIFY_STRICTENC) != 0 && !IsCompressedOrUncompressedPubKey(vchPubKey)) {
220 [ + - ]: 1536 : return set_error(serror, SCRIPT_ERR_PUBKEYTYPE);
221 : : }
222 : : // Only compressed keys are accepted in segwit
223 [ + + + + : 199742 : if ((flags & SCRIPT_VERIFY_WITNESS_PUBKEYTYPE) != 0 && sigversion == SigVersion::WITNESS_V0 && !IsCompressedPubKey(vchPubKey)) {
+ + ]
224 [ + - ]: 7250 : return set_error(serror, SCRIPT_ERR_WITNESS_PUBKEYTYPE);
225 : : }
226 : : return true;
227 : : }
228 : :
229 : 230243 : int FindAndDelete(CScript& script, const CScript& b)
230 : : {
231 : 230243 : int nFound = 0;
232 [ + + + + ]: 355316 : if (b.empty())
233 : : return nFound;
234 : 230242 : CScript result;
235 [ + + + + ]: 690726 : CScript::const_iterator pc = script.begin(), pc2 = script.begin(), end = script.end();
236 : 2657339 : opcodetype opcode;
237 : 2657339 : do
238 : : {
239 : 2657339 : result.insert(result.end(), pc2, pc);
240 [ + + + + : 5282627 : while (static_cast<size_t>(end - pc) >= b.size() && std::equal(b.begin(), b.end(), pc))
+ + + + ]
241 : : {
242 : 26045 : pc = pc + b.size();
243 : 26045 : ++nFound;
244 : : }
245 : 2657339 : pc2 = pc;
246 : : }
247 [ + - + + ]: 2657339 : while (script.GetOp(pc, opcode));
248 : :
249 [ + + ]: 230242 : if (nFound > 0) {
250 : 19631 : result.insert(result.end(), pc2, end);
251 : 19631 : script = std::move(result);
252 : : }
253 : :
254 : 230242 : return nFound;
255 : 230242 : }
256 : :
257 : : namespace {
258 : : /** A data type to abstract out the condition stack during script execution.
259 : : *
260 : : * Conceptually it acts like a vector of booleans, one for each level of nested
261 : : * IF/THEN/ELSE, indicating whether we're in the active or inactive branch of
262 : : * each.
263 : : *
264 : : * The elements on the stack cannot be observed individually; we only need to
265 : : * expose whether the stack is empty and whether or not any false values are
266 : : * present at all. To implement OP_ELSE, a toggle_top modifier is added, which
267 : : * flips the last value without returning it.
268 : : *
269 : : * This uses an optimized implementation that does not materialize the
270 : : * actual stack. Instead, it just stores the size of the would-be stack,
271 : : * and the position of the first false value in it.
272 : : */
273 : : class ConditionStack {
274 : : private:
275 : : //! A constant for m_first_false_pos to indicate there are no falses.
276 : : static constexpr uint32_t NO_FALSE = std::numeric_limits<uint32_t>::max();
277 : :
278 : : //! The size of the implied stack.
279 : : uint32_t m_stack_size = 0;
280 : : //! The position of the first false value on the implied stack, or NO_FALSE if all true.
281 : : uint32_t m_first_false_pos = NO_FALSE;
282 : :
283 : : public:
284 : 1697008 : bool empty() const { return m_stack_size == 0; }
285 : 7171380 : bool all_true() const { return m_first_false_pos == NO_FALSE; }
286 : 71581 : void push_back(bool f)
287 : : {
288 [ + + ]: 68255 : if (m_first_false_pos == NO_FALSE && !f) {
289 : : // The stack consists of all true values, and a false is added.
290 : : // The first false value will appear at the current size.
291 : 40122 : m_first_false_pos = m_stack_size;
292 : : }
293 : 71581 : ++m_stack_size;
294 : 71581 : }
295 : 53065 : void pop_back()
296 : : {
297 [ - + ]: 53065 : assert(m_stack_size > 0);
298 : 53065 : --m_stack_size;
299 [ + + ]: 53065 : if (m_first_false_pos == m_stack_size) {
300 : : // When popping off the first false value, everything becomes true.
301 : 20074 : m_first_false_pos = NO_FALSE;
302 : : }
303 : 53065 : }
304 : 57969 : void toggle_top()
305 : : {
306 [ - + ]: 57969 : assert(m_stack_size > 0);
307 [ + + ]: 57969 : if (m_first_false_pos == NO_FALSE) {
308 : : // The current stack is all true values; the first false will be the top.
309 : 18643 : m_first_false_pos = m_stack_size - 1;
310 [ + + ]: 39326 : } else if (m_first_false_pos == m_stack_size - 1) {
311 : : // The top is the first false value; toggling it will make everything true.
312 : 35529 : m_first_false_pos = NO_FALSE;
313 : : } else {
314 : : // There is a false value, but not on top. No action is needed as toggling
315 : : // anything but the first false value is unobservable.
316 : : }
317 : 57969 : }
318 : : };
319 : : }
320 : :
321 : 188209 : 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)
322 : : {
323 [ - + ]: 188209 : assert(sigversion == SigVersion::BASE || sigversion == SigVersion::WITNESS_V0);
324 : :
325 : : // Subset of script starting at the most recent codeseparator
326 : 188209 : CScript scriptCode(pbegincodehash, pend);
327 : :
328 : : // Drop the signature in pre-segwit scripts but not segwit scripts
329 [ + + ]: 188209 : if (sigversion == SigVersion::BASE) {
330 [ - + + - ]: 122630 : int found = FindAndDelete(scriptCode, CScript() << vchSig);
331 [ + + + + ]: 122630 : if (found > 0 && (flags & SCRIPT_VERIFY_CONST_SCRIPTCODE))
332 [ + - ]: 112 : return set_error(serror, SCRIPT_ERR_SIG_FINDANDDELETE);
333 : : }
334 : :
335 [ + - + + : 188097 : if (!CheckSignatureEncoding(vchSig, flags, serror) || !CheckPubKeyEncoding(vchPubKey, flags, sigversion, serror)) {
+ + ]
336 : : //serror is set
337 : 19227 : return false;
338 : : }
339 [ + - ]: 168870 : fSuccess = checker.CheckECDSASignature(vchSig, vchPubKey, scriptCode, sigversion);
340 : :
341 [ + + + + : 175939 : if (!fSuccess && (flags & SCRIPT_VERIFY_NULLFAIL) && vchSig.size())
+ + ]
342 [ + + ]: 189744 : return set_error(serror, SCRIPT_ERR_SIG_NULLFAIL);
343 : :
344 : : return true;
345 : 188209 : }
346 : :
347 : 128428 : static bool EvalChecksigTapscript(const valtype& sig, const valtype& pubkey, ScriptExecutionData& execdata, script_verify_flags flags, const BaseSignatureChecker& checker, SigVersion sigversion, ScriptError* serror, bool& success)
348 : : {
349 [ - + ]: 128428 : assert(sigversion == SigVersion::TAPSCRIPT);
350 : :
351 : : /*
352 : : * The following validation sequence is consensus critical. Please note how --
353 : : * upgradable public key versions precede other rules;
354 : : * the script execution fails when using empty signature with invalid public key;
355 : : * the script execution fails when using non-empty invalid signature.
356 : : */
357 : 128428 : success = !sig.empty();
358 [ + + ]: 128428 : if (success) {
359 : : // Implement the sigops/witnesssize ratio test.
360 : : // Passing with an upgradable public key version is also counted.
361 [ - + ]: 29056 : assert(execdata.m_validation_weight_left_init);
362 : 29056 : execdata.m_validation_weight_left -= VALIDATION_WEIGHT_PER_SIGOP_PASSED;
363 [ + + ]: 29056 : if (execdata.m_validation_weight_left < 0) {
364 [ + - ]: 48 : return set_error(serror, SCRIPT_ERR_TAPSCRIPT_VALIDATION_WEIGHT);
365 : : }
366 : : }
367 [ - + + + ]: 128380 : if (pubkey.size() == 0) {
368 [ + - ]: 12 : return set_error(serror, SCRIPT_ERR_PUBKEYTYPE);
369 [ + + ]: 128368 : } else if (pubkey.size() == 32) {
370 [ + + - + : 124707 : if (success && !checker.CheckSchnorrSignature(sig, pubkey, sigversion, execdata, serror)) {
+ + ]
371 : 413 : return false; // serror is set
372 : : }
373 : : } else {
374 : : /*
375 : : * New public key version softforks should be defined before this `else` block.
376 : : * Generally, the new code should not do anything but failing the script execution. To avoid
377 : : * consensus bugs, it should not modify any existing values (including `success`).
378 : : */
379 [ + + ]: 3661 : if ((flags & SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_PUBKEYTYPE) != 0) {
380 [ + - ]: 2 : return set_error(serror, SCRIPT_ERR_DISCOURAGE_UPGRADABLE_PUBKEYTYPE);
381 : : }
382 : : }
383 : :
384 : : return true;
385 : : }
386 : :
387 : : /** Helper for OP_CHECKSIG, OP_CHECKSIGVERIFY, and (in Tapscript) OP_CHECKSIGADD.
388 : : *
389 : : * A return value of false means the script fails entirely. When true is returned, the
390 : : * success variable indicates whether the signature check itself succeeded.
391 : : */
392 : 316637 : 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)
393 : : {
394 [ + + - ]: 316637 : switch (sigversion) {
395 : 188209 : case SigVersion::BASE:
396 : 188209 : case SigVersion::WITNESS_V0:
397 : 188209 : return EvalChecksigPreTapscript(sig, pubkey, pbegincodehash, pend, flags, checker, sigversion, serror, success);
398 : 128428 : case SigVersion::TAPSCRIPT:
399 : 128428 : return EvalChecksigTapscript(sig, pubkey, execdata, flags, checker, sigversion, serror, success);
400 : : case SigVersion::TAPROOT:
401 : : // Key path spending in Taproot has no script, so this is unreachable.
402 : : break;
403 : : }
404 : 0 : assert(false);
405 : : }
406 : :
407 : 1785170 : 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)
408 : : {
409 [ + + + + ]: 1785170 : static const CScriptNum bnZero(0);
410 [ + + + - ]: 1785170 : static const CScriptNum bnOne(1);
411 : : // static const CScriptNum bnFalse(0);
412 : : // static const CScriptNum bnTrue(1);
413 [ + + + + : 1786688 : static const valtype vchFalse(0);
+ - ]
414 : : // static const valtype vchZero(0);
415 [ + + + + : 1785630 : static const valtype vchTrue(1, 1);
+ - ]
416 : :
417 : : // sigversion cannot be TAPROOT here, as it admits no script execution.
418 [ + + - + ]: 1785170 : assert(sigversion == SigVersion::BASE || sigversion == SigVersion::WITNESS_V0 || sigversion == SigVersion::TAPSCRIPT);
419 : :
420 [ + + ]: 1785170 : CScript::const_iterator pc = script.begin();
421 : 1785170 : CScript::const_iterator pend = script.end();
422 [ + + ]: 1785170 : CScript::const_iterator pbegincodehash = script.begin();
423 : 1785170 : opcodetype opcode;
424 : 1785170 : valtype vchPushValue;
425 : 1785170 : ConditionStack vfExec;
426 : 1785170 : std::vector<valtype> altstack;
427 [ + + ]: 1785170 : set_error(serror, SCRIPT_ERR_UNKNOWN_ERROR);
428 [ + + + + : 1785170 : if ((sigversion == SigVersion::BASE || sigversion == SigVersion::WITNESS_V0) && script.size() > MAX_SCRIPT_SIZE) {
+ + ]
429 [ + - ]: 95 : return set_error(serror, SCRIPT_ERR_SCRIPT_SIZE);
430 : : }
431 : 1785075 : int nOpCount = 0;
432 : 1785075 : bool fRequireMinimal = (flags & SCRIPT_VERIFY_MINIMALDATA) != 0;
433 : 1785075 : uint32_t opcode_pos = 0;
434 : 1785075 : execdata.m_codeseparator_pos = 0xFFFFFFFFUL;
435 : 1785075 : execdata.m_codeseparator_pos_init = true;
436 : :
437 : 1785075 : try
438 : : {
439 [ + + ]: 8755420 : for (; pc < pend; ++opcode_pos) {
440 : 7171380 : bool fExec = vfExec.all_true();
441 : :
442 : : //
443 : : // Read instruction
444 : : //
445 [ + - + + ]: 7171380 : if (!script.GetOp(pc, opcode, vchPushValue))
446 [ + - ]: 275 : return set_error(serror, SCRIPT_ERR_BAD_OPCODE);
447 [ - + + + ]: 7171105 : if (vchPushValue.size() > MAX_SCRIPT_ELEMENT_SIZE)
448 [ + - ]: 567 : return set_error(serror, SCRIPT_ERR_PUSH_SIZE);
449 : :
450 [ + + ]: 7170538 : if (sigversion == SigVersion::BASE || sigversion == SigVersion::WITNESS_V0) {
451 : : // Note how OP_RESERVED does not count towards the opcode limit.
452 [ + + + + ]: 4505350 : if (opcode > OP_16 && ++nOpCount > MAX_OPS_PER_SCRIPT) {
453 [ + - ]: 481 : return set_error(serror, SCRIPT_ERR_OP_COUNT);
454 : : }
455 : : }
456 : :
457 : 7170057 : if (opcode == OP_CAT ||
458 : : opcode == OP_SUBSTR ||
459 [ + + ]: 7170057 : opcode == OP_LEFT ||
460 [ + + ]: 7168868 : opcode == OP_RIGHT ||
461 [ + + ]: 7168670 : opcode == OP_INVERT ||
462 [ + + ]: 7168571 : opcode == OP_AND ||
463 [ + + ]: 7168478 : opcode == OP_OR ||
464 [ + + ]: 7168369 : opcode == OP_XOR ||
465 [ + + ]: 7168184 : opcode == OP_2MUL ||
466 [ + + ]: 7167986 : opcode == OP_2DIV ||
467 [ + + ]: 7167802 : opcode == OP_MUL ||
468 [ + + ]: 7167607 : opcode == OP_DIV ||
469 [ + + ]: 7167419 : opcode == OP_MOD ||
470 [ + + ]: 7167231 : opcode == OP_LSHIFT ||
471 : : opcode == OP_RSHIFT)
472 [ + - ]: 3039 : return set_error(serror, SCRIPT_ERR_DISABLED_OPCODE); // Disabled opcodes (CVE-2010-5137).
473 : :
474 : : // With SCRIPT_VERIFY_CONST_SCRIPTCODE, OP_CODESEPARATOR in non-segwit script is rejected even in an unexecuted branch
475 [ + + + + : 7167018 : if (opcode == OP_CODESEPARATOR && sigversion == SigVersion::BASE && (flags & SCRIPT_VERIFY_CONST_SCRIPTCODE))
+ + ]
476 [ + - ]: 311 : return set_error(serror, SCRIPT_ERR_OP_CODESEPARATOR);
477 : :
478 [ + + + - : 7166707 : if (fExec && 0 <= opcode && opcode <= OP_PUSHDATA4) {
+ + ]
479 [ + + + - : 2266809 : if (fRequireMinimal && !CheckMinimalPush(vchPushValue, opcode)) {
+ + ]
480 [ + - ]: 2885 : return set_error(serror, SCRIPT_ERR_MINIMALDATA);
481 : : }
482 [ + - ]: 2263924 : stack.push_back(vchPushValue);
483 [ + + ]: 425021 : } else if (fExec || (OP_IF <= opcode && opcode <= OP_ENDIF))
484 [ + + + + : 4541661 : switch (opcode)
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + + +
+ + + +
+ ]
485 : : {
486 : : //
487 : : // Push value
488 : : //
489 : 542328 : case OP_1NEGATE:
490 : 542328 : case OP_1:
491 : 542328 : case OP_2:
492 : 542328 : case OP_3:
493 : 542328 : case OP_4:
494 : 542328 : case OP_5:
495 : 542328 : case OP_6:
496 : 542328 : case OP_7:
497 : 542328 : case OP_8:
498 : 542328 : case OP_9:
499 : 542328 : case OP_10:
500 : 542328 : case OP_11:
501 : 542328 : case OP_12:
502 : 542328 : case OP_13:
503 : 542328 : case OP_14:
504 : 542328 : case OP_15:
505 : 542328 : case OP_16:
506 : 542328 : {
507 : : // ( -- value)
508 [ + - ]: 542328 : CScriptNum bn((int)opcode - (int)(OP_1 - 1));
509 [ + - + - ]: 542328 : stack.push_back(bn.getvch());
510 : : // The result of these opcodes should always be the minimal way to push the data
511 : : // they push, so no need for a CheckMinimalPush here.
512 : : }
513 : 542328 : break;
514 : :
515 : :
516 : : //
517 : : // Control
518 : : //
519 : : case OP_NOP:
520 : : break;
521 : :
522 : 12637 : case OP_CHECKLOCKTIMEVERIFY:
523 : 12637 : {
524 [ + + ]: 12637 : if (!(flags & SCRIPT_VERIFY_CHECKLOCKTIMEVERIFY)) {
525 : : // not enabled; treat as a NOP2
526 : : break;
527 : : }
528 : :
529 [ - + + + ]: 6659 : if (stack.size() < 1)
530 [ + - ]: 79 : return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION);
531 : :
532 : : // Note that elsewhere numeric opcodes are limited to
533 : : // operands in the range -2**31+1 to 2**31-1, however it is
534 : : // legal for opcodes to produce results exceeding that
535 : : // range. This limitation is implemented by CScriptNum's
536 : : // default 4-byte limit.
537 : : //
538 : : // If we kept to that limit we'd have a year 2038 problem,
539 : : // even though the nLockTime field in transactions
540 : : // themselves is uint32 which only becomes meaningless
541 : : // after the year 2106.
542 : : //
543 : : // Thus as a special case we tell CScriptNum to accept up
544 : : // to 5-byte bignums, which are good until 2**39-1, well
545 : : // beyond the 2**32-1 limit of the nLockTime field itself.
546 [ + - + + ]: 6580 : const CScriptNum nLockTime(stacktop(-1), fRequireMinimal, 5);
547 : :
548 : : // In the rare event that the argument may be < 0 due to
549 : : // some arithmetic being done first, you can always use
550 : : // 0 MAX CHECKLOCKTIMEVERIFY.
551 [ + + ]: 6519 : if (nLockTime < 0)
552 [ + - ]: 120 : return set_error(serror, SCRIPT_ERR_NEGATIVE_LOCKTIME);
553 : :
554 : : // Actually compare the specified lock time with the transaction.
555 [ + - + + ]: 6399 : if (!checker.CheckLockTime(nLockTime))
556 [ + - ]: 5700 : return set_error(serror, SCRIPT_ERR_UNSATISFIED_LOCKTIME);
557 : :
558 : : break;
559 : : }
560 : :
561 : 20188 : case OP_CHECKSEQUENCEVERIFY:
562 : 20188 : {
563 [ + + ]: 20188 : if (!(flags & SCRIPT_VERIFY_CHECKSEQUENCEVERIFY)) {
564 : : // not enabled; treat as a NOP3
565 : : break;
566 : : }
567 : :
568 [ - + + + ]: 13765 : if (stack.size() < 1)
569 [ + - ]: 175 : return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION);
570 : :
571 : : // nSequence, like nLockTime, is a 32-bit unsigned integer
572 : : // field. See the comment in CHECKLOCKTIMEVERIFY regarding
573 : : // 5-byte numeric operands.
574 [ + - + + ]: 13590 : const CScriptNum nSequence(stacktop(-1), fRequireMinimal, 5);
575 : :
576 : : // In the rare event that the argument may be < 0 due to
577 : : // some arithmetic being done first, you can always use
578 : : // 0 MAX CHECKSEQUENCEVERIFY.
579 [ + + ]: 13411 : if (nSequence < 0)
580 [ + - ]: 214 : return set_error(serror, SCRIPT_ERR_NEGATIVE_LOCKTIME);
581 : :
582 : : // To provide for future soft-fork extensibility, if the
583 : : // operand has the disabled lock-time flag set,
584 : : // CHECKSEQUENCEVERIFY behaves as a NOP.
585 [ + + ]: 13197 : if ((nSequence & CTxIn::SEQUENCE_LOCKTIME_DISABLE_FLAG) != 0)
586 : : break;
587 : :
588 : : // Compare the specified sequence number with the input.
589 [ + - + + ]: 12514 : if (!checker.CheckSequence(nSequence))
590 [ + - ]: 5859 : return set_error(serror, SCRIPT_ERR_UNSATISFIED_LOCKTIME);
591 : :
592 : : break;
593 : : }
594 : :
595 : 10120 : case OP_NOP1: case OP_NOP4: case OP_NOP5:
596 : 10120 : case OP_NOP6: case OP_NOP7: case OP_NOP8: case OP_NOP9: case OP_NOP10:
597 : 10120 : {
598 [ + + ]: 10120 : if (flags & SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_NOPS)
599 [ + - ]: 2192 : return set_error(serror, SCRIPT_ERR_DISCOURAGE_UPGRADABLE_NOPS);
600 : : }
601 : : break;
602 : :
603 : 78170 : case OP_IF:
604 : 78170 : case OP_NOTIF:
605 : 78170 : {
606 : : // <expression> if [statements] [else [statements]] endif
607 : 78170 : bool fValue = false;
608 [ + + ]: 78170 : if (fExec)
609 : : {
610 [ - + + + ]: 74844 : if (stack.size() < 1)
611 [ + - ]: 2753 : return set_error(serror, SCRIPT_ERR_UNBALANCED_CONDITIONAL);
612 [ + - ]: 72091 : valtype& vch = stacktop(-1);
613 : : // Tapscript requires minimal IF/NOTIF inputs as a consensus rule.
614 [ + + ]: 72091 : if (sigversion == SigVersion::TAPSCRIPT) {
615 : : // The input argument to the OP_IF and OP_NOTIF opcodes must be either
616 : : // exactly 0 (the empty vector) or exactly 1 (the one-byte vector with value 1).
617 [ - + + + : 890 : if (vch.size() > 1 || (vch.size() == 1 && vch[0] != 1)) {
+ + + + ]
618 [ + - ]: 5 : return set_error(serror, SCRIPT_ERR_TAPSCRIPT_MINIMALIF);
619 : : }
620 : : }
621 : : // Under witness v0 rules it is only a policy rule, enabled through SCRIPT_VERIFY_MINIMALIF.
622 [ + + + + ]: 72086 : if (sigversion == SigVersion::WITNESS_V0 && (flags & SCRIPT_VERIFY_MINIMALIF)) {
623 [ - + + + ]: 6360 : if (vch.size() > 1)
624 [ + - ]: 1262 : return set_error(serror, SCRIPT_ERR_MINIMALIF);
625 [ + + + + ]: 5098 : if (vch.size() == 1 && vch[0] != 1)
626 [ + - ]: 2569 : return set_error(serror, SCRIPT_ERR_MINIMALIF);
627 : : }
628 [ + - ]: 68255 : fValue = CastToBool(vch);
629 [ + + ]: 68255 : if (opcode == OP_NOTIF)
630 : 8741 : fValue = !fValue;
631 [ + - ]: 68255 : popstack(stack);
632 : : }
633 [ + + ]: 71581 : vfExec.push_back(fValue);
634 : : }
635 : 71581 : break;
636 : :
637 : 58622 : case OP_ELSE:
638 : 58622 : {
639 [ + + ]: 58622 : if (vfExec.empty())
640 [ + - ]: 653 : return set_error(serror, SCRIPT_ERR_UNBALANCED_CONDITIONAL);
641 : 57969 : vfExec.toggle_top();
642 : : }
643 : 57969 : break;
644 : :
645 : 54346 : case OP_ENDIF:
646 : 54346 : {
647 [ + + ]: 54346 : if (vfExec.empty())
648 [ + - ]: 1281 : return set_error(serror, SCRIPT_ERR_UNBALANCED_CONDITIONAL);
649 : 53065 : vfExec.pop_back();
650 : : }
651 : 53065 : break;
652 : :
653 : 8786 : case OP_VERIFY:
654 : 8786 : {
655 : : // (true -- ) or
656 : : // (false -- false) and return
657 [ - + + + ]: 8786 : if (stack.size() < 1)
658 [ + - ]: 97 : return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION);
659 [ + - + - ]: 8689 : bool fValue = CastToBool(stacktop(-1));
660 [ + + ]: 8689 : if (fValue)
661 [ + - ]: 8470 : popstack(stack);
662 : : else
663 [ + - ]: 219 : return set_error(serror, SCRIPT_ERR_VERIFY);
664 : : }
665 : : break;
666 : :
667 : 1462 : case OP_RETURN:
668 : 1462 : {
669 [ + - ]: 1462 : return set_error(serror, SCRIPT_ERR_OP_RETURN);
670 : : }
671 : 9558 : break;
672 : :
673 : :
674 : : //
675 : : // Stack ops
676 : : //
677 : 9558 : case OP_TOALTSTACK:
678 : 9558 : {
679 [ - + + + ]: 9558 : if (stack.size() < 1)
680 [ + - ]: 90 : return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION);
681 [ + - + - ]: 9468 : altstack.push_back(stacktop(-1));
682 [ + - ]: 9468 : popstack(stack);
683 : : }
684 : : break;
685 : :
686 : 5649 : case OP_FROMALTSTACK:
687 : 5649 : {
688 [ - + + + ]: 5649 : if (altstack.size() < 1)
689 [ + - ]: 282 : return set_error(serror, SCRIPT_ERR_INVALID_ALTSTACK_OPERATION);
690 [ + - + - ]: 5367 : stack.push_back(altstacktop(-1));
691 [ + - ]: 5367 : popstack(altstack);
692 : : }
693 : : break;
694 : :
695 : 32754 : case OP_2DROP:
696 : 32754 : {
697 : : // (x1 x2 -- )
698 [ - + + + ]: 32754 : if (stack.size() < 2)
699 [ + - ]: 211 : return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION);
700 [ + - ]: 32543 : popstack(stack);
701 [ + - ]: 32543 : popstack(stack);
702 : : }
703 : : break;
704 : :
705 : 53409 : case OP_2DUP:
706 : 53409 : {
707 : : // (x1 x2 -- x1 x2 x1 x2)
708 [ - + + + ]: 53409 : if (stack.size() < 2)
709 [ + - ]: 463 : return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION);
710 [ + - + - ]: 52946 : valtype vch1 = stacktop(-2);
711 [ - + + - : 52946 : valtype vch2 = stacktop(-1);
+ - ]
712 [ + - ]: 52946 : stack.push_back(vch1);
713 [ + - ]: 52946 : stack.push_back(vch2);
714 : 52946 : }
715 : 52946 : break;
716 : :
717 : 321381 : case OP_3DUP:
718 : 321381 : {
719 : : // (x1 x2 x3 -- x1 x2 x3 x1 x2 x3)
720 [ - + + + ]: 321381 : if (stack.size() < 3)
721 [ + - ]: 697 : return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION);
722 [ + - + - ]: 320684 : valtype vch1 = stacktop(-3);
723 [ - + + - : 320684 : valtype vch2 = stacktop(-2);
+ - ]
724 [ - + + - : 320684 : valtype vch3 = stacktop(-1);
+ - ]
725 [ + - ]: 320684 : stack.push_back(vch1);
726 [ + - ]: 320684 : stack.push_back(vch2);
727 [ + - ]: 320684 : stack.push_back(vch3);
728 : 320684 : }
729 : 320684 : break;
730 : :
731 : 1009 : case OP_2OVER:
732 : 1009 : {
733 : : // (x1 x2 x3 x4 -- x1 x2 x3 x4 x1 x2)
734 [ - + + + ]: 1009 : if (stack.size() < 4)
735 [ + - ]: 495 : return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION);
736 [ + - + - ]: 514 : valtype vch1 = stacktop(-4);
737 [ - + + - : 514 : valtype vch2 = stacktop(-3);
+ - ]
738 [ + - ]: 514 : stack.push_back(vch1);
739 [ + - ]: 514 : stack.push_back(vch2);
740 : 514 : }
741 : 514 : break;
742 : :
743 : 3539 : case OP_2ROT:
744 : 3539 : {
745 : : // (x1 x2 x3 x4 x5 x6 -- x3 x4 x5 x6 x1 x2)
746 [ - + + + ]: 3539 : if (stack.size() < 6)
747 [ + - ]: 198 : return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION);
748 [ + - + - ]: 3341 : valtype vch1 = stacktop(-6);
749 [ - + + - : 3341 : valtype vch2 = stacktop(-5);
+ - ]
750 : 3341 : stack.erase(stack.end()-6, stack.end()-4);
751 [ + - ]: 3341 : stack.push_back(vch1);
752 [ + - ]: 3341 : stack.push_back(vch2);
753 : 3341 : }
754 : 3341 : break;
755 : :
756 : 980 : case OP_2SWAP:
757 : 980 : {
758 : : // (x1 x2 x3 x4 -- x3 x4 x1 x2)
759 [ - + + + ]: 980 : if (stack.size() < 4)
760 [ + - ]: 466 : return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION);
761 [ + - - + : 514 : swap(stacktop(-4), stacktop(-2));
+ - ]
762 [ - + + - : 514 : swap(stacktop(-3), stacktop(-1));
- + + - ]
763 : : }
764 : 514 : break;
765 : :
766 : 1329 : case OP_IFDUP:
767 : 1329 : {
768 : : // (x - 0 | x x)
769 [ - + + + ]: 1329 : if (stack.size() < 1)
770 [ + - ]: 193 : return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION);
771 [ + - + - ]: 1136 : valtype vch = stacktop(-1);
772 [ + - + + ]: 1136 : if (CastToBool(vch))
773 [ + - ]: 827 : stack.push_back(vch);
774 : 0 : }
775 : 1136 : break;
776 : :
777 : 18626 : case OP_DEPTH:
778 : 18626 : {
779 : : // -- stacksize
780 [ - + + - ]: 18626 : CScriptNum bn(stack.size());
781 [ + - + - ]: 18626 : stack.push_back(bn.getvch());
782 : : }
783 : 18626 : break;
784 : :
785 : 47578 : case OP_DROP:
786 : 47578 : {
787 : : // (x -- )
788 [ - + + + ]: 47578 : if (stack.size() < 1)
789 [ + - ]: 169 : return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION);
790 [ + - ]: 47409 : popstack(stack);
791 : : }
792 : : break;
793 : :
794 : 157119 : case OP_DUP:
795 : 157119 : {
796 : : // (x -- x x)
797 [ - + + + ]: 157119 : if (stack.size() < 1)
798 [ + + ]: 80774 : return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION);
799 [ + - + - ]: 76345 : valtype vch = stacktop(-1);
800 [ + - ]: 76345 : stack.push_back(vch);
801 : 0 : }
802 : 76345 : break;
803 : :
804 : 1171 : case OP_NIP:
805 : 1171 : {
806 : : // (x1 x2 -- x2)
807 [ - + + + ]: 1171 : if (stack.size() < 2)
808 [ + - ]: 379 : return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION);
809 : 792 : stack.erase(stack.end() - 2);
810 : : }
811 : : break;
812 : :
813 : 1192 : case OP_OVER:
814 : 1192 : {
815 : : // (x1 x2 -- x1 x2 x1)
816 [ - + + + ]: 1192 : if (stack.size() < 2)
817 [ + - ]: 485 : return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION);
818 [ + - + - ]: 707 : valtype vch = stacktop(-2);
819 [ + - ]: 707 : stack.push_back(vch);
820 : 0 : }
821 : 707 : break;
822 : :
823 : 6341 : case OP_PICK:
824 : 6341 : case OP_ROLL:
825 : 6341 : {
826 : : // (xn ... x2 x1 x0 n - xn ... x2 x1 x0 xn)
827 : : // (xn ... x2 x1 x0 n - ... x2 x1 x0 xn)
828 [ - + + + ]: 6341 : if (stack.size() < 2)
829 [ + - ]: 569 : return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION);
830 [ + - + + ]: 5772 : int n = CScriptNum(stacktop(-1), fRequireMinimal).getint();
831 [ + - ]: 5510 : popstack(stack);
832 [ + + + + ]: 10635 : if (n < 0 || n >= (int)stack.size())
833 [ + - ]: 966 : return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION);
834 [ + - + - ]: 4544 : valtype vch = stacktop(-n-1);
835 [ + + ]: 4544 : if (opcode == OP_ROLL)
836 : 2116 : stack.erase(stack.end()-n-1);
837 [ + - ]: 4544 : stack.push_back(vch);
838 : 0 : }
839 : 4544 : break;
840 : :
841 : 3150 : case OP_ROT:
842 : 3150 : {
843 : : // (x1 x2 x3 -- x2 x3 x1)
844 : : // x2 x1 x3 after first swap
845 : : // x2 x3 x1 after second swap
846 [ - + + + ]: 3150 : if (stack.size() < 3)
847 [ + - ]: 472 : return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION);
848 [ + - - + : 2678 : swap(stacktop(-3), stacktop(-2));
+ - ]
849 [ - + + - : 2678 : swap(stacktop(-2), stacktop(-1));
- + + - ]
850 : : }
851 : 2678 : break;
852 : :
853 : 4014 : case OP_SWAP:
854 : 4014 : {
855 : : // (x1 x2 -- x2 x1)
856 [ - + + + ]: 4014 : if (stack.size() < 2)
857 [ + - ]: 459 : return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION);
858 [ + - - + : 3555 : swap(stacktop(-2), stacktop(-1));
+ - ]
859 : : }
860 : 3555 : break;
861 : :
862 : 17420 : case OP_TUCK:
863 : 17420 : {
864 : : // (x1 x2 -- x2 x1 x2)
865 [ - + + + ]: 17420 : if (stack.size() < 2)
866 [ + - ]: 497 : return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION);
867 [ + - + - ]: 16923 : valtype vch = stacktop(-1);
868 [ + - ]: 16923 : stack.insert(stack.end()-2, vch);
869 : 0 : }
870 : 16923 : break;
871 : :
872 : :
873 : 8397 : case OP_SIZE:
874 : 8397 : {
875 : : // (in -- in size)
876 [ - + + + ]: 8397 : if (stack.size() < 1)
877 [ + - ]: 188 : return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION);
878 [ + - - + : 8209 : CScriptNum bn(stacktop(-1).size());
+ - ]
879 [ + - + - ]: 8209 : stack.push_back(bn.getvch());
880 : : }
881 : 8209 : break;
882 : :
883 : :
884 : : //
885 : : // Bitwise logic
886 : : //
887 : 197807 : case OP_EQUAL:
888 : 197807 : case OP_EQUALVERIFY:
889 : : //case OP_NOTEQUAL: // use OP_NUMNOTEQUAL
890 : 197807 : {
891 : : // (x1 x2 - bool)
892 [ - + + + ]: 197807 : if (stack.size() < 2)
893 [ + - ]: 785 : return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION);
894 [ + - ]: 197022 : valtype& vch1 = stacktop(-2);
895 [ - + + - ]: 197022 : valtype& vch2 = stacktop(-1);
896 : 197022 : bool fEqual = (vch1 == vch2);
897 : : // OP_NOTEQUAL is disabled because it would be too easy to say
898 : : // something like n != 1 and have some wiseguy pass in 1 with extra
899 : : // zero bytes after it (numerically, 0x01 == 0x0001 == 0x000001)
900 : : //if (opcode == OP_NOTEQUAL)
901 : : // fEqual = !fEqual;
902 [ + - ]: 197022 : popstack(stack);
903 [ + - ]: 197022 : popstack(stack);
904 [ + + + - ]: 201549 : stack.push_back(fEqual ? vchTrue : vchFalse);
905 [ + + ]: 197022 : if (opcode == OP_EQUALVERIFY)
906 : : {
907 [ + + ]: 78996 : if (fEqual)
908 [ + - ]: 76994 : popstack(stack);
909 : : else
910 [ + - ]: 2002 : return set_error(serror, SCRIPT_ERR_EQUALVERIFY);
911 : : }
912 : : }
913 : : break;
914 : :
915 : :
916 : : //
917 : : // Numeric
918 : : //
919 : 2005584 : case OP_1ADD:
920 : 2005584 : case OP_1SUB:
921 : 2005584 : case OP_NEGATE:
922 : 2005584 : case OP_ABS:
923 : 2005584 : case OP_NOT:
924 : 2005584 : case OP_0NOTEQUAL:
925 : 2005584 : {
926 : : // (in -- out)
927 [ - + + + ]: 2005584 : if (stack.size() < 1)
928 [ + - ]: 560 : return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION);
929 [ + - + + ]: 2005024 : CScriptNum bn(stacktop(-1), fRequireMinimal);
930 [ + + + + : 2001676 : switch (opcode)
+ + - ]
931 : : {
932 : 1819 : case OP_1ADD: bn += bnOne; break;
933 : 814 : case OP_1SUB: bn -= bnOne; break;
934 : 1028 : case OP_NEGATE: bn = -bn; break;
935 [ + + ]: 1285 : case OP_ABS: if (bn < bnZero) bn = -bn; break;
936 : 18345 : case OP_NOT: bn = (bn == bnZero); break;
937 : 1978385 : case OP_0NOTEQUAL: bn = (bn != bnZero); break;
938 : 0 : default: assert(!"invalid opcode"); break;
939 : : }
940 [ + - ]: 2001676 : popstack(stack);
941 [ + - + - ]: 2001676 : stack.push_back(bn.getvch());
942 : : }
943 : 2001676 : break;
944 : :
945 : 49755 : case OP_ADD:
946 : 49755 : case OP_SUB:
947 : 49755 : case OP_BOOLAND:
948 : 49755 : case OP_BOOLOR:
949 : 49755 : case OP_NUMEQUAL:
950 : 49755 : case OP_NUMEQUALVERIFY:
951 : 49755 : case OP_NUMNOTEQUAL:
952 : 49755 : case OP_LESSTHAN:
953 : 49755 : case OP_GREATERTHAN:
954 : 49755 : case OP_LESSTHANOREQUAL:
955 : 49755 : case OP_GREATERTHANOREQUAL:
956 : 49755 : case OP_MIN:
957 : 49755 : case OP_MAX:
958 : 49755 : {
959 : : // (x1 x2 -- out)
960 [ - + + + ]: 49755 : if (stack.size() < 2)
961 [ + - ]: 2503 : return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION);
962 [ + - + + ]: 47252 : CScriptNum bn1(stacktop(-2), fRequireMinimal);
963 [ - + + - : 44542 : CScriptNum bn2(stacktop(-1), fRequireMinimal);
+ + ]
964 [ + + + + : 42858 : CScriptNum bn(0);
+ + + + +
+ + + +
- ]
965 [ + + + + : 42858 : switch (opcode)
+ + + + +
+ + + +
- ]
966 : : {
967 : 8971 : case OP_ADD:
968 : 8971 : bn = bn1 + bn2;
969 : 8971 : break;
970 : :
971 : 1415 : case OP_SUB:
972 : 1415 : bn = bn1 - bn2;
973 : 1415 : break;
974 : :
975 [ + + + + ]: 7173 : case OP_BOOLAND: bn = (bn1 != bnZero && bn2 != bnZero); break;
976 [ + + + + ]: 2823 : case OP_BOOLOR: bn = (bn1 != bnZero || bn2 != bnZero); break;
977 : 8867 : case OP_NUMEQUAL: bn = (bn1 == bn2); break;
978 : 1031 : case OP_NUMEQUALVERIFY: bn = (bn1 == bn2); break;
979 : 1285 : case OP_NUMNOTEQUAL: bn = (bn1 != bn2); break;
980 : 2056 : case OP_LESSTHAN: bn = (bn1 < bn2); break;
981 : 2056 : case OP_GREATERTHAN: bn = (bn1 > bn2); break;
982 : 2056 : case OP_LESSTHANOREQUAL: bn = (bn1 <= bn2); break;
983 : 2056 : case OP_GREATERTHANOREQUAL: bn = (bn1 >= bn2); break;
984 [ + + ]: 1799 : case OP_MIN: bn = (bn1 < bn2 ? bn1 : bn2); break;
985 [ + + ]: 1799 : case OP_MAX: bn = (bn1 > bn2 ? bn1 : bn2); break;
986 : 0 : default: assert(!"invalid opcode"); break;
987 : : }
988 [ + - ]: 42858 : popstack(stack);
989 [ + - ]: 42858 : popstack(stack);
990 [ + - + - ]: 42858 : stack.push_back(bn.getvch());
991 : :
992 [ + + ]: 42858 : if (opcode == OP_NUMEQUALVERIFY)
993 : : {
994 [ - + + - : 1031 : if (CastToBool(stacktop(-1)))
+ - + - ]
995 [ + - ]: 1031 : popstack(stack);
996 : : else
997 [ # # ]: 0 : return set_error(serror, SCRIPT_ERR_NUMEQUALVERIFY);
998 : : }
999 : : }
1000 : : break;
1001 : :
1002 : 3503 : case OP_WITHIN:
1003 : 3503 : {
1004 : : // (x min max -- out)
1005 [ - + + + ]: 3503 : if (stack.size() < 3)
1006 [ + - ]: 203 : return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION);
1007 [ + - + + ]: 3300 : CScriptNum bn1(stacktop(-3), fRequireMinimal);
1008 [ - + + - : 3182 : CScriptNum bn2(stacktop(-2), fRequireMinimal);
+ + ]
1009 [ - + + - : 3049 : CScriptNum bn3(stacktop(-1), fRequireMinimal);
+ + ]
1010 [ + + + + ]: 2915 : bool fValue = (bn2 <= bn1 && bn1 < bn3);
1011 [ + - ]: 2915 : popstack(stack);
1012 [ + - ]: 2915 : popstack(stack);
1013 [ + - ]: 2915 : popstack(stack);
1014 [ + + + - ]: 4457 : stack.push_back(fValue ? vchTrue : vchFalse);
1015 : : }
1016 : : break;
1017 : :
1018 : :
1019 : : //
1020 : : // Crypto
1021 : : //
1022 : 152796 : case OP_RIPEMD160:
1023 : 152796 : case OP_SHA1:
1024 : 152796 : case OP_SHA256:
1025 : 152796 : case OP_HASH160:
1026 : 152796 : case OP_HASH256:
1027 : 152796 : {
1028 : : // (in -- hash)
1029 [ - + + + ]: 152796 : if (stack.size() < 1)
1030 [ + + ]: 8280 : return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION);
1031 [ + - ]: 144516 : valtype& vch = stacktop(-1);
1032 [ + + + + : 147962 : valtype vchHash((opcode == OP_RIPEMD160 || opcode == OP_SHA1 || opcode == OP_HASH160) ? 20 : 32);
+ - ]
1033 [ + + ]: 144516 : if (opcode == OP_RIPEMD160)
1034 [ + - + - : 2660 : CRIPEMD160().Write(vch.data(), vch.size()).Finalize(vchHash.data());
+ - ]
1035 [ + + ]: 143186 : else if (opcode == OP_SHA1)
1036 [ + - + - : 22676 : CSHA1().Write(vch.data(), vch.size()).Finalize(vchHash.data());
+ - ]
1037 [ + + ]: 131848 : else if (opcode == OP_SHA256)
1038 [ + - + - : 4080 : CSHA256().Write(vch.data(), vch.size()).Finalize(vchHash.data());
+ - ]
1039 [ + + ]: 129808 : else if (opcode == OP_HASH160)
1040 [ + - - + : 128402 : CHash160().Write(vch).Finalize(vchHash);
+ - - + +
- ]
1041 [ + - ]: 1406 : else if (opcode == OP_HASH256)
1042 [ + - - + : 1406 : CHash256().Write(vch).Finalize(vchHash);
+ - - + +
- ]
1043 [ + - ]: 144516 : popstack(stack);
1044 [ + - ]: 144516 : stack.push_back(vchHash);
1045 : 0 : }
1046 : 144516 : break;
1047 : :
1048 : 3909 : case OP_CODESEPARATOR:
1049 : 3909 : {
1050 : : // If SCRIPT_VERIFY_CONST_SCRIPTCODE flag is set, use of OP_CODESEPARATOR is rejected in pre-segwit
1051 : : // script, even in an unexecuted branch (this is checked above the opcode case statement).
1052 : :
1053 : : // Hash starts after the code separator
1054 : 3909 : pbegincodehash = pc;
1055 : 3909 : execdata.m_codeseparator_pos = opcode_pos;
1056 : : }
1057 : 3909 : break;
1058 : :
1059 : 225188 : case OP_CHECKSIG:
1060 : 225188 : case OP_CHECKSIGVERIFY:
1061 : 225188 : {
1062 : : // (sig pubkey -- bool)
1063 [ - + + + ]: 225188 : if (stack.size() < 2)
1064 [ + + ]: 9329 : return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION);
1065 : :
1066 [ + - ]: 215859 : valtype& vchSig = stacktop(-2);
1067 [ - + + - ]: 215859 : valtype& vchPubKey = stacktop(-1);
1068 : :
1069 : 215859 : bool fSuccess = true;
1070 [ + - + + ]: 215859 : if (!EvalChecksig(vchSig, vchPubKey, pbegincodehash, pend, execdata, flags, checker, sigversion, serror, fSuccess)) return false;
1071 [ + - ]: 194572 : popstack(stack);
1072 [ + - ]: 194572 : popstack(stack);
1073 [ + + + - ]: 216254 : stack.push_back(fSuccess ? vchTrue : vchFalse);
1074 [ + + ]: 194572 : if (opcode == OP_CHECKSIGVERIFY)
1075 : : {
1076 [ + + ]: 58079 : if (fSuccess)
1077 [ + - ]: 57899 : popstack(stack);
1078 : : else
1079 [ + - ]: 180 : return set_error(serror, SCRIPT_ERR_CHECKSIGVERIFY);
1080 : : }
1081 : : }
1082 : : break;
1083 : :
1084 : 101215 : case OP_CHECKSIGADD:
1085 : 101215 : {
1086 : : // OP_CHECKSIGADD is only available in Tapscript
1087 [ + + + + ]: 101215 : if (sigversion == SigVersion::BASE || sigversion == SigVersion::WITNESS_V0) return set_error(serror, SCRIPT_ERR_BAD_OPCODE);
1088 : :
1089 : : // (sig num pubkey -- num)
1090 [ - + + + : 100781 : if (stack.size() < 3) return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION);
+ - ]
1091 : :
1092 [ + - ]: 100780 : const valtype& sig = stacktop(-3);
1093 [ - + + - : 100780 : const CScriptNum num(stacktop(-2), fRequireMinimal);
+ + ]
1094 [ - + + - ]: 100778 : const valtype& pubkey = stacktop(-1);
1095 : :
1096 : 100778 : bool success = true;
1097 [ + - + + ]: 100778 : if (!EvalChecksig(sig, pubkey, pbegincodehash, pend, execdata, flags, checker, sigversion, serror, success)) return false;
1098 [ + - ]: 100713 : popstack(stack);
1099 [ + - ]: 100713 : popstack(stack);
1100 [ + - ]: 100713 : popstack(stack);
1101 [ + + + - : 199347 : stack.push_back((num + (success ? 1 : 0)).getvch());
+ - ]
1102 : : }
1103 : 100713 : break;
1104 : :
1105 : 166902 : case OP_CHECKMULTISIG:
1106 : 166902 : case OP_CHECKMULTISIGVERIFY:
1107 : 166902 : {
1108 [ + + + - ]: 166902 : if (sigversion == SigVersion::TAPSCRIPT) return set_error(serror, SCRIPT_ERR_TAPSCRIPT_CHECKMULTISIG);
1109 : :
1110 : : // ([sig ...] num_of_signatures [pubkey ...] num_of_pubkeys -- bool)
1111 : :
1112 : 166899 : int i = 1;
1113 [ - + + + ]: 166899 : if ((int)stack.size() < i)
1114 [ + - ]: 132 : return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION);
1115 : :
1116 [ + - + + ]: 166767 : int nKeysCount = CScriptNum(stacktop(-i), fRequireMinimal).getint();
1117 [ + + ]: 166500 : if (nKeysCount < 0 || nKeysCount > MAX_PUBKEYS_PER_MULTISIG)
1118 [ + - ]: 309 : return set_error(serror, SCRIPT_ERR_PUBKEY_COUNT);
1119 : 166191 : nOpCount += nKeysCount;
1120 [ + + ]: 166191 : if (nOpCount > MAX_OPS_PER_SCRIPT)
1121 [ + - ]: 387 : return set_error(serror, SCRIPT_ERR_OP_COUNT);
1122 : 165804 : int ikey = ++i;
1123 : : // ikey2 is the position of last non-signature item in the stack. Top stack item = 1.
1124 : : // With SCRIPT_VERIFY_NULLFAIL, this is used for cleanup if operation fails.
1125 : 165804 : int ikey2 = nKeysCount + 2;
1126 : 165804 : i += nKeysCount;
1127 [ - + + + ]: 165804 : if ((int)stack.size() < i)
1128 [ + - ]: 115 : return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION);
1129 : :
1130 [ + - + + ]: 165689 : int nSigsCount = CScriptNum(stacktop(-i), fRequireMinimal).getint();
1131 [ + + ]: 165321 : if (nSigsCount < 0 || nSigsCount > nKeysCount)
1132 [ + - ]: 323 : return set_error(serror, SCRIPT_ERR_SIG_COUNT);
1133 : 164998 : int isig = ++i;
1134 : 164998 : i += nSigsCount;
1135 [ - + + + ]: 164998 : if ((int)stack.size() < i)
1136 [ + + ]: 351 : return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION);
1137 : :
1138 : : // Subset of script starting at the most recent codeseparator
1139 : 164647 : CScript scriptCode(pbegincodehash, pend);
1140 : :
1141 : : // Drop the signature in pre-segwit scripts but not segwit scripts
1142 [ + + ]: 229147 : for (int k = 0; k < nSigsCount; k++)
1143 : : {
1144 [ - + + - ]: 64674 : valtype& vchSig = stacktop(-isig-k);
1145 [ + + ]: 64674 : if (sigversion == SigVersion::BASE) {
1146 [ - + + - ]: 57578 : int found = FindAndDelete(scriptCode, CScript() << vchSig);
1147 [ + + + + ]: 57578 : if (found > 0 && (flags & SCRIPT_VERIFY_CONST_SCRIPTCODE))
1148 [ + - ]: 174 : return set_error(serror, SCRIPT_ERR_SIG_FINDANDDELETE);
1149 : : }
1150 : : }
1151 : :
1152 : : bool fSuccess = true;
1153 [ + + ]: 188095 : while (fSuccess && nSigsCount > 0)
1154 : : {
1155 [ - + + - ]: 29287 : valtype& vchSig = stacktop(-isig);
1156 [ - + + - ]: 29287 : valtype& vchPubKey = stacktop(-ikey);
1157 : :
1158 : : // Note how this makes the exact order of pubkey/signature evaluation
1159 : : // distinguishable by CHECKMULTISIG NOT if the STRICTENC flag is set.
1160 : : // See the script_(in)valid tests for details.
1161 [ + - + + : 29287 : if (!CheckSignatureEncoding(vchSig, flags, serror) || !CheckPubKeyEncoding(vchPubKey, flags, sigversion, serror)) {
+ + ]
1162 : : // serror is set
1163 : 5665 : return false;
1164 : : }
1165 : :
1166 : : // Check signature
1167 [ + - ]: 23622 : bool fOk = checker.CheckECDSASignature(vchSig, vchPubKey, scriptCode, sigversion);
1168 : :
1169 [ + + ]: 23622 : if (fOk) {
1170 : 14290 : isig++;
1171 : 14290 : nSigsCount--;
1172 : : }
1173 : 23622 : ikey++;
1174 : 23622 : nKeysCount--;
1175 : :
1176 : : // If there are more signatures left than keys left,
1177 : : // then too many signatures have failed. Exit early,
1178 : : // without checking any further signatures.
1179 [ + + ]: 23622 : if (nSigsCount > nKeysCount)
1180 : 6121 : fSuccess = false;
1181 : : }
1182 : :
1183 : : // Clean up stack of actual arguments
1184 [ + + ]: 847355 : while (i-- > 1) {
1185 : : // If the operation failed, we require that all signatures must be empty vector
1186 [ + + + + : 699073 : if (!fSuccess && (flags & SCRIPT_VERIFY_NULLFAIL) && !ikey2 && stacktop(-1).size())
+ + + - -
+ + + ]
1187 [ + + ]: 957 : return set_error(serror, SCRIPT_ERR_SIG_NULLFAIL);
1188 [ + + ]: 688547 : if (ikey2 > 0)
1189 : 638522 : ikey2--;
1190 [ + - ]: 688547 : popstack(stack);
1191 : : }
1192 : :
1193 : : // A bug causes CHECKMULTISIG to consume one extra argument
1194 : : // whose contents were not checked in any way.
1195 : : //
1196 : : // Unfortunately this is a potential source of mutability,
1197 : : // so optionally verify it is exactly equal to zero prior
1198 : : // to removing it from the stack.
1199 [ - + - + ]: 157851 : if (stack.size() < 1)
1200 [ # # ]: 0 : return set_error(serror, SCRIPT_ERR_INVALID_STACK_OPERATION);
1201 [ + + + - : 157851 : if ((flags & SCRIPT_VERIFY_NULLDUMMY) && stacktop(-1).size())
- + + + ]
1202 [ + - ]: 698 : return set_error(serror, SCRIPT_ERR_SIG_NULLDUMMY);
1203 [ + - ]: 157153 : popstack(stack);
1204 : :
1205 [ + + + - ]: 162127 : stack.push_back(fSuccess ? vchTrue : vchFalse);
1206 : :
1207 [ + + ]: 157153 : if (opcode == OP_CHECKMULTISIGVERIFY)
1208 : : {
1209 [ + + ]: 62585 : if (fSuccess)
1210 [ + - ]: 62537 : popstack(stack);
1211 : : else
1212 [ + - ]: 7590 : return set_error(serror, SCRIPT_ERR_CHECKMULTISIGVERIFY);
1213 : : }
1214 : 7542 : }
1215 : 157105 : break;
1216 : :
1217 : 16238 : default:
1218 [ + - ]: 16238 : return set_error(serror, SCRIPT_ERR_BAD_OPCODE);
1219 : : }
1220 : :
1221 : : // Size limits
1222 [ - + - + : 6970834 : if (stack.size() + altstack.size() > MAX_STACK_SIZE)
+ + ]
1223 [ + - ]: 489 : return set_error(serror, SCRIPT_ERR_STACK_SIZE);
1224 : : }
1225 : : }
1226 : 9266 : catch (...)
1227 : : {
1228 [ + - ]: 9266 : return set_error(serror, SCRIPT_ERR_UNKNOWN_ERROR);
1229 [ + - ]: 9266 : }
1230 : :
1231 [ + + ]: 1584040 : if (!vfExec.empty())
1232 [ + - ]: 703 : return set_error(serror, SCRIPT_ERR_UNBALANCED_CONDITIONAL);
1233 : :
1234 [ + + ]: 1583337 : return set_success(serror);
1235 : 1785170 : }
1236 : :
1237 : 1631577 : bool EvalScript(std::vector<std::vector<unsigned char> >& stack, const CScript& script, script_verify_flags flags, const BaseSignatureChecker& checker, SigVersion sigversion, ScriptError* serror)
1238 : : {
1239 : 1631577 : ScriptExecutionData execdata;
1240 : 1631577 : return EvalScript(stack, script, flags, checker, sigversion, execdata, serror);
1241 : : }
1242 : :
1243 : : namespace {
1244 : :
1245 : : /**
1246 : : * Wrapper that serializes like CTransaction, but with the modifications
1247 : : * required for the signature hash done in-place
1248 : : */
1249 : : template <class T>
1250 : : class CTransactionSignatureSerializer
1251 : : {
1252 : : private:
1253 : : const T& txTo; //!< reference to the spending transaction (the one being serialized)
1254 : : const CScript& scriptCode; //!< output script being consumed
1255 : : const unsigned int nIn; //!< input index of txTo being signed
1256 : : const bool fAnyoneCanPay; //!< whether the hashtype has the SIGHASH_ANYONECANPAY flag set
1257 : : // Temporary workaround for a clang-tidy bug fixed in version 22.
1258 : : // See: https://github.com/llvm/llvm-project/issues/160394.
1259 : : // NOLINTBEGIN(modernize-use-default-member-init)
1260 : : const bool fHashSingle; //!< whether the hashtype is SIGHASH_SINGLE
1261 : : const bool fHashNone; //!< whether the hashtype is SIGHASH_NONE
1262 : : // NOLINTEND(modernize-use-default-member-init)
1263 : :
1264 : : public:
1265 : 121060 : CTransactionSignatureSerializer(const T& txToIn, const CScript& scriptCodeIn, unsigned int nInIn, int nHashTypeIn) :
1266 : 121060 : txTo(txToIn), scriptCode(scriptCodeIn), nIn(nInIn),
1267 : 121060 : fAnyoneCanPay(!!(nHashTypeIn & SIGHASH_ANYONECANPAY)),
1268 : 121060 : fHashSingle((nHashTypeIn & 0x1f) == SIGHASH_SINGLE),
1269 : 121060 : fHashNone((nHashTypeIn & 0x1f) == SIGHASH_NONE) {}
1270 : :
1271 : : /** Serialize the passed scriptCode, skipping OP_CODESEPARATORs */
1272 : : template<typename S>
1273 : 121060 : void SerializeScriptCode(S &s) const {
1274 [ + + ]: 121060 : CScript::const_iterator it = scriptCode.begin();
1275 : 121060 : CScript::const_iterator itBegin = it;
1276 : : opcodetype opcode;
1277 : 121060 : unsigned int nCodeSeparators = 0;
1278 [ + + ]: 680962 : while (scriptCode.GetOp(it, opcode)) {
1279 [ + + ]: 559902 : if (opcode == OP_CODESEPARATOR)
1280 : 26377 : nCodeSeparators++;
1281 : : }
1282 [ + + ]: 152495 : ::WriteCompactSize(s, scriptCode.size() - nCodeSeparators);
1283 : 121060 : it = itBegin;
1284 [ + + ]: 802022 : while (scriptCode.GetOp(it, opcode)) {
1285 [ + + ]: 559902 : if (opcode == OP_CODESEPARATOR) {
1286 : 26377 : s.write(std::as_bytes(std::span{&itBegin[0], size_t(it - itBegin - 1)}));
1287 : 26377 : itBegin = it;
1288 : : }
1289 : : }
1290 [ + + ]: 121060 : if (itBegin != scriptCode.end())
1291 : 110840 : s.write(std::as_bytes(std::span{&itBegin[0], size_t(it - itBegin)}));
1292 : 121060 : }
1293 : :
1294 : : /** Serialize an input of txTo */
1295 : : template<typename S>
1296 : 823662 : void SerializeInput(S &s, unsigned int nInput) const {
1297 : : // In case of SIGHASH_ANYONECANPAY, only the input being signed is serialized
1298 [ + + ]: 823662 : if (fAnyoneCanPay)
1299 : 26664 : nInput = nIn;
1300 : : // Serialize the prevout
1301 : 823662 : ::Serialize(s, txTo.vin[nInput].prevout);
1302 : : // Serialize the script
1303 [ + + ]: 823662 : if (nInput != nIn)
1304 : : // Blank out other inputs' signatures
1305 [ + - ]: 1405204 : ::Serialize(s, CScript());
1306 : : else
1307 : 121060 : SerializeScriptCode(s);
1308 : : // Serialize the nSequence
1309 [ + + + + : 823662 : if (nInput != nIn && (fHashSingle || fHashNone))
+ + ]
1310 : : // let the others update at will
1311 : 2857 : ::Serialize(s, int32_t{0});
1312 : : else
1313 : 820805 : ::Serialize(s, txTo.vin[nInput].nSequence);
1314 : 823662 : }
1315 : :
1316 : : /** Serialize an output of txTo */
1317 : : template<typename S>
1318 : 398454 : void SerializeOutput(S &s, unsigned int nOutput) const {
1319 [ + + + + ]: 398454 : if (fHashSingle && nOutput != nIn)
1320 : : // Do not lock-in the txout payee at other indices as txin
1321 [ + - ]: 2974 : ::Serialize(s, CTxOut());
1322 : : else
1323 : 396967 : ::Serialize(s, txTo.vout[nOutput]);
1324 : 398454 : }
1325 : :
1326 : : /** Serialize txTo */
1327 : : template<typename S>
1328 : 121060 : void Serialize(S &s) const {
1329 : : // Serialize version
1330 : 121060 : ::Serialize(s, txTo.version);
1331 : : // Serialize vin
1332 [ + + - + ]: 121060 : unsigned int nInputs = fAnyoneCanPay ? 1 : txTo.vin.size();
1333 : 121060 : ::WriteCompactSize(s, nInputs);
1334 [ + + ]: 944722 : for (unsigned int nInput = 0; nInput < nInputs; nInput++)
1335 : 823662 : SerializeInput(s, nInput);
1336 : : // Serialize vout
1337 [ + + + + : 121060 : unsigned int nOutputs = fHashNone ? 0 : (fHashSingle ? nIn+1 : txTo.vout.size());
- + ]
1338 : 121060 : ::WriteCompactSize(s, nOutputs);
1339 [ + + ]: 519514 : for (unsigned int nOutput = 0; nOutput < nOutputs; nOutput++)
1340 : 398454 : SerializeOutput(s, nOutput);
1341 : : // Serialize nLockTime
1342 : 121060 : ::Serialize(s, txTo.nLockTime);
1343 : 121060 : }
1344 : : };
1345 : :
1346 : : /** Compute the (single) SHA256 of the concatenation of all prevouts of a tx. */
1347 : : template <class T>
1348 : 71360 : uint256 GetPrevoutsSHA256(const T& txTo)
1349 : : {
1350 : 71360 : HashWriter ss{};
1351 [ + + ]: 20523562 : for (const auto& txin : txTo.vin) {
1352 : 20452202 : ss << txin.prevout;
1353 : : }
1354 : 71360 : return ss.GetSHA256();
1355 : : }
1356 : :
1357 : : /** Compute the (single) SHA256 of the concatenation of all nSequences of a tx. */
1358 : : template <class T>
1359 : 68346 : uint256 GetSequencesSHA256(const T& txTo)
1360 : : {
1361 : 68346 : HashWriter ss{};
1362 [ + + ]: 7020506 : for (const auto& txin : txTo.vin) {
1363 : 6952160 : ss << txin.nSequence;
1364 : : }
1365 : 68346 : return ss.GetSHA256();
1366 : : }
1367 : :
1368 : : /** Compute the (single) SHA256 of the concatenation of all txouts of a tx. */
1369 : : template <class T>
1370 : 69867 : uint256 GetOutputsSHA256(const T& txTo)
1371 : : {
1372 : 69867 : HashWriter ss{};
1373 [ + + ]: 14000104 : for (const auto& txout : txTo.vout) {
1374 : 13930237 : ss << txout;
1375 : : }
1376 : 69867 : return ss.GetSHA256();
1377 : : }
1378 : :
1379 : : /** Compute the (single) SHA256 of the concatenation of all amounts spent by a tx. */
1380 : 52196 : uint256 GetSpentAmountsSHA256(const std::vector<CTxOut>& outputs_spent)
1381 : : {
1382 : 52196 : HashWriter ss{};
1383 [ + + ]: 176154 : for (const auto& txout : outputs_spent) {
1384 : 123958 : ss << txout.nValue;
1385 : : }
1386 : 52196 : return ss.GetSHA256();
1387 : : }
1388 : :
1389 : : /** Compute the (single) SHA256 of the concatenation of all scriptPubKeys spent by a tx. */
1390 : 52196 : uint256 GetSpentScriptsSHA256(const std::vector<CTxOut>& outputs_spent)
1391 : : {
1392 : 52196 : HashWriter ss{};
1393 [ + + ]: 176154 : for (const auto& txout : outputs_spent) {
1394 : 123958 : ss << txout.scriptPubKey;
1395 : : }
1396 : 52196 : return ss.GetSHA256();
1397 : : }
1398 : :
1399 : :
1400 : : } // namespace
1401 : :
1402 : : template <class T>
1403 : 83368 : void PrecomputedTransactionData::Init(const T& txTo, std::vector<CTxOut>&& spent_outputs, bool force)
1404 : : {
1405 [ - + ]: 83368 : assert(!m_spent_outputs_ready);
1406 : :
1407 : 83368 : m_spent_outputs = std::move(spent_outputs);
1408 [ + + ]: 83368 : if (!m_spent_outputs.empty()) {
1409 [ - + - + : 83116 : assert(m_spent_outputs.size() == txTo.vin.size());
- + ]
1410 : 83116 : m_spent_outputs_ready = true;
1411 : : }
1412 : :
1413 : : // Determine which precomputation-impacting features this transaction uses.
1414 : : bool uses_bip143_segwit = force;
1415 : : bool uses_bip341_taproot = force;
1416 [ - + + + : 189753 : for (size_t inpos = 0; inpos < txTo.vin.size() && !(uses_bip143_segwit && uses_bip341_taproot); ++inpos) {
+ + ]
1417 [ + + ]: 107411 : if (!txTo.vin[inpos].scriptWitness.IsNull()) {
1418 [ + + - + : 71794 : if (m_spent_outputs_ready && m_spent_outputs[inpos].scriptPubKey.size() == 2 + WITNESS_V1_TAPROOT_SIZE &&
+ + ]
1419 [ + - + + ]: 114702 : m_spent_outputs[inpos].scriptPubKey[0] == OP_1) {
1420 : : // Treat every witness-bearing spend with 34-byte scriptPubKey that starts with OP_1 as a Taproot
1421 : : // spend. This only works if spent_outputs was provided as well, but if it wasn't, actual validation
1422 : : // will fail anyway. Note that this branch may trigger for scriptPubKeys that aren't actually segwit
1423 : : // but in that case validation will fail as SCRIPT_ERR_WITNESS_UNEXPECTED anyway.
1424 : : uses_bip341_taproot = true;
1425 : : } else {
1426 : : // Treat every spend that's not known to native witness v1 as a Witness v0 spend. This branch may
1427 : : // also be taken for unknown witness versions, but it is harmless, and being precise would require
1428 : : // P2SH evaluation to find the redeemScript.
1429 : : uses_bip143_segwit = true;
1430 : : }
1431 : : }
1432 [ + + ]: 107411 : if (uses_bip341_taproot && uses_bip143_segwit) break; // No need to scan further if we already need all.
1433 : : }
1434 : :
1435 [ + + ]: 83368 : if (uses_bip143_segwit || uses_bip341_taproot) {
1436 : : // Computations shared between both sighash schemes.
1437 : 57786 : m_prevouts_single_hash = GetPrevoutsSHA256(txTo);
1438 : 57786 : m_sequences_single_hash = GetSequencesSHA256(txTo);
1439 : 57786 : m_outputs_single_hash = GetOutputsSHA256(txTo);
1440 : : }
1441 [ + + ]: 57786 : if (uses_bip143_segwit) {
1442 : 27859 : hashPrevouts = SHA256Uint256(m_prevouts_single_hash);
1443 : 27859 : hashSequence = SHA256Uint256(m_sequences_single_hash);
1444 : 27859 : hashOutputs = SHA256Uint256(m_outputs_single_hash);
1445 : 27859 : m_bip143_segwit_ready = true;
1446 : : }
1447 [ + + + + ]: 83368 : if (uses_bip341_taproot && m_spent_outputs_ready) {
1448 : 52196 : m_spent_amounts_single_hash = GetSpentAmountsSHA256(m_spent_outputs);
1449 : 52196 : m_spent_scripts_single_hash = GetSpentScriptsSHA256(m_spent_outputs);
1450 : 52196 : m_bip341_taproot_ready = true;
1451 : : }
1452 : 83368 : }
1453 : :
1454 : : template <class T>
1455 [ + - ]: 214 : PrecomputedTransactionData::PrecomputedTransactionData(const T& txTo)
1456 : : {
1457 [ + - ]: 214 : Init(txTo, {});
1458 : 214 : }
1459 : :
1460 : : // explicit instantiation
1461 : : template void PrecomputedTransactionData::Init(const CTransaction& txTo, std::vector<CTxOut>&& spent_outputs, bool force);
1462 : : template void PrecomputedTransactionData::Init(const CMutableTransaction& txTo, std::vector<CTxOut>&& spent_outputs, bool force);
1463 : : template PrecomputedTransactionData::PrecomputedTransactionData(const CTransaction& txTo);
1464 : : template PrecomputedTransactionData::PrecomputedTransactionData(const CMutableTransaction& txTo);
1465 : :
1466 : : const HashWriter HASHER_TAPSIGHASH{TaggedHash("TapSighash")};
1467 : : const HashWriter HASHER_TAPLEAF{TaggedHash("TapLeaf")};
1468 : : const HashWriter HASHER_TAPBRANCH{TaggedHash("TapBranch")};
1469 : :
1470 : 36 : static bool HandleMissingData(MissingDataBehavior mdb)
1471 : : {
1472 [ - + - ]: 36 : switch (mdb) {
1473 : 0 : case MissingDataBehavior::ASSERT_FAIL:
1474 : 0 : assert(!"Missing data");
1475 : : break;
1476 : 36 : case MissingDataBehavior::FAIL:
1477 : 36 : return false;
1478 : : }
1479 : 0 : assert(!"Unknown MissingDataBehavior value");
1480 : : }
1481 : :
1482 : : template<typename T>
1483 : 28082 : 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)
1484 : : {
1485 : : uint8_t ext_flag, key_version;
1486 [ + - + ]: 28082 : switch (sigversion) {
1487 : : case SigVersion::TAPROOT:
1488 : : ext_flag = 0;
1489 : : // key_version is not used and left uninitialized.
1490 : : break;
1491 : 24446 : case SigVersion::TAPSCRIPT:
1492 : 24446 : ext_flag = 1;
1493 : : // key_version must be 0 for now, representing the current version of
1494 : : // 32-byte public keys in the tapscript signature opcode execution.
1495 : : // An upgradable public key version (with a size not 32-byte) may
1496 : : // request a different key_version with a new sigversion.
1497 : 24446 : key_version = 0;
1498 : 24446 : break;
1499 : 0 : default:
1500 : 0 : assert(false);
1501 : : }
1502 [ - + - + ]: 28082 : assert(in_pos < tx_to.vin.size());
1503 [ + - - + ]: 28082 : if (!(cache.m_bip341_taproot_ready && cache.m_spent_outputs_ready)) {
1504 : 0 : return HandleMissingData(mdb);
1505 : : }
1506 : :
1507 : 28082 : HashWriter ss{HASHER_TAPSIGHASH};
1508 : :
1509 : : // Epoch
1510 : : static constexpr uint8_t EPOCH = 0;
1511 : 28082 : ss << EPOCH;
1512 : :
1513 : : // Hash type
1514 [ + + ]: 28082 : const uint8_t output_type = (hash_type == SIGHASH_DEFAULT) ? SIGHASH_ALL : (hash_type & SIGHASH_OUTPUT_MASK); // Default (no sighash byte) is equivalent to SIGHASH_ALL
1515 : 27453 : const uint8_t input_type = hash_type & SIGHASH_INPUT_MASK;
1516 [ + + + + ]: 19304 : if (!(hash_type <= 0x03 || (hash_type >= 0x81 && hash_type <= 0x83))) return false;
1517 : 27453 : ss << hash_type;
1518 : :
1519 : : // Transaction level data
1520 : 27453 : ss << tx_to.version;
1521 : 27453 : ss << tx_to.nLockTime;
1522 [ + + ]: 27453 : if (input_type != SIGHASH_ANYONECANPAY) {
1523 : 19143 : ss << cache.m_prevouts_single_hash;
1524 : 19143 : ss << cache.m_spent_amounts_single_hash;
1525 : 19143 : ss << cache.m_spent_scripts_single_hash;
1526 : 19143 : ss << cache.m_sequences_single_hash;
1527 : : }
1528 [ + + ]: 27453 : if (output_type == SIGHASH_ALL) {
1529 : 16554 : ss << cache.m_outputs_single_hash;
1530 : : }
1531 : :
1532 : : // Data about the input/prevout being spent
1533 [ - + ]: 27453 : assert(execdata.m_annex_init);
1534 : 27453 : const bool have_annex = execdata.m_annex_present;
1535 [ + + ]: 52986 : const uint8_t spend_type = (ext_flag << 1) + (have_annex ? 1 : 0); // The low bit indicates whether an annex is present.
1536 : 27453 : ss << spend_type;
1537 [ + + ]: 27453 : if (input_type == SIGHASH_ANYONECANPAY) {
1538 : 8310 : ss << tx_to.vin[in_pos].prevout;
1539 : 8310 : ss << cache.m_spent_outputs[in_pos];
1540 : 8310 : ss << tx_to.vin[in_pos].nSequence;
1541 : : } else {
1542 : 19143 : ss << in_pos;
1543 : : }
1544 [ + + ]: 27453 : if (have_annex) {
1545 : 1920 : ss << execdata.m_annex_hash;
1546 : : }
1547 : :
1548 : : // Data about the output (if only one).
1549 [ + + ]: 27453 : if (output_type == SIGHASH_SINGLE) {
1550 [ - + + + ]: 4397 : if (in_pos >= tx_to.vout.size()) return false;
1551 [ + + ]: 4389 : if (!execdata.m_output_hash) {
1552 : 356 : HashWriter sha_single_output{};
1553 : 356 : sha_single_output << tx_to.vout[in_pos];
1554 [ - + ]: 356 : execdata.m_output_hash = sha_single_output.GetSHA256();
1555 : : }
1556 [ + - ]: 4389 : ss << execdata.m_output_hash.value();
1557 : : }
1558 : :
1559 : : // Additional data for BIP 342 signatures
1560 [ + + ]: 27445 : if (sigversion == SigVersion::TAPSCRIPT) {
1561 [ - + ]: 24128 : assert(execdata.m_tapleaf_hash_init);
1562 : 24128 : ss << execdata.m_tapleaf_hash;
1563 : 24128 : ss << key_version;
1564 [ - + ]: 24128 : assert(execdata.m_codeseparator_pos_init);
1565 : 24128 : ss << execdata.m_codeseparator_pos;
1566 : : }
1567 : :
1568 : 27445 : hash_out = ss.GetSHA256();
1569 : 27445 : return true;
1570 : : }
1571 : :
1572 : 299532 : int SigHashCache::CacheIndex(int32_t hash_type) const noexcept
1573 : : {
1574 : : // Note that we do not distinguish between BASE and WITNESS_V0 to determine the cache index,
1575 : : // because no input can simultaneously use both.
1576 [ + + ]: 299532 : return 3 * !!(hash_type & SIGHASH_ANYONECANPAY) +
1577 [ + + ]: 299532 : 2 * ((hash_type & 0x1f) == SIGHASH_SINGLE) +
1578 : 299532 : 1 * ((hash_type & 0x1f) == SIGHASH_NONE);
1579 : : }
1580 : :
1581 : 170601 : bool SigHashCache::Load(int32_t hash_type, const CScript& script_code, HashWriter& writer) const noexcept
1582 : : {
1583 : 170601 : auto& entry = m_cache_entries[CacheIndex(hash_type)];
1584 [ + + ]: 170601 : if (entry.has_value()) {
1585 [ + + ]: 42650 : if (script_code == entry->first) {
1586 : 41746 : writer = HashWriter(entry->second);
1587 : 41746 : return true;
1588 : : }
1589 : : }
1590 : : return false;
1591 : : }
1592 : :
1593 : 128931 : void SigHashCache::Store(int32_t hash_type, const CScript& script_code, const HashWriter& writer) noexcept
1594 : : {
1595 : 128931 : auto& entry = m_cache_entries[CacheIndex(hash_type)];
1596 : 128931 : entry.emplace(script_code, writer);
1597 : 128931 : }
1598 : :
1599 : : template <class T>
1600 : 237658 : 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)
1601 : : {
1602 [ - + - + ]: 237658 : assert(nIn < txTo.vin.size());
1603 : :
1604 [ + + ]: 237658 : if (sigversion != SigVersion::WITNESS_V0) {
1605 : : // Check for invalid use of SIGHASH_SINGLE
1606 [ + + ]: 160211 : if ((nHashType & 0x1f) == SIGHASH_SINGLE) {
1607 [ - + + + ]: 2433 : if (nIn >= txTo.vout.size()) {
1608 : : // nOut out of range
1609 : 242 : return uint256::ONE;
1610 : : }
1611 : : }
1612 : : }
1613 : :
1614 : 237416 : HashWriter ss{};
1615 : :
1616 : : // Try to compute using cached SHA256 midstate.
1617 [ + + + + ]: 237416 : if (sighash_cache && sighash_cache->Load(nHashType, scriptCode, ss)) {
1618 : : // Add sighash type and hash.
1619 : 41632 : ss << nHashType;
1620 : 41632 : return ss.GetHash();
1621 : : }
1622 : :
1623 [ + + ]: 195784 : if (sigversion == SigVersion::WITNESS_V0) {
1624 : 74724 : uint256 hashPrevouts;
1625 : 74724 : uint256 hashSequence;
1626 : 74724 : uint256 hashOutputs;
1627 [ + + - + ]: 74724 : const bool cacheready = cache && cache->m_bip143_segwit_ready;
1628 : :
1629 [ + + ]: 74724 : if (!(nHashType & SIGHASH_ANYONECANPAY)) {
1630 [ + + ]: 62752 : hashPrevouts = cacheready ? cache->hashPrevouts : SHA256Uint256(GetPrevoutsSHA256(txTo));
1631 : : }
1632 : :
1633 [ + + + + ]: 62752 : if (!(nHashType & SIGHASH_ANYONECANPAY) && (nHashType & 0x1f) != SIGHASH_SINGLE && (nHashType & 0x1f) != SIGHASH_NONE) {
1634 [ + + ]: 55837 : hashSequence = cacheready ? cache->hashSequence : SHA256Uint256(GetSequencesSHA256(txTo));
1635 : : }
1636 : :
1637 [ + + ]: 74724 : if ((nHashType & 0x1f) != SIGHASH_SINGLE && (nHashType & 0x1f) != SIGHASH_NONE) {
1638 [ + + ]: 60876 : hashOutputs = cacheready ? cache->hashOutputs : SHA256Uint256(GetOutputsSHA256(txTo));
1639 [ + + - + : 13848 : } else if ((nHashType & 0x1f) == SIGHASH_SINGLE && nIn < txTo.vout.size()) {
+ + ]
1640 : 6395 : HashWriter inner_ss{};
1641 : 6395 : inner_ss << txTo.vout[nIn];
1642 : 6395 : hashOutputs = inner_ss.GetHash();
1643 : : }
1644 : :
1645 : : // Version
1646 : 74724 : ss << txTo.version;
1647 : : // Input prevouts/nSequence (none/all, depending on flags)
1648 : 74724 : ss << hashPrevouts;
1649 : 74724 : ss << hashSequence;
1650 : : // The input being signed (replacing the scriptSig with scriptCode + amount)
1651 : : // The prevout may already be contained in hashPrevout, and the nSequence
1652 : : // may already be contain in hashSequence.
1653 : 74724 : ss << txTo.vin[nIn].prevout;
1654 : 74724 : ss << scriptCode;
1655 : 74724 : ss << amount;
1656 : 74724 : ss << txTo.vin[nIn].nSequence;
1657 : : // Outputs (none/one/all, depending on flags)
1658 : 74724 : ss << hashOutputs;
1659 : : // Locktime
1660 : 74724 : ss << txTo.nLockTime;
1661 : : } else {
1662 : : // Wrapper to serialize only the necessary parts of the transaction being signed
1663 : 121060 : CTransactionSignatureSerializer<T> txTmp(txTo, scriptCode, nIn, nHashType);
1664 : :
1665 : : // Serialize
1666 : 121060 : ss << txTmp;
1667 : : }
1668 : :
1669 : : // If a cache object was provided, store the midstate there.
1670 [ + + ]: 195784 : if (sighash_cache != nullptr) {
1671 : 128855 : sighash_cache->Store(nHashType, scriptCode, ss);
1672 : : }
1673 : :
1674 : : // Add sighash type and hash.
1675 : 195784 : ss << nHashType;
1676 : 195784 : return ss.GetHash();
1677 : : }
1678 : :
1679 : : template <class T>
1680 : 123560 : bool GenericTransactionSignatureChecker<T>::VerifyECDSASignature(const std::vector<unsigned char>& vchSig, const CPubKey& pubkey, const uint256& sighash) const
1681 : : {
1682 : 123560 : return pubkey.Verify(sighash, vchSig);
1683 : : }
1684 : :
1685 : : template <class T>
1686 : 24775 : bool GenericTransactionSignatureChecker<T>::VerifySchnorrSignature(std::span<const unsigned char> sig, const XOnlyPubKey& pubkey, const uint256& sighash) const
1687 : : {
1688 : 24775 : return pubkey.VerifySchnorr(sighash, sig);
1689 : : }
1690 : :
1691 : : template <class T>
1692 [ - + ]: 193035 : bool GenericTransactionSignatureChecker<T>::CheckECDSASignature(const std::vector<unsigned char>& vchSigIn, const std::vector<unsigned char>& vchPubKey, const CScript& scriptCode, SigVersion sigversion) const
1693 : : {
1694 [ + + ]: 193035 : CPubKey pubkey(vchPubKey);
1695 [ + + ]: 193035 : if (!pubkey.IsValid())
1696 : : return false;
1697 : :
1698 : : // Hash type is one byte tacked on to the end of the signature
1699 : 189409 : std::vector<unsigned char> vchSig(vchSigIn);
1700 [ + + ]: 189409 : if (vchSig.empty())
1701 : : return false;
1702 [ + + ]: 170463 : int nHashType = vchSig.back();
1703 : 170463 : vchSig.pop_back();
1704 : :
1705 : : // Witness sighashes need the amount.
1706 [ + + - + ]: 170463 : if (sigversion == SigVersion::WITNESS_V0 && amount < 0) return HandleMissingData(m_mdb);
1707 : :
1708 [ + - ]: 170463 : uint256 sighash = SignatureHash(scriptCode, *txTo, nIn, nHashType, amount, sigversion, this->txdata, &m_sighash_cache);
1709 : :
1710 [ + - + + ]: 170463 : if (!VerifyECDSASignature(vchSig, pubkey, sighash))
1711 : 9788 : return false;
1712 : :
1713 : : return true;
1714 : 189409 : }
1715 : :
1716 : : template <class T>
1717 : 26958 : bool GenericTransactionSignatureChecker<T>::CheckSchnorrSignature(std::span<const unsigned char> sig, std::span<const unsigned char> pubkey_in, SigVersion sigversion, ScriptExecutionData& execdata, ScriptError* serror) const
1718 : : {
1719 [ - + ]: 26958 : assert(sigversion == SigVersion::TAPROOT || sigversion == SigVersion::TAPSCRIPT);
1720 : : // Schnorr signatures have 32-byte public keys. The caller is responsible for enforcing this.
1721 [ - + ]: 26958 : assert(pubkey_in.size() == 32);
1722 : : // Note that in Tapscript evaluation, empty signatures are treated specially (invalid signature that does not
1723 : : // abort script execution). This is implemented in EvalChecksigTapscript, which won't invoke
1724 : : // CheckSchnorrSignature in that case. In other contexts, they are invalid like every other signature with
1725 : : // size different from 64 or 65.
1726 [ + + + + ]: 26958 : if (sig.size() != 64 && sig.size() != 65) return set_error(serror, SCRIPT_ERR_SCHNORR_SIG_SIZE);
1727 : :
1728 : 26932 : XOnlyPubKey pubkey{pubkey_in};
1729 : :
1730 [ + + ]: 26932 : uint8_t hashtype = SIGHASH_DEFAULT;
1731 [ + + ]: 26932 : if (sig.size() == 65) {
1732 : 19296 : hashtype = SpanPopBack(sig);
1733 [ + + ]: 19296 : if (hashtype == SIGHASH_DEFAULT) return set_error(serror, SCRIPT_ERR_SCHNORR_SIG_HASHTYPE);
1734 : : }
1735 : 26914 : uint256 sighash;
1736 [ + + ]: 26914 : if (!this->txdata) return HandleMissingData(m_mdb);
1737 [ + + ]: 26878 : if (!SignatureHashSchnorr(sighash, execdata, *txTo, nIn, hashtype, sigversion, *this->txdata, m_mdb)) {
1738 : 26958 : return set_error(serror, SCRIPT_ERR_SCHNORR_SIG_HASHTYPE);
1739 : : }
1740 [ + + ]: 26241 : if (!VerifySchnorrSignature(sig, pubkey, sighash)) return set_error(serror, SCRIPT_ERR_SCHNORR_SIG);
1741 : : return true;
1742 : : }
1743 : :
1744 : : template <class T>
1745 : 6400 : bool GenericTransactionSignatureChecker<T>::CheckLockTime(const CScriptNum& nLockTime) const
1746 : : {
1747 : : // There are two kinds of nLockTime: lock-by-blockheight
1748 : : // and lock-by-blocktime, distinguished by whether
1749 : : // nLockTime < LOCKTIME_THRESHOLD.
1750 : : //
1751 : : // We want to compare apples to apples, so fail the script
1752 : : // unless the type of nLockTime being tested is the same as
1753 : : // the nLockTime in the transaction.
1754 : : if (!(
1755 [ + + + + : 6400 : (txTo->nLockTime < LOCKTIME_THRESHOLD && nLockTime < LOCKTIME_THRESHOLD) ||
+ + ]
1756 [ + + ]: 421 : (txTo->nLockTime >= LOCKTIME_THRESHOLD && nLockTime >= LOCKTIME_THRESHOLD)
1757 : : ))
1758 : : return false;
1759 : :
1760 : : // Now that we know we're comparing apples-to-apples, the
1761 : : // comparison is a simple numeric one.
1762 [ + + ]: 6216 : if (nLockTime > (int64_t)txTo->nLockTime)
1763 : : return false;
1764 : :
1765 : : // Finally the nLockTime feature can be disabled in IsFinalTx()
1766 : : // and thus CHECKLOCKTIMEVERIFY bypassed if every txin has
1767 : : // been finalized by setting nSequence to maxint. The
1768 : : // transaction would be allowed into the blockchain, making
1769 : : // the opcode ineffective.
1770 : : //
1771 : : // Testing if this vin is not final is sufficient to
1772 : : // prevent this condition. Alternatively we could test all
1773 : : // inputs, but testing just this input minimizes the data
1774 : : // required to prove correct CHECKLOCKTIMEVERIFY execution.
1775 [ + + ]: 643 : if (CTxIn::SEQUENCE_FINAL == txTo->vin[nIn].nSequence)
1776 : 94 : return false;
1777 : :
1778 : : return true;
1779 : : }
1780 : :
1781 : : template <class T>
1782 : 6566 : bool GenericTransactionSignatureChecker<T>::CheckSequence(const CScriptNum& nSequence) const
1783 : : {
1784 : : // Relative lock times are supported by comparing the passed
1785 : : // in operand to the sequence number of the input.
1786 [ + + ]: 6566 : const int64_t txToSequence = (int64_t)txTo->vin[nIn].nSequence;
1787 : :
1788 : : // Fail if the transaction's version number is not set high
1789 : : // enough to trigger BIP 68 rules.
1790 [ + + ]: 6566 : if (txTo->version < 2)
1791 : : return false;
1792 : :
1793 : : // Sequence numbers with their most significant bit set are not
1794 : : // consensus constrained. Testing that the transaction's sequence
1795 : : // number do not have this bit set prevents using this property
1796 : : // to get around a CHECKSEQUENCEVERIFY check.
1797 [ + + ]: 6166 : if (txToSequence & CTxIn::SEQUENCE_LOCKTIME_DISABLE_FLAG)
1798 : : return false;
1799 : :
1800 : : // Mask off any bits that do not have consensus-enforced meaning
1801 : : // before doing the integer comparisons
1802 : 6117 : const uint32_t nLockTimeMask = CTxIn::SEQUENCE_LOCKTIME_TYPE_FLAG | CTxIn::SEQUENCE_LOCKTIME_MASK;
1803 : 6117 : const int64_t txToSequenceMasked = txToSequence & nLockTimeMask;
1804 [ + + ]: 6117 : const CScriptNum nSequenceMasked = nSequence & nLockTimeMask;
1805 : :
1806 : : // There are two kinds of nSequence: lock-by-blockheight
1807 : : // and lock-by-blocktime, distinguished by whether
1808 : : // nSequenceMasked < CTxIn::SEQUENCE_LOCKTIME_TYPE_FLAG.
1809 : : //
1810 : : // We want to compare apples to apples, so fail the script
1811 : : // unless the type of nSequenceMasked being tested is the same as
1812 : : // the nSequenceMasked in the transaction.
1813 : : if (!(
1814 [ + + + + ]: 6117 : (txToSequenceMasked < CTxIn::SEQUENCE_LOCKTIME_TYPE_FLAG && nSequenceMasked < CTxIn::SEQUENCE_LOCKTIME_TYPE_FLAG) ||
1815 [ + + ]: 381 : (txToSequenceMasked >= CTxIn::SEQUENCE_LOCKTIME_TYPE_FLAG && nSequenceMasked >= CTxIn::SEQUENCE_LOCKTIME_TYPE_FLAG)
1816 : : )) {
1817 : : return false;
1818 : : }
1819 : :
1820 : : // Now that we know we're comparing apples-to-apples, the
1821 : : // comparison is a simple numeric one.
1822 [ + + ]: 5929 : if (nSequenceMasked > txToSequenceMasked)
1823 : 5261 : return false;
1824 : :
1825 : : return true;
1826 : : }
1827 : :
1828 : : // explicit instantiation
1829 : : template class GenericTransactionSignatureChecker<CTransaction>;
1830 : : template class GenericTransactionSignatureChecker<CMutableTransaction>;
1831 : :
1832 : 156405 : 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)
1833 : : {
1834 : 156405 : std::vector<valtype> stack{stack_span.begin(), stack_span.end()};
1835 : :
1836 [ + + ]: 156405 : if (sigversion == SigVersion::TAPSCRIPT) {
1837 : : // OP_SUCCESSx processing overrides everything, including stack element size limits
1838 [ + + ]: 148684 : CScript::const_iterator pc = exec_script.begin();
1839 [ + + ]: 2986227 : while (pc < exec_script.end()) {
1840 : 2914373 : opcodetype opcode;
1841 [ + - + + ]: 2914373 : if (!exec_script.GetOp(pc, opcode)) {
1842 : : // Note how this condition would not be reached if an unknown OP_SUCCESSx was found
1843 [ + - ]: 389 : return set_error(serror, SCRIPT_ERR_BAD_OPCODE);
1844 : : }
1845 : : // New opcodes will be listed here. May use a different sigversion to modify existing opcodes.
1846 [ + - + + ]: 2913984 : if (IsOpSuccess(opcode)) {
1847 [ + + ]: 2099 : if (flags & SCRIPT_VERIFY_DISCOURAGE_OP_SUCCESS) {
1848 [ + - ]: 429 : return set_error(serror, SCRIPT_ERR_DISCOURAGE_OP_SUCCESS);
1849 : : }
1850 [ + - ]: 1670 : return set_success(serror);
1851 : : }
1852 : : }
1853 : :
1854 : : // Tapscript enforces initial stack size limits (altstack is empty here)
1855 [ - + + + : 71854 : if (stack.size() > MAX_STACK_SIZE) return set_error(serror, SCRIPT_ERR_STACK_SIZE);
+ - ]
1856 : : }
1857 : :
1858 : : // Disallow stack item size > MAX_SCRIPT_ELEMENT_SIZE in witness stack
1859 [ + + ]: 464689 : for (const valtype& elem : stack) {
1860 [ - + + + : 311096 : if (elem.size() > MAX_SCRIPT_ELEMENT_SIZE) return set_error(serror, SCRIPT_ERR_PUSH_SIZE);
+ - ]
1861 : : }
1862 : :
1863 : : // Run the script interpreter.
1864 [ + - + + ]: 153593 : if (!EvalScript(stack, exec_script, flags, checker, sigversion, execdata, serror)) return false;
1865 : :
1866 : : // Scripts inside witness implicitly require cleanstack behaviour
1867 [ - + + + : 137584 : if (stack.size() != 1) return set_error(serror, SCRIPT_ERR_CLEANSTACK);
+ + ]
1868 [ + - + + : 134219 : if (!CastToBool(stack.back())) return set_error(serror, SCRIPT_ERR_EVAL_FALSE);
+ - ]
1869 : : return true;
1870 : 156405 : }
1871 : :
1872 : 120600 : uint256 ComputeTapleafHash(uint8_t leaf_version, std::span<const unsigned char> script)
1873 : : {
1874 : 120600 : return (HashWriter{HASHER_TAPLEAF} << leaf_version << CompactSizeWriter(script.size()) << script).GetSHA256();
1875 : : }
1876 : :
1877 : 63784 : uint256 ComputeTapbranchHash(std::span<const unsigned char> a, std::span<const unsigned char> b)
1878 : : {
1879 : 63784 : HashWriter ss_branch{HASHER_TAPBRANCH};
1880 [ + + ]: 63784 : if (std::lexicographical_compare(a.begin(), a.end(), b.begin(), b.end())) {
1881 : 25599 : ss_branch << a << b;
1882 : : } else {
1883 : 38185 : ss_branch << b << a;
1884 : : }
1885 : 63784 : return ss_branch.GetSHA256();
1886 : : }
1887 : :
1888 : 79739 : uint256 ComputeTaprootMerkleRoot(std::span<const unsigned char> control, const uint256& tapleaf_hash)
1889 : : {
1890 [ - + ]: 79739 : assert(control.size() >= TAPROOT_CONTROL_BASE_SIZE);
1891 [ - + ]: 79739 : assert(control.size() <= TAPROOT_CONTROL_MAX_SIZE);
1892 [ - + ]: 79739 : assert((control.size() - TAPROOT_CONTROL_BASE_SIZE) % TAPROOT_CONTROL_NODE_SIZE == 0);
1893 : :
1894 : 79739 : const int path_len = (control.size() - TAPROOT_CONTROL_BASE_SIZE) / TAPROOT_CONTROL_NODE_SIZE;
1895 : 79739 : uint256 k = tapleaf_hash;
1896 [ + + ]: 120934 : for (int i = 0; i < path_len; ++i) {
1897 : 41195 : std::span node{std::span{control}.subspan(TAPROOT_CONTROL_BASE_SIZE + TAPROOT_CONTROL_NODE_SIZE * i, TAPROOT_CONTROL_NODE_SIZE)};
1898 : 41195 : k = ComputeTapbranchHash(k, node);
1899 : : }
1900 : 79739 : return k;
1901 : : }
1902 : :
1903 : 76195 : static bool VerifyTaprootCommitment(const std::vector<unsigned char>& control, const std::vector<unsigned char>& program, const uint256& tapleaf_hash)
1904 : : {
1905 [ - + - + ]: 76195 : assert(control.size() >= TAPROOT_CONTROL_BASE_SIZE);
1906 [ - + - + ]: 76195 : assert(program.size() >= uint256::size());
1907 : : //! The internal pubkey (x-only, so no Y coordinate parity).
1908 : 76195 : const XOnlyPubKey p{std::span{control}.subspan(1, TAPROOT_CONTROL_BASE_SIZE - 1)};
1909 : : //! The output pubkey (taken from the scriptPubKey).
1910 [ - + ]: 76195 : const XOnlyPubKey q{program};
1911 : : // Compute the Merkle root from the leaf and the provided path.
1912 [ - + ]: 76195 : const uint256 merkle_root = ComputeTaprootMerkleRoot(control, tapleaf_hash);
1913 : : // Verify that the output pubkey matches the tweaked internal pubkey, after correcting for parity.
1914 : 76195 : return q.CheckTapTweak(p, merkle_root, control[0] & 1);
1915 : : }
1916 : :
1917 : 228080 : 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)
1918 : : {
1919 : 228080 : CScript exec_script; //!< Actually executed script (last stack item in P2WSH; implied P2PKH script in P2WPKH; leaf script in P2TR)
1920 [ - + ]: 228080 : std::span stack{witness.stack};
1921 [ + + ]: 228080 : ScriptExecutionData execdata;
1922 : :
1923 [ + + ]: 228080 : if (witversion == 0) {
1924 [ - + + + ]: 139043 : if (program.size() == WITNESS_V0_SCRIPTHASH_SIZE) {
1925 : : // BIP141 P2WSH: 32-byte witness v0 program (which encodes SHA256(script))
1926 [ + + ]: 30960 : if (stack.size() == 0) {
1927 [ + + ]: 1170 : return set_error(serror, SCRIPT_ERR_WITNESS_PROGRAM_WITNESS_EMPTY);
1928 : : }
1929 : 29790 : const valtype& script_bytes = SpanPopBack(stack);
1930 : 29790 : exec_script = CScript(script_bytes.begin(), script_bytes.end());
1931 : 29790 : uint256 hash_exec_script;
1932 [ + - + + : 70881 : CSHA256().Write(exec_script.data(), exec_script.size()).Finalize(hash_exec_script.begin());
+ - + - ]
1933 [ + + ]: 29790 : if (memcmp(hash_exec_script.begin(), program.data(), 32)) {
1934 [ + - ]: 771 : return set_error(serror, SCRIPT_ERR_WITNESS_PROGRAM_MISMATCH);
1935 : : }
1936 [ + - ]: 29019 : return ExecuteWitnessScript(stack, exec_script, flags, SigVersion::WITNESS_V0, checker, execdata, serror);
1937 [ + + ]: 108083 : } else if (program.size() == WITNESS_V0_KEYHASH_SIZE) {
1938 : : // BIP141 P2WPKH: 20-byte witness v0 program (which encodes Hash160(pubkey))
1939 [ + + ]: 107483 : if (stack.size() != 2) {
1940 [ + + ]: 54439 : return set_error(serror, SCRIPT_ERR_WITNESS_PROGRAM_MISMATCH); // 2 items in witness
1941 : : }
1942 [ + - + - : 53044 : exec_script << OP_DUP << OP_HASH160 << program << OP_EQUALVERIFY << OP_CHECKSIG;
- + + - +
- ]
1943 [ + - ]: 53044 : return ExecuteWitnessScript(stack, exec_script, flags, SigVersion::WITNESS_V0, checker, execdata, serror);
1944 : : } else {
1945 [ + - ]: 600 : return set_error(serror, SCRIPT_ERR_WITNESS_PROGRAM_WRONG_LENGTH);
1946 : : }
1947 [ + + + + : 177358 : } else if (witversion == 1 && program.size() == WITNESS_V1_TAPROOT_SIZE && !is_p2sh) {
+ + ]
1948 : : // BIP341 Taproot: 32-byte non-P2SH witness v1 program (which encodes a P2C-tweaked pubkey)
1949 [ + + + - ]: 87756 : if (!(flags & SCRIPT_VERIFY_TAPROOT)) return set_success(serror);
1950 [ + + + + ]: 87645 : if (stack.size() == 0) return set_error(serror, SCRIPT_ERR_WITNESS_PROGRAM_WITNESS_EMPTY);
1951 [ + + + + : 79192 : if (stack.size() >= 2 && !stack.back().empty() && stack.back()[0] == ANNEX_TAG) {
+ + ]
1952 : : // Drop annex (this is non-standard; see IsWitnessStandard)
1953 : 179 : const valtype& annex = SpanPopBack(stack);
1954 [ + - + - : 179 : execdata.m_annex_hash = (HashWriter{} << annex).GetSHA256();
+ - ]
1955 : 179 : execdata.m_annex_present = true;
1956 : : } else {
1957 : 79013 : execdata.m_annex_present = false;
1958 : : }
1959 : 79192 : execdata.m_annex_init = true;
1960 [ + + ]: 79192 : if (stack.size() == 1) {
1961 : : // Key path spending (stack size is 1 after removing optional annex)
1962 [ - + - + : 2988 : if (!checker.CheckSchnorrSignature(stack.front(), program, SigVersion::TAPROOT, execdata, serror)) {
+ - + + ]
1963 : : return false; // serror is set
1964 : : }
1965 [ + + ]: 2594 : return set_success(serror);
1966 : : } else {
1967 : : // Script path spending (stack size is >1 after removing optional annex)
1968 : 76204 : const valtype& control = SpanPopBack(stack);
1969 : 76204 : const valtype& script = SpanPopBack(stack);
1970 [ - + + + : 76204 : if (control.size() < TAPROOT_CONTROL_BASE_SIZE || control.size() > TAPROOT_CONTROL_MAX_SIZE || ((control.size() - TAPROOT_CONTROL_BASE_SIZE) % TAPROOT_CONTROL_NODE_SIZE) != 0) {
+ + + + ]
1971 [ + - ]: 9 : return set_error(serror, SCRIPT_ERR_TAPROOT_WRONG_CONTROL_SIZE);
1972 : : }
1973 [ - + + - ]: 76195 : execdata.m_tapleaf_hash = ComputeTapleafHash(control[0] & TAPROOT_LEAF_MASK, script);
1974 [ + - + + ]: 76195 : if (!VerifyTaprootCommitment(control, program, execdata.m_tapleaf_hash)) {
1975 [ + - ]: 6 : return set_error(serror, SCRIPT_ERR_WITNESS_PROGRAM_MISMATCH);
1976 : : }
1977 : 76189 : execdata.m_tapleaf_hash_init = true;
1978 [ + + ]: 76189 : if ((control[0] & TAPROOT_LEAF_MASK) == TAPROOT_LEAF_TAPSCRIPT) {
1979 : : // Tapscript (leaf version 0xc0)
1980 : 74342 : exec_script = CScript(script.begin(), script.end());
1981 : 74342 : execdata.m_validation_weight_left = ::GetSerializeSize(witness.stack) + VALIDATION_WEIGHT_OFFSET;
1982 : 74342 : execdata.m_validation_weight_left_init = true;
1983 [ + - ]: 74342 : return ExecuteWitnessScript(stack, exec_script, flags, SigVersion::TAPSCRIPT, checker, execdata, serror);
1984 : : }
1985 [ + + ]: 1847 : if (flags & SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_TAPROOT_VERSION) {
1986 [ + - ]: 399 : return set_error(serror, SCRIPT_ERR_DISCOURAGE_UPGRADABLE_TAPROOT_VERSION);
1987 : : }
1988 [ + - ]: 1448 : return set_success(serror);
1989 : : }
1990 [ + + + - : 1281 : } else if (!is_p2sh && CScript::IsPayToAnchor(witversion, program)) {
+ + ]
1991 : : return true;
1992 : : } else {
1993 [ + + ]: 1271 : if (flags & SCRIPT_VERIFY_DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM) {
1994 [ + - ]: 228758 : return set_error(serror, SCRIPT_ERR_DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM);
1995 : : }
1996 : : // Other version/size/p2sh combinations return true for future softfork compatibility
1997 : : return true;
1998 : : }
1999 : : // There is intentionally no return statement here, to be able to use "control reaches end of non-void function" warnings to detect gaps in the logic above.
2000 : 228080 : }
2001 : :
2002 : 768008 : bool VerifyScript(const CScript& scriptSig, const CScript& scriptPubKey, const CScriptWitness* witness, script_verify_flags flags, const BaseSignatureChecker& checker, ScriptError* serror)
2003 : : {
2004 [ + + + + ]: 768468 : static const CScriptWitness emptyWitness;
2005 [ + + ]: 768008 : if (witness == nullptr) {
2006 : 67568 : witness = &emptyWitness;
2007 : : }
2008 : 768008 : bool hadWitness = false;
2009 : :
2010 [ + + ]: 768008 : set_error(serror, SCRIPT_ERR_UNKNOWN_ERROR);
2011 : :
2012 [ + + + + ]: 768008 : if ((flags & SCRIPT_VERIFY_SIGPUSHONLY) != 0 && !scriptSig.IsPushOnly()) {
2013 [ + - ]: 777726 : return set_error(serror, SCRIPT_ERR_SIG_PUSHONLY);
2014 : : }
2015 : :
2016 : : // scriptSig and scriptPubKey must be evaluated sequentially on the same stack
2017 : : // rather than being simply concatenated (see CVE-2010-5141)
2018 : 758290 : std::vector<std::vector<unsigned char> > stack, stackCopy;
2019 [ + - + + ]: 758290 : if (!EvalScript(stack, scriptSig, flags, checker, SigVersion::BASE, serror))
2020 : : // serror is set
2021 : : return false;
2022 [ + + ]: 751347 : if (flags & SCRIPT_VERIFY_P2SH)
2023 [ + - ]: 551328 : stackCopy = stack;
2024 [ + - + + ]: 751347 : if (!EvalScript(stack, scriptPubKey, flags, checker, SigVersion::BASE, serror))
2025 : : // serror is set
2026 : : return false;
2027 [ + + ]: 583231 : if (stack.empty())
2028 [ + - ]: 2746 : return set_error(serror, SCRIPT_ERR_EVAL_FALSE);
2029 [ + - + + ]: 580485 : if (CastToBool(stack.back()) == false)
2030 [ + - ]: 7811 : return set_error(serror, SCRIPT_ERR_EVAL_FALSE);
2031 : :
2032 : : // Bare witness programs
2033 : 572674 : int witnessversion;
2034 : 572674 : std::vector<unsigned char> witnessprogram;
2035 [ + + ]: 572674 : if (flags & SCRIPT_VERIFY_WITNESS) {
2036 [ + - + + ]: 306742 : if (scriptPubKey.IsWitnessProgram(witnessversion, witnessprogram)) {
2037 : 213451 : hadWitness = true;
2038 [ + + + + ]: 213453 : if (scriptSig.size() != 0) {
2039 : : // The scriptSig must be _exactly_ CScript(), otherwise we reintroduce malleability.
2040 [ + - ]: 1074 : return set_error(serror, SCRIPT_ERR_WITNESS_MALLEATED);
2041 : : }
2042 [ + - + + ]: 212377 : if (!VerifyWitnessProgram(*witness, witnessversion, witnessprogram, flags, checker, serror, /*is_p2sh=*/false)) {
2043 : : return false;
2044 : : }
2045 : : // Bypass the cleanstack check at the end. The actual stack is obviously not clean
2046 : : // for witness programs.
2047 [ + - ]: 132451 : stack.resize(1);
2048 : : }
2049 : : }
2050 : :
2051 : : // Additional validation for spend-to-script-hash transactions:
2052 [ + + + - : 491674 : if ((flags & SCRIPT_VERIFY_P2SH) && scriptPubKey.IsPayToScriptHash())
+ + ]
2053 : : {
2054 : : // scriptSig must be literals-only or validation fails
2055 [ + - + + ]: 50636 : if (!scriptSig.IsPushOnly())
2056 [ + - ]: 240 : return set_error(serror, SCRIPT_ERR_SIG_PUSHONLY);
2057 : :
2058 : : // Restore stack.
2059 : 50396 : swap(stack, stackCopy);
2060 : :
2061 : : // stack cannot be empty here, because if it was the
2062 : : // P2SH HASH <> EQUAL scriptPubKey would be evaluated with
2063 : : // an empty stack and the EvalScript above would return false.
2064 [ - + ]: 50396 : assert(!stack.empty());
2065 : :
2066 : 50396 : const valtype& pubKeySerialized = stack.back();
2067 : 50396 : CScript pubKey2(pubKeySerialized.begin(), pubKeySerialized.end());
2068 [ + - ]: 50396 : popstack(stack);
2069 : :
2070 [ + - + + ]: 50396 : if (!EvalScript(stack, pubKey2, flags, checker, SigVersion::BASE, serror))
2071 : : // serror is set
2072 : : return false;
2073 [ + + ]: 39635 : if (stack.empty())
2074 [ + - ]: 1285 : return set_error(serror, SCRIPT_ERR_EVAL_FALSE);
2075 [ + - + + ]: 38350 : if (!CastToBool(stack.back()))
2076 [ + - ]: 266 : return set_error(serror, SCRIPT_ERR_EVAL_FALSE);
2077 : :
2078 : : // P2SH witness program
2079 [ + + ]: 38084 : if (flags & SCRIPT_VERIFY_WITNESS) {
2080 [ + - + + ]: 32702 : if (pubKey2.IsWitnessProgram(witnessversion, witnessprogram)) {
2081 : 16217 : hadWitness = true;
2082 [ - + + - : 32434 : if (scriptSig != CScript() << std::vector<unsigned char>(pubKey2.begin(), pubKey2.end())) {
+ + ]
2083 : : // The scriptSig must be _exactly_ a single push of the redeemScript. Otherwise we
2084 : : // reintroduce malleability.
2085 [ + - ]: 22549 : return set_error(serror, SCRIPT_ERR_WITNESS_MALLEATED_P2SH);
2086 : : }
2087 [ + - + + ]: 15703 : if (!VerifyWitnessProgram(*witness, witnessversion, witnessprogram, flags, checker, serror, /*is_p2sh=*/true)) {
2088 : : return false;
2089 : : }
2090 : : // Bypass the cleanstack check at the end. The actual stack is obviously not clean
2091 : : // for witness programs.
2092 [ + - ]: 6494 : stack.resize(1);
2093 : : }
2094 : : }
2095 : 50396 : }
2096 : :
2097 : : // The CLEANSTACK check is only performed after potential P2SH evaluation,
2098 : : // as the non-P2SH evaluation of a P2SH script will obviously not result in
2099 : : // a clean stack (the P2SH inputs remain). The same holds for witness evaluation.
2100 [ + + ]: 469399 : if ((flags & SCRIPT_VERIFY_CLEANSTACK) != 0) {
2101 : : // Disallow CLEANSTACK without P2SH, as otherwise a switch CLEANSTACK->P2SH+CLEANSTACK
2102 : : // would be possible, which is not a softfork (and P2SH should be one).
2103 [ - + ]: 99459 : assert((flags & SCRIPT_VERIFY_P2SH) != 0);
2104 [ - + ]: 99459 : assert((flags & SCRIPT_VERIFY_WITNESS) != 0);
2105 [ - + + + ]: 99459 : if (stack.size() != 1) {
2106 [ + - ]: 1164 : return set_error(serror, SCRIPT_ERR_CLEANSTACK);
2107 : : }
2108 : : }
2109 : :
2110 [ + + ]: 468235 : if (flags & SCRIPT_VERIFY_WITNESS) {
2111 : : // We can't check for correct unexpected witness data if P2SH was off, so require
2112 : : // that WITNESS implies P2SH. Otherwise, going from WITNESS->P2SH+WITNESS would be
2113 : : // possible, which is not a softfork.
2114 [ - + ]: 204213 : assert((flags & SCRIPT_VERIFY_P2SH) != 0);
2115 [ + + + + ]: 204213 : if (!hadWitness && !witness->IsNull()) {
2116 [ + - ]: 918 : return set_error(serror, SCRIPT_ERR_WITNESS_UNEXPECTED);
2117 : : }
2118 : : }
2119 : :
2120 [ + + ]: 1016961 : return set_success(serror);
2121 : 758290 : }
2122 : :
2123 : 124324 : size_t static WitnessSigOps(int witversion, const std::vector<unsigned char>& witprogram, const CScriptWitness& witness)
2124 : : {
2125 [ + + ]: 124324 : if (witversion == 0) {
2126 [ - + + + ]: 26022 : if (witprogram.size() == WITNESS_V0_KEYHASH_SIZE)
2127 : : return 1;
2128 : :
2129 [ + - - + : 10426 : if (witprogram.size() == WITNESS_V0_SCRIPTHASH_SIZE && witness.stack.size() > 0) {
+ + ]
2130 : 10412 : CScript subscript(witness.stack.back().begin(), witness.stack.back().end());
2131 [ + - ]: 10412 : return subscript.GetSigOpCount(true);
2132 : 10412 : }
2133 : : }
2134 : :
2135 : : // Future flags may be implemented here.
2136 : : return 0;
2137 : : }
2138 : :
2139 : 162809 : size_t CountWitnessSigOps(const CScript& scriptSig, const CScript& scriptPubKey, const CScriptWitness* witness, script_verify_flags flags)
2140 : : {
2141 [ + + + - ]: 163250 : static const CScriptWitness witnessEmpty;
2142 : :
2143 [ + + ]: 162809 : if ((flags & SCRIPT_VERIFY_WITNESS) == 0) {
2144 : : return 0;
2145 : : }
2146 [ - + ]: 162806 : assert((flags & SCRIPT_VERIFY_P2SH) != 0);
2147 : :
2148 : 162806 : int witnessversion;
2149 : 162806 : std::vector<unsigned char> witnessprogram;
2150 [ + - + + ]: 162806 : if (scriptPubKey.IsWitnessProgram(witnessversion, witnessprogram)) {
2151 [ - + + - ]: 121128 : return WitnessSigOps(witnessversion, witnessprogram, witness ? *witness : witnessEmpty);
2152 : : }
2153 : :
2154 [ + - + + : 41678 : if (scriptPubKey.IsPayToScriptHash() && scriptSig.IsPushOnly()) {
+ - + - ]
2155 [ + + ]: 10833 : CScript::const_iterator pc = scriptSig.begin();
2156 : 10833 : std::vector<unsigned char> data;
2157 [ + + ]: 30066 : while (pc < scriptSig.end()) {
2158 : 19233 : opcodetype opcode;
2159 [ + - ]: 19233 : scriptSig.GetOp(pc, opcode, data);
2160 : : }
2161 : 10833 : CScript subscript(data.begin(), data.end());
2162 [ + - + + ]: 10833 : if (subscript.IsWitnessProgram(witnessversion, witnessprogram)) {
2163 [ - + + - ]: 3196 : return WitnessSigOps(witnessversion, witnessprogram, witness ? *witness : witnessEmpty);
2164 : : }
2165 : 10833 : }
2166 : :
2167 : : return 0;
2168 : 162806 : }
2169 : :
2170 : 337 : const std::map<std::string, script_verify_flag_name>& ScriptFlagNamesToEnum()
2171 : : {
2172 : : #define FLAG_NAME(flag) {std::string(#flag), SCRIPT_VERIFY_##flag}
2173 : 337 : static const std::map<std::string, script_verify_flag_name> g_names_to_enum{
2174 [ + - ]: 314 : FLAG_NAME(P2SH),
2175 : 314 : FLAG_NAME(STRICTENC),
2176 : 314 : FLAG_NAME(DERSIG),
2177 : 314 : FLAG_NAME(LOW_S),
2178 : 314 : FLAG_NAME(SIGPUSHONLY),
2179 : 314 : FLAG_NAME(MINIMALDATA),
2180 : 314 : FLAG_NAME(NULLDUMMY),
2181 : 314 : FLAG_NAME(DISCOURAGE_UPGRADABLE_NOPS),
2182 : 314 : FLAG_NAME(CLEANSTACK),
2183 : 314 : FLAG_NAME(MINIMALIF),
2184 : 314 : FLAG_NAME(NULLFAIL),
2185 : 314 : FLAG_NAME(CHECKLOCKTIMEVERIFY),
2186 : 314 : FLAG_NAME(CHECKSEQUENCEVERIFY),
2187 : 314 : FLAG_NAME(WITNESS),
2188 : 314 : FLAG_NAME(DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM),
2189 : 314 : FLAG_NAME(WITNESS_PUBKEYTYPE),
2190 : 314 : FLAG_NAME(CONST_SCRIPTCODE),
2191 : 314 : FLAG_NAME(TAPROOT),
2192 : 314 : FLAG_NAME(DISCOURAGE_UPGRADABLE_PUBKEYTYPE),
2193 : 314 : FLAG_NAME(DISCOURAGE_OP_SUCCESS),
2194 : 314 : FLAG_NAME(DISCOURAGE_UPGRADABLE_TAPROOT_VERSION),
2195 [ + + + - : 3791 : };
+ + - - ]
2196 : : #undef FLAG_NAME
2197 : 337 : return g_names_to_enum;
2198 [ + - + - : 3297 : }
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- + - + -
+ - + - +
- - + -
- ]
2199 : :
2200 : 231 : std::vector<std::string> GetScriptFlagNames(script_verify_flags flags)
2201 : : {
2202 : 231 : std::vector<std::string> res;
2203 [ + + ]: 231 : if (flags == SCRIPT_VERIFY_NONE) {
2204 : : return res;
2205 : : }
2206 : 192 : script_verify_flags leftover = flags;
2207 [ + - + + : 4224 : for (const auto& [name, flag] : ScriptFlagNamesToEnum()) {
+ + ]
2208 [ + + ]: 4032 : if ((flags & flag) != 0) {
2209 [ + - ]: 765 : res.push_back(name);
2210 : 765 : leftover &= ~flag;
2211 : : }
2212 : : }
2213 [ + + ]: 192 : if (leftover != 0) {
2214 [ + - ]: 8 : res.push_back(strprintf("0x%08x", leftover.as_int()));
2215 : : }
2216 : : return res;
2217 : 0 : }
|