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 コマンドで生成したものと一致していることが分かります。