@@ -152,7 +152,7 @@ def _CheckSig(sig, pubkey, script, txTo, inIdx, err_raiser):
152152 return key .verify (h , sig )
153153
154154
155- def _CheckMultiSig (opcode , script , stack , txTo , inIdx , err_raiser , nOpCount ):
155+ def _CheckMultiSig (opcode , script , stack , txTo , inIdx , flags , err_raiser , nOpCount ):
156156 i = 1
157157 if len (stack ) < i :
158158 err_raiser (MissingOpArgumentsError , opcode , stack , i )
@@ -209,10 +209,18 @@ def _CheckMultiSig(opcode, script, stack, txTo, inIdx, err_raiser, nOpCount):
209209 if opcode == OP_CHECKMULTISIGVERIFY :
210210 err_raiser (VerifyOpFailedError , opcode )
211211
212- while i > 0 :
212+ while i > 1 :
213213 stack .pop ()
214214 i -= 1
215215
216+ # Note how Bitcoin Core duplicates the len(stack) check, rather than
217+ # letting pop() handle it; maybe that's wrong?
218+ if len (stack ) and SCRIPT_VERIFY_NULLDUMMY in flags :
219+ if stack [- 1 ] != b'' :
220+ raise err_raiser (ArgumentsInvalidError , opcode , "dummy value not OP_0" )
221+
222+ stack .pop ()
223+
216224 if opcode == OP_CHECKMULTISIG :
217225 if success :
218226 stack .append (b"\x01 " )
@@ -478,7 +486,7 @@ def check_args(n):
478486
479487 elif sop == OP_CHECKMULTISIG or sop == OP_CHECKMULTISIGVERIFY :
480488 tmpScript = CScript (scriptIn [pbegincodehash :])
481- _CheckMultiSig (sop , tmpScript , stack , txTo , inIdx , err_raiser , nOpCount )
489+ _CheckMultiSig (sop , tmpScript , stack , txTo , inIdx , flags , err_raiser , nOpCount )
482490
483491 elif sop == OP_CHECKSIG or sop == OP_CHECKSIGVERIFY :
484492 check_args (2 )
0 commit comments