用語集 / アドレスと鍵
導出パス
- 導出パスとは?
- 導出パスとは、HDウォレットの鍵ツリーにおける経路をm/84h/0h/0h/0/0のように表したもので、シードから何十億もの鍵のうちどの鍵を復元すればよいかをソフトウェアに正確に伝えます。
BIP-44で規定されています。
パスは座標であり、秘密ではありません。先頭付近の2つの数字が、あなたの単語から、1、3、bc1q、bc1pのどれで始まるアドレスが復元されるかを決めます。BIP-44、BIP-49、BIP-84、BIP-86はそれぞれ同じフレーズを異なる方法で読み取るからです。パスをバックアップのそばに記録しておくことが、コインを見つけられる復元と、残高がゼロと表示される復元とを分けます。
仕組み
パスは左から右へ、スラッシュごとに1階層ずつ読まれ、各階層が検索を絞り込みます。先頭のmはシードから生成されるマスターキーです。その後に続くものはすべてインデックスであり、アポストロフィまたはhはそのインデックスがハードニング済みであることを示します。
最初の階層は目的(purpose)であり、あなたのアドレスがどのような形になるかを決める階層です。
| 規格 | アカウントパス | 生成されるアドレス |
|---|---|---|
| BIP-44 | m/44h/0h/0h | レガシー、1で始まる |
| BIP-49 | m/49h/0h/0h | ネストされたSegWit、3で始まる |
| BIP-84 | m/84h/0h/0h | ネイティブSegWit、bc1qで始まる |
| BIP-86 | m/86h/0h/0h | Taproot、bc1pで始まる |
2番目の階層はコインタイプで、SLIP-0044の登録簿から取得します。そこではbitcoinは0、すべてのtestnetは1です。3番目はアカウント番号で、これにより1つのシードが0hの個人用ウォレットと1hの業務用ウォレットを、履歴を共有せずに保持できます。その後はハードニングが終わります。4番目の階層はチェーンで、受け取り用に渡すアドレスには0、おつりには1です。5番目はアドレスインデックスで、支払いを受け取るたびに上へ数えていきます。
ハードニング済みの階層と通常の階層のこの分割は意図的なものです。アカウント階層がハードニング済みであるため、m/84h/0h/0hの拡張公開鍵をスマートフォンや会計担当者にエクスポートでき、その相手は配下のすべての受け取り用アドレスとおつり用アドレスを導出できますが、別のアカウントへ横に移動したり、マスターキーへ上にさかのぼったりはできません。
マルチシグは独自のブランチを使います。BIP-48は、ネイティブSegWitの場合、共同署名者の鍵をm/48h/0h/0h/2hに置き、最後のハードニング階層がスクリプトタイプを示すため、デバイスは何かに署名する前に、単一署名のアカウントとマルチシグのアカウントを区別できます。
ビットコインを購入する際にこれが重要な理由
パスがあなたのセキュリティに触れることはありません。コインの盗難の難しさには何も変えず、目の前のソフトウェアがコインを見つけられるかどうかにはすべてを変えます。
これが引き起こす障害はよくあるもので、確実に恐ろしいものです。取引所で購入し、デバイスへ出金すると、コインはm/84h/0h/0h配下のbc1qアドレスに届きます。1年後、同じ24語を、レガシーを既定とする別のアプリに復元すると、残高は0.00000000と表示される一方、ブロックエクスプローラーはあなたの資金が古いアドレスに手つかずで残っていることを依然として示しています。何も失われていません。アプリが、各階層に40億の子を持つツリーの誤ったブランチをたどっているだけです。
既定値は当サイトがレビューするウォレットごとに異なります。Trezor SuiteとLedger Liveはどちらもアカウントをアドレスタイプ別に表示し、あなたのために目的を黙って選びます。Electrumは復元時にどのスクリプトタイプを望むかを尋ね、詳細オプションの背後にフリーテキストのパス入力欄を隠しています。Sparrowは複数の標準パスを一度にスキャンし、どれに履歴があるかを示します。どれも間違っておらず、どれも他のウォレットが何をしたかを推測することはできません。
2つの習慣が問題全体を取り除きます。アカウントパスとアドレスタイプを、ウォレット名と同じメモに書き、そのメモをシードなしでたどり着ける場所、たとえばパスワードマネージャーに保管してください。パス単体では何も明らかにならないからです。次に、復元を信頼する前に、それが表示する最初の受け取り用アドレスを、元のデバイスが表示するアドレスと比較してください。この2つの文字列が一致すれば、その下のすべてのアドレスも一致します。
24語をElectrumに復元してゼロが表示される場合
誤ったパスでの復元は次のように展開します。Trezor Model Tが24語で設定され、取引所からの出金がその最初のネイティブSegWitアドレスに送られ、デバイスは今引き出しの中にあります。数か月後、そのフレーズがノートパソコンのElectrumに入力されます。
Electrumはスキャンの前にスクリプトタイプを尋ねます。レガシーのp2pkhを選ぶと、m/44h/0h/0hを導出し、1で始まるアドレスを表示し、何も見つからず、空のウォレットを報告します。コインは依然としてbc1qアドレスにあり、依然として承認済みで、txidを知る誰にでも依然として見えます。
修正には1分かかります。もう一度復元してネイティブSegWitを選ぶか、詳細な導出欄を開いてm/84'/0'/0'を手入力してください。Electrumが再スキャンし、残高が現れ、アドレス一覧がTrezorの受取タブに表示されるのと同じ文字列で始まります。それでもゼロと表示され、支払いがブランチのさらに先に送られたと分かっている場合は、何かが欠けていると決めつける前に、ギャップリミットを既定の20から引き上げてください。
その一連の手順のどこにもコインへのリスクはありませんでした。復元は読み取り操作だからです。各目的を順番に1つずつ試すことができ、かかるコストは再スキャンごとの時間だけです。
導出パスvs出力ディスクリプタ
パスはどこを指すかを示し、ディスクリプタはどこを、何を、どの鍵から始めるかを示します。ディスクリプタwpkh([fingerprint/84h/0h/0h]xpub/0/*)は同じパスに加えて、ラッパー関数としてのスクリプトタイプ、拡張鍵そのもの、そして打ち間違えた文字を検出するチェックサムを含みます。誰かにパスを渡しても、あなたのウォレットについては何も伝わりません。ディスクリプタを渡すことは、あなたのアドレス履歴全体とそのブランチ上の将来のすべてのアドレスを引き渡すことであり、だからこそ一方はメールで送っても安全で、もう一方はそうではありません。