暗号通貨のトランザクションを手作りする (8)

今回のおはなし

みなさんこんにちは。

VIPPOOL でエンジニアをやっています、星月です。

前回までで raw トランザクションの作り方は一通り説明し終わりました。
今回はおまけ的な位置づけで、コインアドレスについて説明します。

コインアドレス

コインアドレスは、公開鍵ハッシュと相互に変換可能な文字列なので、
公開鍵ハッシュの代わりにやり取りするときに便利に使えます。

前回、手作りしたトランザクション
TXID 661b7e85f863232aff7344acd268bb9eaab306fc8b806d3e6101244c6d06c373
ですが、その直前のトランザクションとなる
TXID c37ab04631eef5813077fbbaae44e01bf26f9cab86426316ba81f99e2c9e8282
はどうやって作ったと思いますか?

実は、公開鍵ハッシュからコインアドレスを生成して、そこに送金しただけです。

ではコインアドレスの作成方法を見ていきましょう。

公開鍵ハッシュは db2e054bb576dc63283c0060abd46df14057c2de でしたね。
まずは先頭にモナコインのテストネットを表すプレフィックス、6f をつけます。

そして、sha256 を 2 回計算して、チェックサムを作ります。

$ printf "%b" "\x6f\xdb\x2e\x05\x4b\xb5\x76\xdc\x63\x28\x3c\x00\x60\xab\xd4\x6d\xf1\x40\x57\xc2\xde" | openssl sha -sha256 -binary | openssl sha -sha256
(stdin)= 1320a8f11585dd4764f6c8ffe4bd8824585d737b821b4b928a40be5e483e4f36

この先頭 4 Byte の「1320a8f1」がチェックサムです。

プレフィックス、公開鍵ハッシュ、チェックサムの 3 つをつなげると
6fdb2e054bb576dc63283c0060abd46df14057c2de1320a8f1
となります。

これを、Base58 エンコードすればコインアドレスの完成です。
Bass58 エンコードといっても、要はただの 58 進数なので、多倍長整数が扱える言語なら
簡単なコードで変換できます。

例えば python で書いてみましょう。

# util.py

def b58encode( src ):
	mapping = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"

	r = ''
	n = long( src, 16 )
	for i in range( 0, 34 ):
		r = mapping[n % 58] + r
		n = n / 58

	return r

実行してみます。

$ python
>>> import util
>>> util.b58encode( '6fdb2e054bb576dc63283c0060abd46df14057c2de1320a8f1' )
'n1VsQdyHFc15HzZMxfGgEC2zRQKWqu4XSQ'

はい、できました。

あとは、このコインアドレスに送金すれば、
TXID c37ab04631eef5813077fbbaae44e01bf26f9cab86426316ba81f99e2c9e8282
が作られます。

今回の連載はこれで終了となります。
みなさん、お付き合いいただき、ありがとうございました。
ご質問、ご意見等ありましたらお気軽にリプライください。