George
George

Reputation: 256

How to get Bitcoin address from pubkey_hash?

I'm using: https://github.com/bitcoin-abe/bitcoin-abe to import the blockchain into a mysql DB it is almost done after 5 days. So I started looking at the data and didn't see any addresses. I know the BTC client doesn't use those, but it still would be nice to have them in another table. I was looking around at the code and found this:

def hash_to_address(version, hash):
    vh = version + hash
    return base58.b58encode(vh + double_sha256(vh)[:4])

In: https://github.com/bitcoin-abe/bitcoin-abe/blob/3004fe4bad6f64d4c032c735ee23bf9f052d825b/Abe/util.py

When I run a pubkey_hash through that function I don't get the expected result of an address. For example taking the following pubkey_hash: 62E907B15CBF27D5425399EBF6F0FB50EBB88F18

I should get: 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa

But instead I get: 6GEZdxx5UiTk3U3LaLfsWwRaFAvXEpPNS5R4mqsJDXVJcTNNngTyB5i9S76MLTq

The script I created is:

import util
hash = '62E907B15CBF27D5425399EBF6F0FB50EBB88F18'
print util.hash_to_address("00", hash)

Any ideas or is there something else that would do the same correctly?

Appleman1234 pointed me in the right direction:

import util
hash = '62E907B15CBF27D5425399EBF6F0FB50EBB88F18'
hash = '00' + hash
print "Util: ", util.hash_to_address("", hash.decode('hex'))

Upvotes: 1

Views: 2997

Answers (1)

Appleman1234
Appleman1234

Reputation: 16116

The reason you don't get the result you expected is due to encoding.

The correct code for Python 2

import util
hash = '62e907b15cbf27d5425399ebf6f0fb50ebb88f18'
print util.hash_to_address("00".decode('hex'), hash.decode('hex'))

The correct code for Python 3

import util
import binascii
hash = '62e907b15cbf27d5425399ebf6f0fb50ebb88f18'
print util.hash_to_address(binascii.unhexlify("00"), binascii.unhexlify(hash))

The decode and unhexlify functions convert the hexadecimal ASCII representations into binary byte strings.

The problem you were having was that the hash of the binary string and the hash of its hexadecimal ASCII representation are two different hashs.

Upvotes: 2

Related Questions