base58でエンコードするというデータ形式。
Base58Checkエンコーディング
- 任意のサイズの内容(payload)
- 先頭1バイトはアプリケーションもしくはバージョンの識別子を意味するプレフィックス
- checksumは、sha256(sha256(prefix+payload))の先頭4バイト
- データは、prefix+payload+checksum
- Base58Checkは、データをbase58でエンコーディングしたもの。
- Base58Check = base58encode(prefix+payload+checksum)
プレフィックス
種類 | プレフィックス(16進数) | base58エンコーディング |
---|---|---|
ビットコインアドレス(mainnet) | 0x00 | 1 |
ビットコインアドレス(testnet) | 0x6f | mまたはn |
P2SHアドレス(mainnet) | 0x05 | 3 |
P2SHアドレス(testnet) | 0xC4 | 2 |
コード
irb(main):001:0> require 'bitcoin'
=> true
- 秘密鍵と公開鍵の配列
irb(main):002:0> key = Bitcoin::generate_key
=> ["225a4d7f4d79cd495a2e70d15048bed97dd8fdc524fb89c8eb000d539f62818c", "049d6098acd550c77d405a0197742d28744123718b453cca68aebe359131a818c44a2bc5c016ac1ae917fce5c7d0245d12fe088000a4003f4398c964d5931eb8db"]
irb(main):003:0> private_key = key[0] # 秘密鍵
=> "225a4d7f4d79cd495a2e70d15048bed97dd8fdc524fb89c8eb000d539f62818c"
irb(main):004:0> public_key = key[1] # 公開鍵
=> "049d6098acd550c77d405a0197742d28744123718b453cca68aebe359131a818c44a2bc5c016ac1ae917fce5c7d0245d12fe088000a4003f4398c964d5931eb8db"
- 16進数文字列を1文字ずつ4ビットのビット列にする
irb(main):006:0> pub_key = [public_key].pack("H*")
=> "\x04\x9D`\x98\xAC\xD5P\xC7}@Z\x01\x97t-(tA#q\x8BE<\xCAh\xAE\xBE5\x911\xA8\x18\xC4J+\xC5\xC0\x16\xAC\x1A\xE9\x17\xFC\xE5\xC7\xD0$]\x12\xFE\b\x80\x00\xA4\x00?C\x98\xC9d\xD5\x93\x1E\xB8\xDB"
irb(main):007:0> include Digest
=> Object
- ペイロード = RIPEMD-160(SHA256(公開鍵))
irb(main):008:0> payload = RMD160.hexdigest(SHA256.digest(pub_key))
=> "3a06b20d77bedc9e8d6009dd3c598dec44a51011"
- チェックサム = SHA256(SHA256(プレフィックス+公開鍵))の先頭4バイト
irb(main):009:0> payload6f = ['6f' + payload].pack("H*")
=> "o:\x06\xB2\rw\xBE\xDC\x9E\x8D`\t\xDD<Y\x8D\xECD\xA5\x10\x11"
irb(main):010:0> checksum = SHA256.hexdigest(SHA256.digest(payload6f))[0...8]
=> "e9ecd541"
- アドレス
irb(main):011:0> Bitcoin::encode_base58('6f' + payload + checksum)
=> "mkomWPk5NyNwp1REmjVbT1oPTB81scDYAC"
- bitcoin-rubyでのアドレス生成
irb(main):012:0> Bitcoin::network = :testnet3
=> :testnet3
irb(main):013:0> Bitcoin::pubkey_to_address(public_key)
=> "mkomWPk5NyNwp1REmjVbT1oPTB81scDYAC"
- Base58Check形式の検査
irb(main):014:0> Bitcoin.base58_checksum?("mkomWPk5NyNwp1REmjVbT1oPTB81scDYAC")
=> true