def get_multisig_script(address): # Unpack multiāsig address. signatures_required, pubkeys, signatures_possible = script.extract_array(address) # Required signatures. if signatures_required == 1: op_required = OP_1 elif signatures_required == 2: op_required = OP_2 elif signatures_required == 3: op_required = OP_3 else: raise script.InputError('Required signatures must be 1, 2 or 3.') # Required signatures. # Note 1-of-1 addresses are not supported (they don't go through extract_array anyway). if signatures_possible == 2: op_total = OP_2 elif signatures_possible == 3: op_total = OP_3 else: raise script.InputError('Total possible signatures must be 2 or 3.') # Construct script. tx_script = op_required # Required signatures for public_key in pubkeys: public_key = binascii.unhexlify(public_key) tx_script += op_push(len(public_key)) # Push bytes of public key tx_script += public_key # Data chunk (fake) public key tx_script += op_total # Total signatures tx_script += OP_CHECKMULTISIG # OP_CHECKMULTISIG return tx_script
def get_pubkeys(address, pubkey_resolver=input_pubkey): pubkeys = [] if script.is_multisig(address): _, pubs, _ = script.extract_array(address) for pub in pubs: pubkey = get_pubkey_monosig(pub, pubkey_resolver=pubkey_resolver) if pubkey: pubkeys.append(pubkey) else: pubkey = get_pubkey_monosig(address, pubkey_resolver=pubkey_resolver) if pubkey: pubkeys.append(pubkey) return pubkeys
def get_dust_return_pubkey(source, provided_pubkeys, encoding): """Return the pubkey to which dust from data outputs will be sent. This pubkey is used in multi-sig data outputs (as the only real pubkey) to make those the outputs spendable. It is derived from the source address, so that the dust is spendable by the creator of the transaction. """ # Get hex dust return pubkey. if script.is_multisig(source): a, self_pubkeys, b = script.extract_array(backend.multisig_pubkeyhashes_to_pubkeys(source, provided_pubkeys)) dust_return_pubkey_hex = self_pubkeys[0] else: dust_return_pubkey_hex = backend.pubkeyhash_to_pubkey(source, provided_pubkeys) # Convert hex public key into the (binary) dust return pubkey. try: dust_return_pubkey = binascii.unhexlify(dust_return_pubkey_hex) except binascii.Error: raise script.InputError('Invalid private key.') return dust_return_pubkey
def multisig_pubkeyhashes_to_pubkeys(address, provided_pubkeys=None): signatures_required, pubkeyhashes, signatures_possible = script.extract_array(address) pubkeys = [pubkeyhash_to_pubkey(pubkeyhash, provided_pubkeys) for pubkeyhash in pubkeyhashes] return script.construct_array(signatures_required, pubkeys, signatures_possible)