用語集 / アドレスと鍵
鍵フィンガープリント
- 鍵フィンガープリントとは?
- 鍵フィンガープリントとは、公開鍵のHash160の先頭32ビットを8桁の16進数で表したものであり、ウォレットはこれを使って、導出パスがどの鍵から始まるかを示すラベルとして用います。
BIP-32で規定されています。
フィンガープリントは鍵に対する固定幅のラベルであり、その幅は表示上の選択ではなくフォーマットの一部です。BIP-380は記述子の角括弧の内側にちょうど8文字の16進文字を要求しており、BIP自身のテストベクターは7文字のフィンガープリント、9文字のもの、16進以外の文字を含むものを拒否します。ウォレットが記述子のインポートを拒否したら、まずそのフィールドを数えてください。
仕組み
BIP-32は拡張鍵に長さの異なる2つの識別子を与えており、フィンガープリントは短いほうです。識別子は、シリアライズされた公開鍵のHash160、すなわちSHA-256に対するRIPEMD-160であり、チェーンコードは無視され、その識別子の最初の32ビットだけがフィンガープリントと呼ばれます。残りの128ビットは捨てられるわけではありません。BIP-32は、160ビットの完全な識別子は内部的に使用できると述べており、短い形式は親ノードと子ノードを素早く検出する手段としてのみ機能するため、ソフトウェアは衝突に対処できる必要があります。
フィンガープリントのフィールドとその周囲の鍵との間の整合性は、慣習ではなく有効性のルールです。マスター鍵には親がなく、親フィンガープリントのフィールドに0x00000000を書き込みます。また、無効として認識されなければならない鍵を集めたBIP-32の第5テストベクターには、深さがゼロでありながら親フィンガープリントが非ゼロのxprvとxpubの両方が掲載されています。これらの文字列のいずれかを問題なくインポートするソフトウェアは仕様に従っていません。復元を任せる前に知っておく価値のあることです。
表示される場所
鍵のフィンガープリントはとりわけ2つの機械可読な形式、つまり出力スクリプト記述子と部分的に署名されたビットコイン取引に存在し、どちらにおいても導出パスのすぐ前に位置します。
BIP-380は鍵の起点情報を鍵の前に角括弧で置き、幅について厳格です。ちょうど8文字の16進文字の後に、ハードニングされたステップとハードニングされていないステップが続きます。その無効な表現のリストは、この1つのフィールドの3つの失敗を挙げています。7文字のdeadbef、9文字のdeadbeeef、そして16進数字ではない文字で始まるgaaaaaaaです。3つとも完全に拒否されるため、フィンガープリントの打ち間違いは、ウォレットが誤ったブランチを静かに監視するのではなく、インポートエラーという形で代償を伴います。
BIP-174は4バイトのフィンガープリントと、32ビットのリトルエンディアン整数として書かれたパスを組み合わせており、グローバルの拡張公開鍵の項目では、それらの整数の個数がxpub自体が宣言する深さと一致しなければなりません。この個数があるからこそ、署名者はラベルを鵜呑みにするのではなく、示されたパスを渡された鍵と照合できるのです。
デバイスの画面では、同じ8文字が1つの問いに答えます。これはどのシードか、という問いです。切り詰められたハッシュは鍵やアドレスに戻すことができないため、使用可能なものを明かすことはありません。それでも識別子であることに変わりはないため、同じ8文字を持つ2つの記述子は、それら2つのブランチ間の目に見える関連付けとなります。
鍵のフィンガープリントvsビットコインアドレス
鍵のフィンガープリントとビットコインアドレスは同じハッシュから始まり、その直後から比較できなくなります。BIP-32は、拡張鍵の識別子が従来のビットコインアドレスで使用されるデータと正確に対応すると述べたうえで、その識別子をbase58で書くことは勧めていません。なぜならアドレスとして読まれてしまい、ウォレットソフトウェアはチェーン鍵そのものへの支払いを受け入れる義務がないからです。フィンガープリントは識別子の20バイトのうち4バイトを保持し、単純な16進で書かれるため、誤ってでも支払い先と取り違えられるには短すぎます。記述子の中の8文字の16進文字はパスがどの鍵から始まったかを示し、アドレスはコインの送り先として許される場所を示します。