ブロックチェーン/レベル II · 仕組み/2.1 暗号技術/レッスン 6
アドレスとエンコーディング:Base58Check、Bech32、Bech32m
エラーのアルファベット:Base58CheckからBCHチェックサムまで
用意するものブロックエクスプローラーのインターフェース(例:mempool.spaceやblockchain.com)文字列の長さを比較するためのテキストエディタBIP-173およびBIP-350の仕様書
問い
- アドレスの1文字が変わるとほぼ必ず無効になるのに、一部のタイプミスがすり抜けてしまうのはなぜでしょうか?
- 文字と数字の並びが、そのスクリプトをチェーン上に保存することなく、特定のロッキングスクリプトへの対応表として機能できるのはなぜでしょうか?
- Base58Checkでは起こりにくくすることしかできないタイプミスについて、Bech32は何を保証できるのでしょうか?
探究
- アドレスとはUTXOセットに格納されるオブジェクトではなく、アウトプットスクリプトを人間が読みやすい形でエンコードしたものです。チェーン上にはバイトのみが保存されますが、ソフトウェアがそれらを文字列に変換して人間が読んだり入力したりできるようにします。この変換層は転記ミスを防ぐ必要があります。なぜなら、見た目上は有効に見える誤ったアドレスを使うと資金が間違った場所に送信されてしまうからです。サトシの元々の設計であるBase58Checkでは、「0」、「O」、「I」、「l」といった視覚的に区別しにくい文字を除外した58文字からなるアルファベットを使用することで、この問題に対処しました。
- Base58Checkは、バージョンバイト、ペイロード(20バイトのハッシュなど)、4バイトのチェックサムをエンコードします。チェックサムは、それより前のデータをダブルSHA-256でハッシュ化した値の先頭4バイトから導出されます。レガシーのPay-to-Public-Key-Hash(P2PKH)アドレスはバージョンバイト0x00を使用し、「1」で始まる文字列になります。Pay-to-Script-Hash(P2SH)はバージョンバイト0x05を使用し、「3」で始まる文字列になります。この構造により、ウォレットはアドレスを受け付ける前に完全性を検証できます。
- 2017年8月にブロック481,824で有効化されたSegregated Witness(SegWit)は、新しいエンコーディングを必要とするネイティブなウィットネスアウトプットを導入しました。Base58Checkは、SegWitのより長いデータ構造や特有のエラーパターンには適していませんでした。Pieter WuilleとGreg Maxwellは、BIP-173(2017年)でBech32を提案しました。Bech32は32文字に制限された文字セットを使用します。これは数字と英小文字から「1」「b」「i」「o」を除いたもので、「1」は区切り文字として予約されています。大文字・小文字のどちらか一方のみを使うことで曖昧さを避け、QRコードにも適しています。
- Bech32アドレスは、人間が読める部分「bc」と区切り文字「1」で始まり、その後にデータと6文字のチェックサムが続きます。このチェックサムはBose-Chaudhuri-Hocquenghem(BCH)符号に基づいており、Base58CheckのSHA-256由来のチェックサムよりも格段に強力です。BCH符号は最大4文字に影響する誤りの検出を保証し、多くの場合タイプミスの位置まで特定できます。ネイティブSegWit v0アドレス(P2WPKHとP2WSH)はこの形式を使用し、「bc1q」で始まります。
- 開発者たちはその後、元のBech32の多項式に弱点を発見しました。特定の文字列を挿入または削除すると、有効だが別のアドレスになってしまう可能性があったのです。既存のv0アドレスを壊さずにこれを修正するため、BIP-350(2020年)でBech32mが導入されました。Bech32mはチェックサム計算の定数を1つ変更し、この種の挿入や削除を検出できるようにしています。2021年11月に有効化されたTaprootアドレス(SegWitバージョン1)はBech32mを使用し、「bc1p」で始まります。
- テストネットのアドレスは、「bc1」の代わりに「tb1」というプレフィックスを使います。データ部分にはウィットネスプログラムがエンコードされており、SegWitバージョン0では公開鍵またはスクリプトのハッシュ、Taprootでは32バイトのtweak済み公開鍵です。ソフトウェアはQRコードを読み取ったり手入力を受け付けたりする際に、BCHのpolymod関数を実行して完全性を検証します。ブロックエクスプローラーを開き、各タイプのアドレスを1つずつ探してください。「1」で始まるレガシーP2PKH、「bc1q」で始まるSegWit v0、「bc1p」で始まるTaprootアドレスです。それぞれの長さとプレフィックスを記録してください。
重要な事実
- Base58Checkは「0」「O」「I」「l」を除いた58文字のアルファベットを使用し、ダブルSHA-256から導出された4バイトのチェックサムを含みます。
- レガシーのP2PKHアドレスは「1」(バージョンバイト0x00)で始まり、P2SHアドレスは「3」(バージョンバイト0x05)で始まります。
- BIP-173(2017年)で定義されたBech32は、32文字の文字セットとBCHベースのチェックサムを使用して、最大4文字に影響を与えるエラーを検出します。
- ネイティブSegWit v0アドレス(P2WPKH/P2WSH)はBech32エンコーディングを使用し、「bc1q」で始まります。
- BIP-350(2020年)で定義されたBech32mは、Bech32のチェックサムにある脆弱性を修正したもので、SegWitバージョン1から16では必須となっています。
- Taprootアドレス(SegWitバージョン1)はBech32mエンコーディングを使用し、「bc1p」で始まります。
演習 九・六・三・一
9集めるブロックエクスプローラーで実際のビットコインアドレスを9つ見つけてください:「1」で始まるものを3つ、「3」で始まるものを3つ、「bc1q」で始まるものを2つ、「bc1p」で始まるものを1つ。
6まとめる9つのアドレスを、プレフィックス、長さ、および表すスクリプトの種類に基づいて6つのカテゴリーに分類してください。
3絞り込む6つのグループを、これらのエンコーディングがデータの完全性と見た目の紛らわしさをどう扱うかについての、3つの根本的な違いに絞り込んでください。
1結晶化するBase58CheckからBech32への移行が、単なる見た目ではなく誤り検出の数学によって推進された理由を、1文で説明してください。
事実確認
日付、数字、主張は、下記に記載された公表資料と照合して確認しました。