LoginSignup
2
3

More than 5 years have passed since last update.

ビットコインのアドレス作成方法

Posted at

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
2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3