Develop with pleasure!

福岡でCloudとかBlockchainとか。

Open Assets Protocolのasset IDを生成する

lian/bitcoin-ruby · GitHubを使って、Open Asset Ptotocolで使われるasset IDを生成してみる。

asset IDの生成手順は以前ブログに書いた↓の手順。

1.発行者は初めに秘密鍵を生成する
(こんな→ 18E14A7B6A307F426A94F8114701E7C8E774E7F9A47E2C2035DB29A206321725 )
2.続いて該当するアドレスを計算する
(こんな→ 16UwLL9Risc3QfPqBUvKofHmBQ7wMtjvM )
3.アドレスに関連付けられているPay-to-PubKey-Hashでスクリプトを作成する
4.スクリプトのハッシュ化(こんな→ 36e0ea8e93eaa0285d641305f4c81e563aa570a2)
5.最後にこのハッシュをversion byte 23のチェックサムを使ってbase58で変換する(こんな→ ALn3aK1fSuG27N96UGYB1kUYUpGKRhBuBC )

Open Assets Protocolの仕様(訳) - Develop with pleasure!

秘密鍵とアドレスは↑のサンプルをそのまま使用。

require 'bitcoin'
include Bitcoin::Util

# 生成した秘密鍵
private_key = '18E14A7B6A307F426A94F8114701E7C8E774E7F9A47E2C2035DB29A206321725'

# BTCアドレス
btc_address = '16UwLL9Risc3QfPqBUvKofHmBQ7wMtjvM'

#公開鍵
pub_key = regenerate_public_key(private_key)

# 公開鍵をハッシュ化(SHA-256でハッシュ化したものをさらにRIPEMD-160でハッシュ化)
hash = hash160(pub_key)

# P2PKHでスクリプトをハッシュ化
# P2PKHのスクリプトはOP_DUP OP_HASH160 <PubKeyHash> OP_EQUALVERIFY OP_CHECKSIGとなる
# (76=OP_DUP, a9=OP_HASH160, 14=Bytes to push, 88=OP_EQUALVERIFY, ac=OP_CHECKSIG)
script = hash160(["76", "a9", "14", hash, "88", "ac"].join)

# スクリプトハッシュにバージョンバイト23を付加する。
script = 23.to_s(16) + script

# チェックサムを付加して、Base58エンコードすればasset IDの完成
asset_id = encode_base58(script + checksum(script))