用語集 / アドレスと鍵
親鍵
別名はParent key、親公開鍵、親秘密鍵です。
- 親鍵とは?
- 親鍵とは、HDウォレットのツリーの中で別の鍵のすぐ1つ上の階層にある鍵のことで、拡張鍵はすべて、自身の親鍵を指す4バイトの指紋を保持しています。
BIP-32で規定されています。
BIP-32における親子関係は序列ではなく関係です。マスター鍵は親を持たない唯一の鍵であり、その事実を4バイトのゼロからなる親指紋と深さ0で記録します。それ以外の鍵はすべて、自身のシリアライズの先頭バイトで親を名指ししており、ソフトウェアはそれによってはぐれた鍵がどこに属するかを特定します。
仕組み
親鍵は鍵そのものではなく指紋によって識別されます。親の圧縮公開鍵を取得し、SHA-256、次にRIPEMD-160でハッシュ化し、結果の先頭4バイトを保持します。この4バイトは、子の78バイトの拡張鍵のうち、深さのバイトの直後、子インデックスの直前という固定位置に置かれます。
4バイトは4,294,967,296通りの値であり、指紋は証明ではなくラベルにすぎません。BIP-32は、指紋は衝突し得ること、実装はセキュリティのために指紋に依存してはならないことを明示しています。指紋は、ウォレットが鍵を正しいツリーに素早く振り分けられるようにするために存在し、実際の確認には鍵を導出して結果を照合することが欠かせません。
親はまた、導出に必要な2つの要素、すなわちチェーンコードと鍵素材の両方を提供します。拡張鍵が対として扱われるのはそのためです。チェーンコードなしで親公開鍵だけを誰かに渡しても、そこから子を1つも計算できません。
どこで目にするか
マスター鍵の指紋は最もよく目にする識別子です。ディスクリプタと署名デバイスの両方がこれを引用するからです。
出力スクリプトのディスクリプタは、拡張鍵の前に角括弧でこれを記述します。たとえばwpkh([1a2b3c4d/84h/0h/0h]xpub.../0/*)のようになります。角括弧の部分は、その鍵がどのウォレットに由来し、どの経路を通ったかを示すため、ディスクリプタを読む署名者は、実際に保有する鍵での署名を求められているかどうかを判断できます。BIP-174の部分的に署名されたビットコイン取引は、すべての入力と出力について同じ対応関係を保持しており、これによってハードウェアウォレットはオフラインで、ある出力が他人のアドレスではなく自身のお釣りであると判断できます。
マルチシグでは、これが単なる雑学ではなくなります。Sparrowでの2-of-3の設定は、各共同署名者のマスター指紋を表示し、そのウォレットを後で再構築するには3つの拡張公開鍵とシードフレーズのすべてが必要です。各デバイスの指紋をそのバックアップカードに書いておくことは、何年も後に、それ以外は同一の3枚のシードカードを見分ける最も安価な方法であり、これを怠った人々は、どのカードがどのデバイスのものかを突き止めるために週末をかけて鍵を導出してきました。
最後に実務的な注意点が1つあります。見慣れない指紋を表示する復元済みのウォレットは、通常、破損したバックアップではなく、入力ミスのあるパスフレーズです。BIP-39のパスフレーズは異なるマスター鍵を生成し、したがって異なる指紋を生成するため、残高を確認する前にその短い値を比較することが、パスフレーズを正しく入力したかを確認する迅速かつ安全な方法です。