ブロックチェーン/レベル IV · プロトコルを深く知る/4.2 アップグレード/レッスン 4
出力デスクリプタ
鍵の文法:なぜシードだけでは、構築したものを復元できない場合があるのか
用意するもの実行中のBitcoin Core(バージョン23以降)公開デスクリプタをエクスポートできるハードウェアウォレットデスクリプタ文字列を確認・修正するためのテキストエディタ
問い
- 24語のリカバリーフレーズには、マルチシグウォレットのすべてのアドレスを復元するには不十分となる、どのような具体的な情報が欠けているのでしょうか?
- デスクリプタ文字列に付加されたチェックサムは、ソフトウェアがインポートを試みる前に、1文字の入れ替わりをどのようにして検出するのでしょうか?
- なぜBitcoin Coreはバージョン23で新規ウォレットをデフォルトでデスクリプタモードに切り替えたのでしょうか? また、旧形式のウォレットを最新のバックアップで復元すると何が問題になるのでしょうか?
探究
- デスクリプタが登場する以前、HDウォレットは暗黙の導出パスに依存していました。ユーザーはシードフレーズや拡張公開鍵(xpub)をバックアップし、ソフトウェアが標準的なBIP44の規約に従ってアドレスを再構築してくれるものと想定していました。これは、2017年8月にブロック481,824でSegregated Witnessが有効化されるまでは、単純なシングルシグのウォレットでは問題なく機能していました。P2WPKHやP2WSHといったアドレスタイプが導入されたことで、1つのxpubだけではアドレスの導出方法の全体像を表せなくなり、ウォレットが誤ったスクリプトタイプをスキャンしたために資金が失われたように見える、という復元の失敗が起こるようになりました。
- BIP380は、HDビットコインウォレットで使われる出力スクリプトの集合を記述するための標準言語として、出力スクリプトデスクリプタを定義しています。BIP380が枠組みを定め、BIP381から386がpk()、pkh()、sh()、wpkh()、wsh()といった個々の式の種類を規定しています。デスクリプタは、出力スクリプト(scriptPubKey)を完全に記述する構造化された式です。例えば「wpkh([d34db33f/84'/0'/0']xpub…/0/*)」は、スクリプトの種類、マスターフィンガープリントと導出パスによる鍵の出所、拡張公開鍵、そしてスキャンするインデックスの範囲を明示しています。推測に委ねられる部分は何もありません。
- このフォーマットには、タイプミスを検出するために「#」の後にチェックサムが付きます。ユーザーがデスクリプタを手動で編集したり、誤ってコピーしたりした場合でも、ソフトウェアは入力を受け付ける前にチェックサムを検証します。これにより、無効なアドレスが何の結果も得られないまま延々とスキャンされ続けるような、気づかれないデータ破損を防げます。ハードウェアウォレットは、公開鍵と導出パスを含みつつ秘密鍵は明示的に除外したデスクリプタをエクスポートできるため、オンラインのノードがシードを露出させることなく、オフラインの資産を安全に監視できます。
- Miniscriptは、2019年からPieter Wuille、Andrew Poelstra、Sanket Kanjalkarによって開発され、BIP379(2023年)で仕様化されたもので、スクリプトを構造的に記述・分析する方法を提供します。複雑なスクリプトのロジックを単純で分析可能な単位に分解することで、ウォレットはタイムロック、マルチシグ、ハッシュロックを安全に組み合わせられます。これによりデスクリプタは、シードフレーズだけでは決して表現できない、タイムロック付きのリカバリーパスや複数当事者の条件を記述できるようになります。
- Bitcoin Coreはバージョン23(2022年)で新規ウォレットをデフォルトでデスクリプタウォレットに切り替え、バージョン30(2025年)ではレガシーウォレットを完全に廃止しました。古いウォレットは移行するしかありません。BIP39のシードフレーズをもとにしたウォレットにも同じ教訓が当てはまります。標準的なシングルキーのウォレットを超えるものについては、シードと一緒にデスクリプタもバックアップしなければなりません。このデータは公開情報しか含まないため、漏洩しても秘密鍵の安全性が損なわれることはありませんが、ユーザーがどのアドレスを管理しているか、そしてその導出構造を正確に明らかにしてしまうため、プライバシーの漏洩から保護する必要があります。
- 実際に確かめるには、Bitcoin Coreで新しいウォレットを作成し、「listdescriptors」を実行してデスクリプタを出力します。それぞれの末尾には「#」に続いてチェックサムが付いています。1つをコピーして1文字だけ変更し、「getdescriptorinfo」に渡すと、Bitcoin Coreはチェックサムエラーで拒否します。なお、オプションなしの「listdescriptors」が表示するのは公開鍵のみで、ウォッチオンリーのコピーにはこれで十分です。支出能力を復元するには、秘密鍵を含むためそれ相応に厳重に保管すべき「listdescriptors true」の出力か、ウォレットファイルのバックアップが必要です。
重要な事実
- BIP380は、HDウォレットの出力スクリプトを記述するための標準言語として、出力スクリプトデスクリプタを定義しています。
- デスクリプタには、スクリプトの種類、鍵の出所(フィンガープリント/パス)、公開鍵、インデックスの範囲が明示的に含まれます。
- 「#」の後に付加されるチェックサムは、デスクリプタ文字列にタイプミスがないかを検証し、その完全性を確認します。
- Bitcoin Coreバージョン23(2022年)で、新規ウォレット作成時のデフォルトがデスクリプタウォレットになりました。
- Miniscript(BIP379)により、デスクリプタはマルチシグやタイムロックのような複雑なスクリプトを安全に表現できます。
- ハードウェアウォレットは公開情報のみのデスクリプタをエクスポートするため、オンラインのノードと組み合わせたエアギャップ署名が可能になります。
演習 九・六・三・一
9集める9種類の異なる出力スクリプトタイプまたはウォレット構成(例:P2PKH、P2SH-P2WSH、2-of-3マルチシグ)を挙げてください。それぞれについて、復元に必要な具体的なデータを記してください。
6まとめる9つを、標準的なBIP44パスで十分か、それとも正しく復元するために明示的なデスクリプタデータが必須かに基づいて、6つのカテゴリーに分類してください。
3絞り込む6つのグループを、現代のウォレットタイプで暗黙の導出パスが機能しない核心的な理由3つに絞り込んでください。
1結晶化するデスクリプタがシードフレーズに何を加えることで復元が確定的になるのかを、1文で説明してください。
事実確認
日付、数字、主張は、下記に記載された公表資料と照合して確認しました。