ビットコインアドレス

ビットコインアドレスの元となる公開鍵とは、楕円曲線暗号によって導出された座標(Rx,Ry)のことでした。
ビットコインアドレスはその公開鍵をBase58Checkの形式で表現します。
公開鍵が具体的にどのような値になるかは後述します。

base58checkエンコーディング

base58とは

  • base64の58文字バージョンで、データを58の英数字で表現する
  • base64の使用文字から人間の目でみて紛らわしい0(数字の0)、O(大文字o)、l(小文字L)、I(大文字i)、記号”+”や”/”を除いた58文字で表現
  • つまり123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyzだけで表現
  • データを58進数で表現しているようなもの

ビットコインアドレスのbase58check

  • base58check = base58encode ( prefix + payload + checksum )
    • payload = RIPEMD160 ( SHA256 ( 公開鍵 ) )
    • checksum = SHA256( ( SHA256( prefix + payload ) ) )
      • チェックサムを入れることで、エンコードされたアドレスに間違いがないかを検出できます。
    • prefixは以下の表
種類 プレフィックス base58エンコーディング
ビットコインアドレス(mainnet) 0x00 1
ビットコインアドレス(testnet) 0x6F m or n
P2SH(mainnet) 0x05 3
P2SH(testnet) 0xC4 2

暗号鍵のフォーマット

公開鍵の圧縮形式/非圧縮形式

非圧縮形式の公開鍵

公開鍵は楕円曲線暗号の座標(Rx,Ry)のことなので、Rx,Ryを16進数で表現し、0x04のプレフィックスをつけたものが非圧縮形式の公開鍵です

04 + 16進数Rx + 16進数Ry

圧縮形式の公開鍵

楕円曲線上の座標ということは一方が定まればばもう一方も定まります。
Rxにプレフィックスをつけたものが圧縮形式の公開鍵です。非圧縮形式に比べて約1/2のサイズです。
公開鍵はトランザクションに含まれるのでデータ量が半減することはブロックチェーン全体の軽量化に寄与します。
Ryが正か負かでプレフィックスが異なります。

// 圧縮形式の公開鍵
02 or 03 + 16進数Rx

公開鍵が圧縮か非圧縮かによってそこから生成されるビットコインアドレスも全く違うものになります。

秘密鍵フォーマット

秘密鍵の表現の一つにWIF(Wallet imoprt format)というフォーマットがあります。
公開鍵と同様に人間の目にわかりやすく間違いを防ぐ意味があり、Base58Checkエンコーディングで表現します。

WIF形式とWIF圧縮形式

前述の通りビットコインアドレスがその元となる公開鍵が圧縮形式か非圧縮形式かで値が変わってしまうのでしたが、
どちらのアドレスを使用しているかの識別子を秘密鍵のWIF形式に織り込むことで、
対応する公開鍵がどちらのものか識別できるようになります。
これはウォレットに圧縮版ビットコインを探すのか、非圧縮版ビットコインを探すのが伝える意味があります。

秘密鍵のWIF形式の基本形以下ですが

Base58Check = base58encode ( prefix + 秘密鍵256bitの16進数 + checksum )
or
Base58Check = base58encode ( prefix + 秘密鍵256bitの16進数 + checksum + 0x01)

圧縮の方は末尾に0x01をつけてエンコードします。対応する公開鍵が圧縮形式であることを明示する意味があります。

形式 プレフィックス base58エンコーディング エンコード前の末尾
WIF形式 0x80 5
WIF圧縮形式 0x80 K or L 0x01

testnetのプレフィックスは0xefです。

WIFの圧縮/非圧縮は秘密鍵を圧縮しているかどうかという意味ではありません。その秘密鍵に対応するビットコインアドレスの元となる公開鍵が圧縮形式か非圧縮形式かを明示しています。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です