@@ -1478,9 +1478,9 @@ bool GenericTransactionSignatureChecker<T>::CheckSequence(const CScriptNum& nSeq
14781478template class GenericTransactionSignatureChecker <CTransaction>;
14791479template class GenericTransactionSignatureChecker <CMutableTransaction>;
14801480
1481- static bool ExecuteWitnessScript (std::vector<valtype>::const_iterator begin, std::vector< valtype>::const_iterator end , const CScript& scriptPubKey, unsigned int flags, SigVersion sigversion, const BaseSignatureChecker& checker, ScriptError* serror)
1481+ static bool ExecuteWitnessScript (const Span< const valtype>& stack_span , const CScript& scriptPubKey, unsigned int flags, SigVersion sigversion, const BaseSignatureChecker& checker, ScriptError* serror)
14821482{
1483- std::vector<valtype> stack{begin, end};
1483+ std::vector<valtype> stack{stack_span. begin (), stack_span. end () };
14841484
14851485 // Disallow stack item size > MAX_SCRIPT_ELEMENT_SIZE in witness stack
14861486 for (const valtype& elem : stack) {
@@ -1499,27 +1499,29 @@ static bool ExecuteWitnessScript(std::vector<valtype>::const_iterator begin, std
14991499static bool VerifyWitnessProgram (const CScriptWitness& witness, int witversion, const std::vector<unsigned char >& program, unsigned int flags, const BaseSignatureChecker& checker, ScriptError* serror)
15001500{
15011501 CScript scriptPubKey;
1502+ Span<const valtype> stack = MakeSpan (witness.stack );
15021503
15031504 if (witversion == 0 ) {
15041505 if (program.size () == WITNESS_V0_SCRIPTHASH_SIZE) {
15051506 // Version 0 segregated witness program: SHA256(CScript) inside the program, CScript + inputs in witness
1506- if (witness. stack .size () == 0 ) {
1507+ if (stack.size () == 0 ) {
15071508 return set_error (serror, SCRIPT_ERR_WITNESS_PROGRAM_WITNESS_EMPTY);
15081509 }
1509- scriptPubKey = CScript (witness.stack .back ().begin (), witness.stack .back ().end ());
1510+ const valtype& script_bytes = SpanPopBack (stack);
1511+ scriptPubKey = CScript (script_bytes.begin (), script_bytes.end ());
15101512 uint256 hashScriptPubKey;
15111513 CSHA256 ().Write (&scriptPubKey[0 ], scriptPubKey.size ()).Finalize (hashScriptPubKey.begin ());
15121514 if (memcmp (hashScriptPubKey.begin (), program.data (), 32 )) {
15131515 return set_error (serror, SCRIPT_ERR_WITNESS_PROGRAM_MISMATCH);
15141516 }
1515- return ExecuteWitnessScript (witness. stack . begin (), witness. stack . end () - 1 , scriptPubKey, flags, SigVersion::WITNESS_V0, checker, serror);
1517+ return ExecuteWitnessScript (stack, scriptPubKey, flags, SigVersion::WITNESS_V0, checker, serror);
15161518 } else if (program.size () == WITNESS_V0_KEYHASH_SIZE) {
15171519 // Special case for pay-to-pubkeyhash; signature + pubkey in witness
1518- if (witness. stack .size () != 2 ) {
1520+ if (stack.size () != 2 ) {
15191521 return set_error (serror, SCRIPT_ERR_WITNESS_PROGRAM_MISMATCH); // 2 items in witness
15201522 }
15211523 scriptPubKey << OP_DUP << OP_HASH160 << program << OP_EQUALVERIFY << OP_CHECKSIG;
1522- return ExecuteWitnessScript (witness. stack . begin (), witness. stack . end () , scriptPubKey, flags, SigVersion::WITNESS_V0, checker, serror);
1524+ return ExecuteWitnessScript (stack, scriptPubKey, flags, SigVersion::WITNESS_V0, checker, serror);
15231525 } else {
15241526 return set_error (serror, SCRIPT_ERR_WITNESS_PROGRAM_WRONG_LENGTH);
15251527 }
0 commit comments