Pebble Coding

ソフトウェアエンジニアによるIT技術、数学の備忘録

base58check フォーマットとビットコインアドレス

bitcoinでは色々なところでbase58checkフォーマットが使われています。
base58checkフォーマットを行う関数をb58checkとして実装してみたのが以下です。
ここでは、公開鍵から、メインネットのビットコインアドレスを計算しています。
ビットコインアドレスは、versionに0x00、
ペイロードには、公開鍵をバイト列にしたものにsha256とripemd160を施したものになります。

#!/usr/bin/env python

import base58
import hashlib

# version: 1 bytes
# payload: bytes
def b58check(version, payload):
    d = version + payload
    h1digest = hashlib.sha256(d).digest()
    h2digest = hashlib.sha256(h1digest).digest()
    e = d + h2digest[0:4]
    return base58.b58encode(e)

ba = bytes.fromhex("037c3e90284927ea5a46cb7f4d8c91a5d6defd3827144b28ad2451b524becb9806")
d = hashlib.sha256(ba).digest()
m = hashlib.new('ripemd160')
m.update(d)
ba = m.digest()

r1 = b58check(bytes.fromhex("00"), ba)
print(r1)
b'1MQoLvLZ1DcC7BmKGkbkZWgKH2roYQjZLb'

一つ前の記事で bx コマンドで生成したものと一致していることが分かります。