btc: ニモニック
2025/03/24
はじめに
HDウォレットとニモニックについて整理したい。
HDウォレット
HDウォレット(BIP-32)は階層的にウォレットを構成することで頭の seed を決めればあとは階層のデータを埋めることで秘密鍵を作ることができますよ、というしくみだ。
おかげで秘密鍵全部をバックアップせず seed だけ残しておけば最低限のバックアップになる。
実際は階層として何を使ったのかも記録しておかないと面倒なのだが、seed に比べれば機械作業に過ぎぬ。
BIP-32 は階層にするところまでで、階層を規定したのは BIP-44。
coin_type'
に関する BIP には BIP-49(P2WPKH nested in BIP-16), BIP-84(P2WPKH), BIP-86(P2TR) がある。
m / purpose' / coin_type' / account' / change / address_index
seed とマスター鍵
seed != マスター鍵である。
seed が 128~512 bits の乱数で、
Key=”Bitcoin seed”、Data=seed で HMAC-SHA512 計算をした値を I
とし、それを半分に割って IL
、IR
とする(左半分と右半分)。
左半分が master secret key、右半分が master chain code である。
master secret key は IL
ではなく parse256(IL)
と書かれている。
parse した結果が 0 と等しいか n
以上だと NG。
parse256()
は 32byte データを 256 bit(MSBが先頭)として見た数値。
MSB が先頭と書いてあるけど、つまり見た目通りの数値として値にすればよいのだ。
拡張鍵
extended key はこう。
- extended private key は前半 256 bit が private key で後半 256 bit が chain code
- extended public key は前半 256 bit がその public key で後半 256 bit が chain code
人間が目にするときは文字列にシリアライズする。 最初にバージョンを付けてからエンコードすることで見分けるようになっていたが、P2TR でまたオリジナルに戻った。というか定義しなくなった。
- BIP-32: P2PKH? :
xprv
,xpub
- BIP-49: P2WPKH-nested-in-P2SH:
yprv
,ypub
- BIP-84: P2WPKH:
zprv
,zpub
- BIP-86: P2TR(single key):
xprv
,xpub
ニモニック
機械語を触ったことがあるとニモニックという言葉も聞いたことがあるかもしれない。 「記憶を助ける」ということで、機械語の数値だと何だかわからないので “mov” とか “inc” のように言葉を割り当てるのだ。
BIP-39 の場合は abstract に seed に変換すると書いてあるので、 ニモニックコードとして 12 単語なり 24 単語なりを作り、それを seed に変換するのだ。 seed をニモニックに変換するわけではないので、もし拡張鍵がわかっていたとしてもニモニックには変換できないだろう(試してないけど)。
とはいっても、ニモニックを記憶している人はいるのだろうか。。。
いや、いないとはいえないくらいの単語数なのだけど、普通は覚えておこうともしないと思う。
それだったら、もう拡張鍵をシリアライズした文字列でもいいんじゃなかろうか。
書き写すときに間違ってしまいそうな気はするけどね。
単語になっていると間違う可能性はたぶん低いんだろう。
単語リストも何言語か用意されているので、身近な言語であればさらに間違いにくいという理由かしら。
ニモニックを生成するのに、まずエントロピーというものが出てくる。
エントロピーはいろいろな分野で出てくるが、暗号とか情報とかで出てくるときはパスワードの強度だったり乱数の乱数具合とか、
そういう特定のされにくさ?を数値にしたもののようだ。
あんまりよくわかってないんだけどね・・・。
パスワードとして使うことができる文字の種類だったりパスワードの長さだったり。
文字種が少ないより多い方がエントロピーが高いし、それよりも文字数が長い方がエントロピーが高いとか。
正しいことを書いている気がしないので、詳しいことは各自調べよう!
とにかく BIP-39 では、エントロピーが 128 bit だとニモニックは 12単語、256 bit だと 24単語ということになっている。 sparrow wallet でもウォレットの作成時に単語数がいくつか選択できるのはこの表に従っているのだろう。
単語リストはいくつかの言語で用意してあるが、
アプリでは英語版だけ使っているのが多いと思う。
単語が 2048 = 211 個載っているので、
エントロピーとチェックサムつなげたデータを 11 bit ごとに区切って
単語リストの該当する行から単語を持っていく。
エンディアンとかそこら辺までは文章を読んでないが、だいたいそういう感じだろう。
あとはニモニックからseedに変換するだけだ。 面倒なので省略。
パスフレーズ
なぜか知らないが、ニモニックの単語列をパスフレーズと呼ぶことが多い。
しかし BIP にはパスフレーズという言葉を使う BIP-38 がある。
秘密鍵の暗号化に使うそうだ。 extended private key でも使えるのだろうか?
ともかく、ウォレットの復元で「パスフレーズの単語群」を求められた場合はニモニックのことだと思っていてよいだろう。
おわりに
くどいけど、ニモニックをバックアップとして使うときはアドレスのタイプも残しておいた方が手間が少なくてよいです。 復元しようとして入力した後で聞かれると、知識がないと「復元に失敗した!」って思いかねないからだ。