用語集 / アドレスと鍵
鍵インデックス
- 鍵インデックスとは?
- 鍵インデックスとは、HD導出の各段階で選ばれる0から4,294,967,295までの数値で、親鍵のどの子鍵に到達するかを決めるものです。
BIP-32で規定されています。
インデックスは、ウォレットが数えるための仕組みです。ツリーの各階層は32ビットの数値を取るため、1つの親からは4,294,967,296通りの子が得られ、その範囲の上半分全体、すなわち2,147,483,648以降は、強化導出(hardened derivation)用に予約されています。日常的に目にするのは、パスの中の最後のインデックスだけです。受取を押すたびに増えていく番号です。
仕組み
インデックスは、ある子とその次の子の間で異なる唯一の要素です。導出の際、インデックスは4バイトのビッグエンディアン数値としてシリアライズされ、ハッシュ計算の前に親の鍵素材へ付加されます。そのため、インデックス0とインデックス1が生み出す結果には、互いに目に見える関係がありません。このステップで変わるものは、ほかにありません。
範囲は2,147,483,648で二つに分かれます。この境界より下では導出は通常であり、親の拡張公開鍵だけで、秘密を一切使わずに子の公開鍵を計算できます。境界以上では導出は強化され、親の秘密鍵が関与する必要があり、公開素材だけでは何も得られません。表記はその計算を隠します。84'または84hと書くのはインデックス2,147,483,732を意味し、これは84に強化オフセットを加えたものです。
同じものを表す2つの表記は、本来以上の混乱を招きます。古いドキュメントやほとんどのウォレット画面はアポストロフィを使い、m/84'/0'/0'のように書きます。一方、Bitcoin Coreが出力するディスクリプタはm/84h/0h/0hを好みます。両者は同一です。文字形式が存在するのは、シェルの引数の中のアポストロフィが引用符の危険を伴い、bitcoin-cliに貼り付けるとデバッグの面倒な形で壊れるからです。
目にする場所
パスの中の最後の数字が、日常的に目にするインデックスです。m/84h/0h/0h/0/7では、0が受取用チェーンを選び、7がウォレットが払い出した8番目のアドレスを、0から数えて示します。お釣りはチェーン1に独自のカウンターを持ちます。そのため、新しいウォレットの最初のお釣り出力はm/84h/0h/0h/1/0に位置し、2つのカウンターは独立して進みます。
連番で数えることが復元を可能にし、同時に復元を失敗させます。BIP-44は、復元中のウォレットに対し、未使用のアドレスを20個連続して導出し、そこで探索をやめるよう指示します。したがって、手前に長い空き区間を挟んでインデックス45で受け取ったコインは、手動でギャップリミットを引き上げるまで、残高ゼロとして表示されます。Bitcoin Coreは、事前に導出した鍵のプールを1,000個(既定値)保持し、消費に応じて補充することで、この議論を避けています。
探索は1階層上でも同じように働きます。復元中のウォレットはアカウント0'を確認し、履歴があればアカウント1'へ進み、取引がまったくない最初のアカウントで停止します。そのため、アカウント5'を作成し、その下のアカウントを空のままにしておくことは、将来の復元に自分のコインを見落とさせる確実な方法です。
鍵インデックスvs導出パス
インデックスは1つの数値であり、パスはそれらの順序付きリストです。m/84h/0h/0h/0/7には5つのインデックスが含まれ、通常の使用では最後の1つだけが動きます。用途、通貨タイプ、アカウント、チェーンはウォレットの存続期間中固定されるからです。この区別は、サポート記事が導出パスを確認するよう指示するときに重要になります。それはアドレスのカウンターではなく、固定された接頭辞を指しており、接頭辞が誤っていたために欠けている残高は、受取を何度押しても回復できません。