用語集 / アドレスと鍵
Base58Check
別名はBase58です。
- Base58Checkとは?
- Base58Checkはビットコインの最初期のテキストエンコード方式であり、バイナリデータを書き写しやすい58文字の文字列に変換し、誤記を検出するための4バイトのチェックサムを末尾に付加します。
このアルファベットでは、手作業でコピーする際に混同しやすい4文字、すなわちゼロ、大文字のO、大文字のI、小文字のlが除外されています。ペイロードを二重にSHA-256したものから取った4バイトのチェックサムにより、打ち間違えたアドレスはウォレットによって拒否され、虚空に送られることはありません。すり抜ける確率は42.9億回に約1回です。1または3で始まるアドレスはすべてBase58Checkです。
仕組み
Base58Checkの文字列には3つの要素が入っています。先頭のバージョンバイトはこのデータが何であるかを示し、中央のペイロードは実際のバイト列を運び、末尾の4バイトのチェックサムは、バージョンとペイロードを合わせたものにSHA-256を2回適用した結果の先頭4バイトです。その結果は基数16ではなく基数58で表記されるため、かなり短くなり、紛らわしい字形も除かれます。
見慣れた先頭文字が生まれるのはバージョンバイトによるものです。バージョン0x00はpay-to-public-key-hashアドレスを示し、先頭が1になります。バージョン0x05はpay-to-script-hashアドレスを示し、先頭が3になります。バージョン0x80はWallet Import Formatの秘密鍵を示し、5、KまたはLで始まります。拡張鍵は代わりに4バイトのバージョン0x0488B21Eを使うため、すべてのxpubはこの4文字で始まります。
先頭のゼロバイトは特別に扱われます。そうしなければ基数変換で失われてしまうからです。ペイロードの先頭にある各0x00バイトは、余分な「1」1文字として書かれます。そのため、同じ量のデータを持っていても、一部のレガシーアドレスは隣のアドレスより短くなったり長くなったりします。
使われている場所
Base58Checkはビットコインの最初の10年間のどこにでもあり、最新の形式のどこにもありません。レガシーアドレス、pay-to-script-hashアドレス、WIF秘密鍵、そしてウォレットからエクスポートするxprvおよびxpubの拡張鍵は、すべてこれを使っています。bc1で始まるものは使いません。
2つの性質が、人気と廃止の両方を説明します。狙いは書き写しの安全性でした。このアルファベットは、声に出して読んだり、画面からコピーしたり、金属板に刻印したりしたアドレスが人の取り扱いを経ても生き残るように設計されており、チェックサムは残った誤りを損失ではなく拒否に変えます。しかし、このエンコードは大文字と小文字を区別するため、QRコードはよりコンパクトな英数字モードではなくバイトモードを使わざるを得ず、また何かが間違っていることしか分からず、何がどこで間違っているかは決して分かりません。
Base58Check vs Bech32
Base58Checkは誤りを検出し、bech32は誤りを訂正します。BIP-173で規定され、2017年にネイティブSegWitアドレス向けに採用されたbech32は、大文字をまったく含まない32文字のアルファベットを使うため、文字列全体がQRの英数字モードに収まり、より小さい画像からスキャンできます。そのBCHチェックサムは最大4文字の誤りを検出することを保証し、単に失敗するのではなく、どの位置が疑わしいかを指し示すことができます。
後継方式には独自の修正が必要でした。元のbech32チェックサムには長さ拡張の弱点があり、特定のアドレスが最後の1文字を検出されずに得たり失ったりする可能性があったため、BIP-350はbech32mを定義しました。これは1つの定数を変えるもので、bc1pで始まるTaprootアドレスが使うのはこれです。Base58Checkは有効なままで、無期限に機能し続けますが、新しいアドレスの種類はこれで定義されていません。