用語集 / ウォレットとカストディ
HDウォレットのシード
別名はルートシードです。
- HDウォレットのシードとは?
- HDウォレットのシードとは、生のバイナリ数値、すなわち128~512ビットの値のことであり、BIP-32が1回のハッシュに投入してウォレットのマスター鍵とチェーンコードを生成するものです。
BIP-32で規定されています。
ウォレットが単語について語るのは、人が単語を手で書き写せるからですが、BIP-32は単語を一切見ません。バイト列を受け取り、固定テキスト「Bitcoin seed」を鍵とするHMAC-SHA512の1回の処理でマスター鍵を生成します。単語はそのバイト列の一般的な符号化の1つであり、使用されている唯一の符号化ではありません。
仕組み
BIP-32は128~512ビットのシードを規定し、256を推奨し、そのビットがどこから来るかについては何も述べていません。シードはメッセージとしてHMAC-SHA512に入り、ASCII文字列「Bitcoin seed」が鍵になります。この関数は64バイトを返します。左側の32バイトがマスター秘密鍵になり、右側の32バイトがマスターチェーンコード、すなわち漏えいした子鍵が兄弟鍵を露出させるのを防ぐ追加の秘密になります。ウォレット内のその他すべて、すなわちすべてのアカウント、すべてのアドレス、すべての釣り銭出力は、インデックス番号を伴う同様のハッシュを繰り返すことで、この組から派生します。
仕様には、実際には決して起こらない1つのエッジケースが含まれています。左側の32バイトがゼロになった場合、またはsecp256k1曲線の位数以上の値になった場合、そのシードは無効であり、ウォレットは再試行しなければなりません。確率は2の127乗分の1程度であるため、これに遭遇したと報告した実装はこれまでにありません。
ビットがどこから来るかは別の層であり、いくつかの答えがあります。BIP-39は、ニーモニックをPBKDF2に通すことで常に正確に512ビットを出力します。Electrumは独自のフレーズを異なるソルトでPBKDF2に通し、同じ単語からBIP-39のツールが決して再現できないシードを得ます。ウォレットは、ハードウェア乱数生成器から256ビットを直接取得し、フレーズを一切表示しないこともでき、Bitcoin Coreはそうしています。
変換の向きが重要です。単語はシードになりますが、シードが単語になることはありません。ウォレットが生の値だけを保持している場合、どのようなソフトウェアでもそのニーモニックを出力することはできません。そのため「シード」をエクスポートすることは、それを生成したフレーズを保持することの代わりにはなりません。
どこで見られるか
Bitcoin Coreでウォレットについて問い合わせると、フレーズではなくhdseedid、すなわちシードのフィンガープリントが報告されます。CoreはBIP-39を一度も実装していないためです。バージョン0.17.0で追加されたsethdseedRPCは、特定のシードをレガシーウォレットに導入でき、ディスクリプタウォレットはBitcoin Core 23.0で新規作成されるウォレットの既定になりました。
開発者向けドキュメントも、これが公に現れるもう1つの場所です。BIP-32とBIP-39はいずれも、シードを生成したニーモニックの隣に128桁の16進文字列として示すテストベクターを公開しており、この2つが別のオブジェクトであることを示す最も明確な例になっています。
これが実際に問題になるのは、ツール間の移行のときです。Coldcardのシードバックアップや各種の開発者向けユーティリティを含む一部のウォレットと仕様は、単語ではなく生の値をインポートまたはエクスポートします。生のシードをニーモニックを期待するツールに渡す、あるいはその逆を行うと、エラーになるか、さらに悪い場合は有効だが空のウォレットになります。フィールドに何かを貼り付ける前に、そのフィールドがどの層を求めているかを確認してください。
HDウォレットのシードvsシードフレーズ
シードは数値であり、フレーズはその数値を書き留める方法です。この2つを区別すると、そうでなければ魔法のように見えるいくつかのことが説明できます。任意のパスフレーズを追加すると、単語はそのままにシードが変わるのはそのためです。ElectrumのフレーズとBIP-39のフレーズがどちらも12個の英単語でありながら、異なるウォレットを開くのはそのためです。そして、「シードのインポート」をうたうウォレットがニーモニック、16進文字列、拡張秘密鍵のいずれかを意味しうるのはそのためであり、これら3つの入力は呼び名を共有するだけで他には何も共通していません。