def input_script_multisig( multisig: MultisigRedeemScriptType, signature: bytes, signature_index: int, sighash: int, ): signatures = multisig.signatures # other signatures if len(signatures[signature_index]) > 0: raise ScriptsError("Invalid multisig parameters") signatures[signature_index] = signature # our signature w = bytearray() # Starts with OP_FALSE because of an old OP_CHECKMULTISIG bug, which # consumes one additional item on the stack: # https://bitcoin.org/en/developer-guide#standard-transactions w.append(0x00) for s in signatures: if len(s): append_signature(w, s, sighash) # redeem script pubkeys = multisig_get_pubkeys(multisig) redeem_script = output_script_multisig(pubkeys, multisig.m) write_op_push(w, len(redeem_script)) write_bytes(w, redeem_script) return w
def input_script_multisig( multisig: MultisigRedeemScriptType, signature: bytes, signature_index: int, sighash: int, coin: CoinInfo, ) -> bytearray: signatures = multisig.signatures # other signatures if len(signatures[signature_index]) > 0: raise ScriptsError("Invalid multisig parameters") signatures[signature_index] = signature # our signature # length of the redeem script pubkeys = multisig_get_pubkeys(multisig) redeem_script_length = output_script_multisig_length(pubkeys, multisig.m) # length of the result total_length = 0 if utils.BITCOIN_ONLY or not coin.decred: total_length += 1 # OP_FALSE for s in signatures: total_length += 1 + len(s) + 1 # length, signature, sighash total_length += 1 + redeem_script_length # length, script w = empty_bytearray(total_length) if utils.BITCOIN_ONLY or not coin.decred: # Starts with OP_FALSE because of an old OP_CHECKMULTISIG bug, which # consumes one additional item on the stack: # https://bitcoin.org/en/developer-guide#standard-transactions w.append(0x00) for s in signatures: if len(s): append_signature(w, s, sighash) # redeem script write_op_push(w, redeem_script_length) write_output_script_multisig(w, pubkeys, multisig.m) return w
def append_pubkey(w: bytearray, pubkey: bytes) -> bytearray: write_op_push(w, len(pubkey)) write_bytes(w, pubkey) return w
def append_signature(w: bytearray, signature: bytes, sighash: int) -> bytearray: write_op_push(w, len(signature) + 1) write_bytes(w, signature) w.append(sighash) return w
def output_script_paytoopreturn(data: bytes) -> bytearray: w = empty_bytearray(1 + 5 + len(data)) w.append(0x6A) # OP_RETURN write_op_push(w, len(data)) w.extend(data) return w
def append_pubkey(w: Writer, pubkey: bytes) -> None: write_op_push(w, len(pubkey)) write_bytes_unchecked(w, pubkey)
def append_signature(w: Writer, signature: bytes, sighash: int) -> None: write_op_push(w, len(signature) + 1) write_bytes_unchecked(w, signature) w.append(sighash)