用語集 / アドレスと鍵
拡張鍵
別名はxpub、xprv、拡張公開鍵、拡張秘密鍵、Extended keyです。
- 拡張鍵とは?
- 拡張鍵は、通常のビットコインの鍵と32バイトのチェーンコードを組み合わせたものであり、この組み合わせによってソフトウェアはその下にある鍵の枝全体を派生させることができます。
BIP-32で規定されています。
xpubは公開鍵ではありません。xpubは78バイトの構造であり、バージョン、深さ、親のフィンガープリント、子インデックス、32バイトのチェーンコード、そして鍵そのものをBase58Checkで包んで111文字の文字列にしたものです。xpubを1つ会計士に渡せば、その会計士はそのブランチ上のすべてのアドレスと、そのブランチがこれまでに受け取ったすべてのサトシを読み取ることができますが、何も支出することはできません。
仕組み
拡張鍵が存在するのは、素の鍵だけでは子鍵を生成できないからです。BIP-32の導出では、親のチェーンコードとその鍵素材およびインデックスをまとめてハッシュ化し、チェーンコードが兄弟鍵同士を互いに関係のないものに保つ追加のエントロピーを供給します。チェーンコードを取り除けば、そこから導出するものは何も残りません。
シリアライズは78バイトに固定され、順序は厳密です。4バイトのバージョン、1バイトの深さ、4バイトの親のフィンガープリント、4バイトの子インデックス、32バイトのチェーンコード、33バイトの鍵データです。秘密拡張鍵は32バイトの秘密を先頭のゼロで埋め、両方の形式が同じ幅を占めるようにします。バージョンバイトが読み取り可能な接頭辞を生み出します。0x0488B21Eはxpub、0x0488ADE4はxprv、テストネットの相当値はtpubとtprvを出力します。
これらに対して2つの導出関数が働きます。公開側の関数はxpubだけで非ハードニングの子鍵を計算し、決済処理業者が支出可能なものを何も保持しないウェブサーバー上で数千の請求書アドレスを生成するのはこの方法です。秘密側の関数はハードニングされたインデックスを含め何でも計算し、xprvを必要とします。
ypub、zpub、vpubにも出会うことになります。これらはSLIP-0132に由来し、同じ78バイトのレイアウトを異なるバージョンバイトで再利用してスクリプトの種類を示す取り決めです。Bitcoin Coreはこれを採用せず、BIP-380の出力スクリプト記述子がスクリプトの種類を完全に明示することでこの考え方をきちんと置き換えました。例えばwpkh([1a2b3c4d/84h/0h/0h]xpub.../0/*)のようになります。
ビットコインを購入するときにこれが重要な理由
拡張公開鍵は、技術的には秘密ではないものの、これまでに共有を求められる中で最も機微な情報であり、その要求はたいてい日常的なものに見えます。
拡張公開鍵をエクスポートする正当な理由は3つあります。ウォッチオンリーウォレットを設定し、スマートフォンでハードウェアウォレットの残高を表示できるようにすること。自己ホスト型の決済処理業者に、請求書アドレスを取得すべきブランチを渡すこと。マルチシグを組み立てることで、各共同署名者が1つのxpubを提供し、たとえすべてのシードフレーズが残っていても、後でウォレットを再構築するにはそのすべてが必要になります。
それ以外はすべて疑うに値します。当サイトでレビューしている取引所があなたに出金するために拡張鍵を必要とすることはなく、必要なのはアドレス1つです。ウォレットを検証するためにxpubを求めるサポート担当者は、せいぜいプロファイリングをしているにすぎません。xprvを求める人はコインを求めているのであり、正しい対応は会話を打ち切ることです。
この開示は、人々が過小評価する形で恒久的でもあります。xpubは今日の残高だけでなく、そのブランチ上の過去と未来のすべての支払いを明らかにします。なぜなら保有者は、あなたが連絡を絶った後もずっと新しいアドレスを導出し続けられるからです。取り消しはできません。元に戻すには新しいシードを生成し、すべてのコインを移動して、保有するすべてのインプットに対して手数料を支払う必要があります。
ここに固有の罠が1つあります。誰かがあなたの拡張公開鍵を保有し、さらに非ハードニングの子秘密鍵を1つでも入手すると、その人は親の拡張秘密鍵を再構築してブランチ全体を支出できます。BIP-32はこのことを自身のセキュリティに関する注記で述べています。アカウント階層がハードニングされているのはこのためであり、一部のツールが今も提供している、最新のウォレットから個々の鍵をエクスポートする機能が、便利な機能ではなく危険な便宜であるのはこのためです。
会計士があなたのxpubでできることとできないこと
拡張公開鍵を渡せば、境界ははっきりしています。ハードウェアウォレットからm/84'/0'/0'のアカウント拡張公開鍵をエクスポートし、確定申告を準備する人にメールで送ったとします。
その人はそのアカウント下のすべての受取アドレスとすべてのお釣りアドレスを導出し、それぞれを任意のブロックエクスプローラーで参照し、入出金の金額の日付付きの完全な履歴を再構築できます。現在の残高を1サトシまで合計し、それが変化し続けるのを監視し続けることもできます。まだ使用していないアドレスを導出し、あなたがそれを使った瞬間を見ることもできます。
その人は何にも署名できません。ハードニングされた子鍵は公開側からは到達できず、m/84'/0'/1'のような兄弟アカウントはその人から見えず、マスター鍵も同様です。その人はそこから秘密鍵を復元できません。ただし、あなたがその下にある個々の鍵の1つを別途渡した場合は別で、それが上記の失敗事例です。
拡張鍵vs公開鍵
公開鍵はsecp256k1曲線上の点であり、圧縮時には33バイトで、署名を検証します。拡張公開鍵はその同じ点に32バイトのチェーンコードと位置を記述する4つのフィールドを加えたもので、数十億のさらなる公開鍵を生成できます。公開鍵を公開すれば1つの出力分の情報が明らかになります。拡張公開鍵を公開すればウォレットが明らかになります。
拡張鍵vs Wallet Import Format
xprvとWallet Import Formatの文字列はどちらも鍵素材をBase58でエンコードしており、類似点はそこまでです。WIF文字列はネットワークバイトとチェックサムを伴う1つの秘密鍵を保持し、単一のレガシー鍵を移動するのに役立ち、それをインポートするとその鍵にロックされたコインが正確に復元されます。xprvは鍵に加えてチェーンコードと位置を保持し、無制限のブランチを再生成できます。人々がつまずくのはこの非対称性です。WIFを最新のウォレットにスイープするのは日常的な片付けですが、xprvを不慣れなソフトウェアに貼り付けると、その下にあるすべてを一度に引き渡すことになります。