def T(hex_script): invalid_script = CScript(x(hex_script)) self.assertFalse(invalid_script.is_push_only())
def T(serialized: str, b: bool) -> None: script = CScript(x(serialized)) self.assertEqual(script.is_push_only(), b)
def T(serialized, b): script = CScript(x(serialized)) self.assertEqual(script.is_push_only(), b)
def VerifyScript(scriptSig: CScript, scriptPubKey: CScript, txTo: 'bitcointx.core.CTransaction', inIdx: int, flags: Optional[Union[Tuple[ScriptVerifyFlag_Type, ...], Set[ScriptVerifyFlag_Type]]] = None, amount: int = 0, witness: Optional[CScriptWitness] = None ) -> None: """Verify a scriptSig satisfies a scriptPubKey scriptSig - Signature scriptPubKey - PubKey txTo - Spending transaction inIdx - Index of the transaction input containing scriptSig Raises a ValidationError subclass if the validation fails. """ ensure_isinstance(scriptSig, CScript, 'scriptSig') if not type(scriptSig) == type(scriptPubKey): raise TypeError( "scriptSig and scriptPubKey must be of the same script class") script_class = scriptSig.__class__ if flags is None: flags = STANDARD_SCRIPT_VERIFY_FLAGS - UNHANDLED_SCRIPT_VERIFY_FLAGS else: flags = set(flags) # might be passed as tuple if flags & UNHANDLED_SCRIPT_VERIFY_FLAGS: raise VerifyScriptError( "some of the flags cannot be handled by current code: {}" .format(script_verify_flags_to_string(flags & UNHANDLED_SCRIPT_VERIFY_FLAGS))) stack: List[bytes] = [] EvalScript(stack, scriptSig, txTo, inIdx, flags=flags) if SCRIPT_VERIFY_P2SH in flags: stackCopy = list(stack) EvalScript(stack, scriptPubKey, txTo, inIdx, flags=flags) if len(stack) == 0: raise VerifyScriptError("scriptPubKey left an empty stack") if not _CastToBool(stack[-1]): raise VerifyScriptError("scriptPubKey returned false") hadWitness = False if witness is None: witness = CScriptWitness([]) if SCRIPT_VERIFY_WITNESS in flags and scriptPubKey.is_witness_scriptpubkey(): hadWitness = True if scriptSig: raise VerifyScriptError("scriptSig is not empty") VerifyWitnessProgram(witness, scriptPubKey.witness_version(), scriptPubKey.witness_program(), txTo, inIdx, flags=flags, amount=amount, script_class=script_class) # Bypass the cleanstack check at the end. The actual stack is obviously not clean # for witness programs. stack = stack[:1] # Additional validation for spend-to-script-hash transactions if SCRIPT_VERIFY_P2SH in flags and scriptPubKey.is_p2sh(): if not scriptSig.is_push_only(): raise VerifyScriptError("P2SH scriptSig not is_push_only()") # restore stack stack = stackCopy # stack cannot be empty here, because if it was the # P2SH HASH <> EQUAL scriptPubKey would be evaluated with # an empty stack and the EvalScript above would return false. assert len(stack) pubKey2 = script_class(stack.pop()) EvalScript(stack, pubKey2, txTo, inIdx, flags=flags) if not len(stack): raise VerifyScriptError("P2SH inner scriptPubKey left an empty stack") if not _CastToBool(stack[-1]): raise VerifyScriptError("P2SH inner scriptPubKey returned false") # P2SH witness program if SCRIPT_VERIFY_WITNESS in flags and pubKey2.is_witness_scriptpubkey(): hadWitness = True if scriptSig != script_class([pubKey2]): raise VerifyScriptError("scriptSig is not exactly a single push of the redeemScript") VerifyWitnessProgram(witness, pubKey2.witness_version(), pubKey2.witness_program(), txTo, inIdx, flags=flags, amount=amount, script_class=script_class) # Bypass the cleanstack check at the end. The actual stack is obviously not clean # for witness programs. stack = stack[:1] if SCRIPT_VERIFY_CLEANSTACK in flags: if SCRIPT_VERIFY_P2SH not in flags: raise ValueError( 'SCRIPT_VERIFY_CLEANSTACK requires SCRIPT_VERIFY_P2SH') if len(stack) == 0: raise VerifyScriptError("scriptPubKey left an empty stack") elif len(stack) != 1: raise VerifyScriptError("scriptPubKey left extra items on stack") if SCRIPT_VERIFY_WITNESS in flags: # We can't check for correct unexpected witness data if P2SH was off, so require # that WITNESS implies P2SH. Otherwise, going from WITNESS->P2SH+WITNESS would be # possible, which is not a softfork. if SCRIPT_VERIFY_P2SH not in flags: raise ValueError( "SCRIPT_VERIFY_WITNESS requires SCRIPT_VERIFY_P2SH") if not hadWitness and witness: raise VerifyScriptError("Unexpected witness")