用語集 / アドレスと鍵
HDウォレット
別名はHD wallet、階層的決定性ウォレット、Hierarchical deterministic wallet、BIP32です。
- HDウォレットとは?
- HDウォレットは、将来必要になるすべての鍵を1つのランダムなシードから生成し、BIP-32が2012年に規定した親と子の木構造として整理します。
BIP-32で規定されています。
1つのシードからマスター鍵が生成され、マスター鍵から枝が生成され、枝から利用するすべてのアドレスが生成されます。BIP-32は2012年2月11日に割り当てられ、現在出荷されている実質的にすべてのハードウェアウォレット、モバイルウォレット、デスクトップウォレットがこれに従っています。そのため、カードに書かれた12語で、10年間使い続けてきたウォレットを復元できるのです。
仕組み
HDウォレットは、鍵付きハッシュを繰り返し実行することで、1つの数値を階層構造に変換します。シードは固定の鍵文字列「Bitcoin seed」とともにHMAC-SHA512に入力され、64バイトが生成されます。左側の32バイトがマスター秘密鍵となり、右側の32バイトがマスターチェーンコードとなります。この組が、その下にあるすべてのもののルートです。
以降の各ステップでは、鍵、そのチェーンコード、インデックス番号を取り、同じ方法でハッシュ化し、独自のチェーンコードを持つ子鍵を生成します。各ノードには4,294,967,296個の子が可能で、2つの半分に分かれます。2,147,483,648未満のインデックスは通常のもので、公開側だけから計算できますが、その線以上のインデックスはハードニングされており、秘密鍵が必要です。このステップを繰り返すことでツリーが構築され、そのツリー内の位置は導出パスとして記述されます。
決定性があるからこそ、この設計には価値があります。同じシードを任意の正しい実装に与えると、永遠に同じ鍵が同じ順序で正確に生成されます。鍵が保存されることは決してなく、再計算されるだけです。そのためバックアップは、入金を受けるたびに大きくなるファイルではなく、1つの文になるのです。
単語は別の層であり、2つの層を混同することが復元時の問題のほとんどを引き起こします。BIP-39は、2,048語のリストから取られたフレーズがどのようにシードになるかを定義しており、2,048回の反復でHMAC-SHA512を用いてPBKDF2を通じて伸長し、文字列「mnemonic」と任意のパスフレーズでソルトします。BIP-32は単語について何も知らず、BIP-39はツリーについて何も知りません。両者は慣習によって結び付けられており、そのため2つのウォレットがフレーズについては一致しながら、アドレスについては一致しないことがあるのです。
Bitcoin Coreはバージョン0.16.0以降、階層決定性ウォレットのみを生成しています。それ以前は、ウォレットは無関係なランダム鍵のプールを保持しており、プールがバックアップを超えて進むとすぐにバックアップは古くなりました。
ビットコインを購入する際にこれが重要な理由
ウォレットの設定中に書き留めるフレーズは、あなたがこれから購入するすべてのコインへのアクセスを左右する唯一のものであり、ツリー構造がその記述を真実にしています。
一度バックアップすれば、そのバックアップは完全なままです。取引所から100個の新しいアドレスへの100回の出金はすべて1つのルートの子孫であるため、その後に何をしても保護すべきものが増えることはありません。これは最初のクライアントが出荷されて以来のビットコインのカストディにおける最大の実用的改善であり、同時に、一度撮影されたシードフレーズが永久に危険にさらされる理由でもあります。その写真は、まだ購入していないコインも対象にしているからです。
移植性は2つ目の利点であり、落とし穴も伴います。TrezorやLedgerに書き留めたフレーズは、Sparrow、Electrum、BlueWalletに復元できます。いずれも同じ標準を実装しているからです。落とし穴は経路にあります。BIP-44は1で始まるアドレスを生成し、BIP-49は3を、BIP-84はbc1qを、BIP-86はbc1pを、いずれも同一の単語から生成します。異なる目的を既定とするソフトウェアに復元すると、残高はゼロと表示される一方で、コインは別の枝に手つかずのまま残ります。バックアップのそばに導出パスを記録し、それ以外は何も記録しないことで、その特定のパニックを防げます。
3つ目に知っておくべきことは、ギャップリミットです。復元されたウォレットは、BIP-44の下で20個の未使用アドレスを前方にスキャンし、その後は探すのをやめます。一度もバックアップしていないウォレットで受取ボタンを40回クリックし、その後最後のアドレスを使うことは、残高が空であると報告する復元を確実に生み出す方法です。
m/84'/0'/0'/0/0を1階層ずつ読み解く
導出パスは郵便住所のように機能し、各階層で範囲が狭まります。標準のネイティブSegWitパスを左から右へ読んでください。
- mは、あなたのシードから導出されたマスター鍵です。
- 84'はBIP-84の目的を選択し、bc1qで始まるネイティブSegWitアドレスを生成します。アポストロフィはその階層がハードニングされていることを示します。
- 0'はコインタイプであり、0はビットコインのメインネットを意味します。テストネットは1'になります。
- 0'はアカウントであり、事業用の別アカウントは1'になります。
- 0はチェーンです。0は外部に渡すアドレス用、1はおつり用です。
- 0はアドレスインデックスであり、入金を受けるたびに増えていきます。
最初の3階層はハードニングされており、最後の2階層はそうではありません。これは意図的なものです。この分割により、アカウントレベルの拡張公開鍵をウォッチオンリーウォレットにエクスポートでき、そのウォレットは兄弟アカウントに到達したりマスター鍵に向かって遡ったりすることなく、受取アドレスとおつりアドレスを生成できます。
HDウォレットvsシードフレーズ
HDウォレットは導出スキームであり、シードフレーズはその出発点となる数値を書き留める1つの方法です。BIP-32はツリーを定義し、128ビットから512ビットまでの任意のシードを受け入れ、256ビットを推奨しています。BIP-39は単語を定義します。Electrumは独自の互換性のないフレーズ形式を出荷しており、それでも完全に階層決定性であり、2つの層が真に独立していることを示しています。この区別は、ソフトウェアがBIP-39の復元に対応していると主張するときに重要です。それはあなたの単語を読むことについての約束であり、その後どの枝を探すかについての約束ではありません。
HDウォレットvs導出パス
HDウォレットはツリーであり、導出パスはそれをたどる1つの経路です。人々はウォレットをまるで製品カテゴリーであるかのように「BIP-84ウォレット」と表現しますが、どのBIP-32ウォレットもどのパスでもたどることができ、現在のほとんどのソフトウェアは1つのシードから異なる目的を持つ複数のアカウントを問題なく表示します。パスは、たまたまインストールしたアプリの属性ではなく、バックアップとともに記録する座標として扱ってください。