Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Suport for BIP49 ypub for wallet.create_address #4

Open
mfbrj opened this issue Jan 15, 2018 · 1 comment
Open

Suport for BIP49 ypub for wallet.create_address #4

mfbrj opened this issue Jan 15, 2018 · 1 comment

Comments

@mfbrj
Copy link

mfbrj commented Jan 15, 2018

Can you add support for BIP49 segwit addresses?

It uses a new BIP32 Extended Public Key format.

For example, the Extended Public Key ypub6ZNNVLvwe6gJsPyNiukiYEgVWvdeP3M5xx1qGzTo67FiEFJvcCB6ApXZTLBiuMiKhvNfmdcssJ3MbLMQfWjgbJ9dHHMrWxx6Vkb93r7Zb3y
generates these address:

m/49'/0'/0'/0/0 39kb8ZPfyj2QsbdEGSCUuAZxXsJpC6sx4c
m/49'/0'/0'/0/1 32yn1GcQpYLdGtFCTKSNiXdhHgGyQPQKSx
m/49'/0'/0'/0/2 3FLXaYJfn5iozDtWvCmwwPRkViMBgRsZ8P
m/49'/0'/0'/0/3 38qQ1Mhi6BDQEGQR4n4jwH93uRbTy19CNe
m/49'/0'/0'/0/4 37oJY4zyjd7h34gsdDGR9vN1aLBYDEhmSh
m/49'/0'/0'/0/5 35etreLmK43naK9kqkMJp1iJFEUnxHfdRG
m/49'/0'/0'/0/6 3Ft5hWpSPChT8EFaFdW4FDzxEJ9YkxDDRq
m/49'/0'/0'/0/7 39uXxCT6kGxPYwtKyiXx1jPYxJX8RUTgFS
m/49'/0'/0'/0/8 3NGKHXYN7CP9ZzPkz1pnWZmbNUhiKy8vfB
m/49'/0'/0'/0/9 342ywv1E7VoQH9PHfNK2VCZh1VBoKfxGWC
@iteratelance
Copy link

See also #38

I was able to make this work for my purposes but modifying bip32.py, please note that this implementation will return a bad value for bip32_path and will only work for BIP49, I thought this might be helpful to someone. I think the right way to go about this is to add a new network config to network.py. Maybe I'll get the courage and time one day to go about doing that.

bip32.py

line 485 in bip32.py

    def to_address(self):
        """Create a public address from this Wallet.

        Public addresses can accept payments.

        https://en.bitcoin.it/wiki/Technical_background_of_Bitcoin_addresses
        """
        key = unhexlify(self.get_public_key_hex())
        # First get the hash160 of the key
        hash160_bytes = hash160(key)
        # Prepend the network address byte

        # if BIP32 - comment this out for testing
        #network_hash160_bytes = \
            #chr_py2(self.network.PUBKEY_ADDRESS) + hash160_bytes

        
        # if BIP49
        script_sig = bytes.fromhex('0014') + hash160_bytes
        address_bytes = hash160(script_sig)
        network_hash160_bytes = \
            chr_py2(self.network.SCRIPT_ADDRESS) + address_bytes
        # print(self.network.PUBKEY_ADDRESS)

        # Return a base58 encoded address with a checksum

        return ensure_str(base58.b58encode_check(network_hash160_bytes))

line 567 in bip32.py - comment out the network check for testing

        elif point_type in [2, 3, 4]:
            # Compressed public coordinates
            # if version_long != network.EXT_PUBLIC_KEY:
            #     raise incompatible_network_exception_factory(
            #         network.NAME, network.EXT_PUBLIC_KEY,
            #         version)
            pubkey = PublicKey.from_hex_key(key_data, network=network)
            # Even though this was generated from a compressed pubkey, we
            # want to store it as an uncompressed pubkey
            pubkey.compressed = False

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants