def make_wallet_keys(data_privkey=None, owner_privkey=None, payment_privkey=None): """ For testing. DO NOT USE """ ret = { 'owner_privkey': None, 'data_privkey': None, 'payment_privkey': None, } if data_privkey is not None: if not virtualchain.is_singlesig(data_privkey): raise ValueError('Invalid data key info') pk_data = ecdsa_private_key(data_privkey).to_hex() ret['data_privkey'] = pk_data if owner_privkey is not None: if virtualchain.is_multisig(owner_privkey): pks = owner_privkey['private_keys'] m, _ = virtualchain.parse_multisig_redeemscript(owner_privkey['redeem_script']) assert m <= len(pks) multisig_info = virtualchain.make_multisig_info(m, pks) ret['owner_privkey'] = multisig_info ret['owner_addresses'] = [virtualchain.get_privkey_address(multisig_info)] elif virtualchain.is_singlesig(owner_privkey): pk_owner = ecdsa_private_key(owner_privkey).to_hex() ret['owner_privkey'] = pk_owner ret['owner_addresses'] = [virtualchain.get_privkey_address(pk_owner)] else: raise ValueError('Invalid owner key info') if payment_privkey is None: return ret if virtualchain.is_multisig(payment_privkey): pks = payment_privkey['private_keys'] m, _ = virtualchain.parse_multisig_redeemscript(payment_privkey['redeem_script']) assert m <= len(pks) multisig_info = virtualchain.make_multisig_info(m, pks) ret['payment_privkey'] = multisig_info ret['payment_addresses'] = [virtualchain.get_privkey_address(multisig_info)] elif virtualchain.is_singlesig(payment_privkey): pk_payment = ecdsa_private_key(payment_privkey).to_hex() ret['payment_privkey'] = pk_payment ret['payment_addresses'] = [virtualchain.get_privkey_address(pk_payment)] else: raise ValueError('Invalid payment key info') ret['data_pubkey'] = ecdsa_private_key(ret['data_privkey']).public_key().to_hex() ret['data_pubkeys'] = [ret['data_pubkey']] return ret
def make_wallet_keys(data_privkey=None, owner_privkey=None, payment_privkey=None): """ For testing. DO NOT USE """ ret = { 'owner_privkey': None, 'data_privkey': None, 'payment_privkey': None } if data_privkey is not None: if not is_singlesig(data_privkey): raise ValueError("Invalid data key info") pk_data = virtualchain.BitcoinPrivateKey(data_privkey).to_hex() ret['data_privkey'] = pk_data if owner_privkey is not None: if is_multisig(owner_privkey): pks = [ virtualchain.BitcoinPrivateKey(pk).to_hex() for pk in owner_privkey['private_keys'] ] m, pubs = virtualchain.parse_multisig_redeemscript( owner_privkey['redeem_script']) ret['owner_privkey'] = virtualchain.make_multisig_info(m, pks) elif is_singlesig(owner_privkey): pk_owner = virtualchain.BitcoinPrivateKey(owner_privkey).to_hex() ret['owner_privkey'] = pk_owner else: raise ValueError("Invalid owner key info") if payment_privkey is not None: if is_multisig(payment_privkey): pks = [ virtualchain.BitcoinPrivateKey(pk).to_hex() for pk in payment_privkey['private_keys'] ] m, pubs = virtualchain.parse_multisig_redeemscript( payment_privkey['redeem_script']) ret['payment_privkey'] = virtualchain.make_multisig_info(m, pks) elif is_singlesig(payment_privkey): pk_payment = virtualchain.BitcoinPrivateKey( payment_privkey).to_hex() ret['payment_privkey'] = pk_payment else: raise ValueError("Invalid payment key info") return ret
def __init__(self, m, *pks): self.privkey = virtualchain.make_multisig_info(m, pks) self.m = m self.n = len(pks) self.addr = self.privkey['address'] log.info("Multisig wallet %s " % (self.addr))
def fill_wallet(bitcoind, wallet, value): """ Fill a test wallet on regtet bitcoind Return True on success Raise an error """ if type(wallet.privkey) in [str, unicode]: #single private key testnet_wif = wallet.privkey if not testnet_wif.startswith("c"): testnet_wif = virtualchain.BitcoinPrivateKey(testnet_wif).to_wif() bitcoind.importprivkey(testnet_wif, "") addr = virtualchain.BitcoinPublicKey(wallet.pubkey_hex).address() log.info("Fill %s with %s " % (addr, value)) bitcoind.sendtoaddress(addr, value) else: # multisig address testnet_wifs = [] testnet_pubks = [] for pk in wallet.privkey['private_keys']: if not pk.startswith("c"): pk = virtualchain.BitcoinPrivateKey(pk).to_wif() testnet_wifs.append(pk) testnet_pubks.append( virtualchain.BitcoinPrivateKey(pk).public_key().to_hex()) multisig_info = virtualchain.make_multisig_info(wallet.m, testnet_wifs) bitcoind.addmultisigaddress(wallet.m, testnet_pubks) bitcoind.importaddress(multisig_info['address']) log.debug("Fill %s with %s" % (multisig_info['address'], value)) bitcoind.sendtoaddress(multisig_info['address'], value) return True
def _convert_key(given_privkey, key_type): if virtualchain.is_multisig(given_privkey): pks = given_privkey['private_keys'] m, _ = virtualchain.parse_multisig_redeemscript( given_privkey['redeem_script']) assert m <= len(pks) multisig_info = virtualchain.make_multisig_info(m, pks) ret['{}_privkey'.format(key_type)] = multisig_info ret['{}_addresses'.format(key_type)] = [ virtualchain.get_privkey_address(multisig_info) ] elif virtualchain.is_singlesig(given_privkey): pk = ecdsa_private_key(given_privkey).to_hex() ret['{}_privkey'.format(key_type)] = pk ret['{}_addresses'.format(key_type)] = [ virtualchain.get_privkey_address(pk) ] elif virtualchain.btc_is_singlesig_segwit(given_privkey): pk = virtualchain.make_segwit_info( virtualchain.get_singlesig_privkey(given_privkey)) ret['{}_privkey'.format(key_type)] = pk ret['{}_addresses'.format(key_type)] = [pk['address']] elif virtualchain.btc_is_multisig_segwit(given_privkey): pks = given_privkey['private_keys'] m, _ = virtualchain.parse_multisig_redeemscript( given_privkey['redeem_script']) assert m <= len(pks) pk = virtualchain.make_multisig_segwit_info(m, pks) ret['{}_privkey'.format(key_type)] = pk ret['{}_addresses'.format(key_type)] = [pk['address']] else: raise ValueError('Invalid owner key info')
def make_wallet_keys(data_privkey=None, owner_privkey=None, payment_privkey=None): """ For testing. DO NOT USE """ ret = { 'owner_privkey': None, 'data_privkey': None, 'payment_privkey': None, } if data_privkey is not None: if not virtualchain.is_singlesig(data_privkey): raise ValueError('Invalid data key info') pk_data = ecdsa_private_key(data_privkey).to_hex() ret['data_privkey'] = pk_data if owner_privkey is not None: if virtualchain.is_multisig(owner_privkey): pks = owner_privkey['private_keys'] m, _ = virtualchain.parse_multisig_redeemscript( owner_privkey['redeem_script']) assert m <= len(pks) multisig_info = virtualchain.make_multisig_info(m, pks) ret['owner_privkey'] = multisig_info ret['owner_addresses'] = [ virtualchain.get_privkey_address(multisig_info) ] elif virtualchain.is_singlesig(owner_privkey): pk_owner = ecdsa_private_key(owner_privkey).to_hex() ret['owner_privkey'] = pk_owner ret['owner_addresses'] = [ virtualchain.get_privkey_address(pk_owner) ] else: raise ValueError('Invalid owner key info') if payment_privkey is None: return ret if virtualchain.is_multisig(payment_privkey): pks = payment_privkey['private_keys'] m, _ = virtualchain.parse_multisig_redeemscript( payment_privkey['redeem_script']) assert m <= len(pks) multisig_info = virtualchain.make_multisig_info(m, pks) ret['payment_privkey'] = multisig_info ret['payment_addresses'] = [ virtualchain.get_privkey_address(multisig_info) ] elif virtualchain.is_singlesig(payment_privkey): pk_payment = ecdsa_private_key(payment_privkey).to_hex() ret['payment_privkey'] = pk_payment ret['payment_addresses'] = [ virtualchain.get_privkey_address(pk_payment) ] else: raise ValueError('Invalid payment key info') ret['data_pubkey'] = ecdsa_private_key( ret['data_privkey']).public_key().to_hex() ret['data_pubkeys'] = [ret['data_pubkey']] return ret
def make_wallet_keys(data_privkey=None, owner_privkey=None, payment_privkey=None): """ For testing. DO NOT USE """ ret = { 'owner_privkey': None, 'data_privkey': None, 'payment_privkey': None, } if data_privkey is not None: if not is_singlesig(data_privkey): raise ValueError('Invalid data key info') pk_data = virtualchain.BitcoinPrivateKey(data_privkey).to_hex() ret['data_privkey'] = pk_data if owner_privkey is not None: if is_multisig(owner_privkey): pks = [ virtualchain.BitcoinPrivateKey(pk).to_hex() for pk in owner_privkey['private_keys'] ] m, pubs = virtualchain.parse_multisig_redeemscript( owner_privkey['redeem_script']) ret['owner_privkey'] = virtualchain.make_multisig_info(m, pks) ret['owner_addresses'] = [ret['owner_privkey']['address']] elif is_singlesig(owner_privkey): pk_owner = virtualchain.BitcoinPrivateKey(owner_privkey).to_hex() ret['owner_privkey'] = pk_owner ret['owner_addresses'] = [ virtualchain.BitcoinPrivateKey( pk_owner).public_key().address() ] else: raise ValueError('Invalid owner key info') if payment_privkey is None: return ret if is_multisig(payment_privkey): pks = [ virtualchain.BitcoinPrivateKey(pk).to_hex() for pk in payment_privkey['private_keys'] ] m, pubs = virtualchain.parse_multisig_redeemscript( payment_privkey['redeem_script']) ret['payment_privkey'] = virtualchain.make_multisig_info(m, pks) ret['payment_addresses'] = [ret['payment_privkey']['address']] elif is_singlesig(payment_privkey): pk_payment = virtualchain.BitcoinPrivateKey(payment_privkey).to_hex() ret['payment_privkey'] = pk_payment ret['payment_addresses'] = [ virtualchain.BitcoinPrivateKey(pk_payment).public_key().address() ] else: raise ValueError('Invalid payment key info') ret['data_pubkey'] = ECPrivateKey( ret['data_privkey']).public_key().to_hex() ret['data_pubkeys'] = [ret['data_pubkey']] return ret
def get_compressed_and_decompressed_private_key_info(privkey_info): """ Get the compressed and decompressed versions of private keys and addresses Return {'compressed_addr': ..., 'compressed_private_key_info': ..., 'decompressed_addr': ..., 'decompressed_private_key_info': ...} on success """ if virtualchain.is_multisig( privkey_info) or virtualchain.btc_is_multisig_segwit(privkey_info): # get both compressed and decompressed addresses privkeys = privkey_info['private_keys'] m, _ = virtualchain.parse_multisig_redeemscript( privkey_info['redeem_script']) privkeys_hex = [ecdsa_private_key(pk).to_hex() for pk in privkeys] decompressed_privkeys = map( lambda pk: pk if len(pk) == 64 else pk[:-2], privkeys_hex) compressed_privkeys = map( lambda pk: pk if len(pk) == 66 and pk[:-2] == '01' else pk, privkeys_hex) decompressed_multisig = virtualchain.make_multisig_info( m, decompressed_privkeys, compressed=True) compressed_multisig = virtualchain.make_multisig_info( m, compressed_privkeys, compressed=False) decompressed_addr = virtualchain.address_reencode( decompressed_multisig['address']) compressed_addr = virtualchain.address_reencode( compressed_multisig['address']) return { 'decompressed_private_key_info': decompressed_multisig, 'compressed_private_key_info': compressed_multisig, 'compressed_addr': compressed_addr, 'decompressed_addr': decompressed_addr } elif virtualchain.is_singlesig( privkey_info) or virtualchain.btc_is_singlesig_segwit( privkey_info): pk = virtualchain.get_singlesig_privkey(privkey_info) # get both compressed and decompressed addresses compressed_pk = None decompressed_pk = None if len(pk) == 66 and pk.endswith('01'): compressed_pk = pk decompressed_pk = pk[:-2] else: compressed_pk = pk decompressed_pk = pk + '01' compressed_pubk = ecdsa_private_key( compressed_pk).public_key().to_hex() decompressed_pubk = ecdsa_private_key( decompressed_pk).public_key().to_hex() compressed_addr = virtualchain.address_reencode( keylib.public_key_to_address(compressed_pubk)) decompressed_addr = virtualchain.address_reencode( keylib.public_key_to_address(decompressed_pubk)) return { 'decompressed_private_key_info': decompressed_pk, 'compressed_private_key_info': compressed_pk, 'compressed_addr': compressed_addr, 'decompressed_addr': decompressed_addr } else: raise ValueError("Invalid key bundle")