見出し画像

ニーモニックフレーズ|詳解ビットコイン⑥

『詳解ビットコイン』(Kalle Rosenbaum著、オライリージャパン)を読んでいます。その個人的なまとめとして書いていきます。

HDウォレットによって使い勝手が向上

ビットコインウォレットは、HDウォレットの登場によって管理しやすくなりました。

HDウォレットがなかったら秘密鍵の管理が大変です。ビットコインでは、どの利用者がどのアドレスを保有しているかがわかりづらくなるように、利用しているうちに新しいアドレスが作られていきます。そのため、ユーザーは各アドレスの秘密鍵を安全に保管しなければいけません。管理すべきアドレスが何十個もあると、紛失の恐れが高まったりどれがどれだかわからなくなったりしそうです。

上記の問題を解決したのがHDウォレットです。HDウォレットであればバックアップするのはたった1度だけです。以下の黒枠部分の「乱数のシード」だけを保管していれば、すべてのアドレスのバックアップが取れている状態になります。

ニーモニックフレーズによって使い勝手がさらに向上

ビットコインでは、ウォレットの管理を簡単にするためのさらなる改良がされています。その改良内容とは、シード(秘密鍵の元になる乱数値)をニーモニックフレーズに変形して使うというものです。

シードは16進数で表された32個や64個の文字です。一方で、ニーモニックフレーズは12個や24個の英単語です。ニーモニックフレーズを使うことによって、メモを取る際にミスすることが減ることでしょう。

16進数で表された32文字分は、16の32乗分の大きさです。16の32乗は2の128乗と一致するので、サイズは128ビットです。同様にして、16進数で64文字分であればその大きさは256ビットです。

また、メモを取り間違えてしまったとしても、アドレスを復元できるケースはあります。ニーモニックフレーズに使われる単語は、2048語が並んだリストから選ばれるので、それを手掛かりにメモを取り間違えたことに気づける可能性があるのです。

例えば、本当は「merge」なのに「marge」とメモを取ってしまったときは、メモの取り間違いだと気付ける可能性は高そうです。2048語の単語リストを見てみると「marge」なんて単語はないことから、ユーザーは「この単語で間違えているな」と気づけます。

また、正しくは「change」なのに「chance」とメモを取ってしまったとしても、間違いに気づける可能性は十分あります。単語リストには「chance」は含まれていないので、ユーザーは「chanceと似ている単語が正解かも?」と考えていけます。

リストに載せる単語の選出は、この辺りも考慮して行われたようです。ちなみに、単語リストは以下のようになっています。

ニーモニックフレーズに変換する流れ

シードからニーモニックフレーズに変換する流れは、以下のとおりです。

  1. シードを作成

  2. 2進数に変換

  3. チェックサムを追加

  4. 11ビットずつに整列

  5. 10進数に変換

  6. ニーモニックフレーズに変換

ネット上にあるツールを使うと、実際にニーモニックフレーズを作ることができます。ここでは実際に試しながらその手順を記載してみます。

①シードを作成

まずは乱数のシードを作ります。今回は以下のサイトを使って、16進数で32文字の値を生成しました。

生成した値は以下です。

①2進数に変換

16進数で表記されているシードを2進数に変換します。

16進数1文字は、2進数で4文字になります。例えば、16進数の「0」を変換すると2進数の「0000」になります。そのため、32文字の16進数を2進数で表すと、128文字になります。

今回は以下のサイトを使って変換してみました。

https://note.cman.jp/convert/bit/

変換した結果は以下の通りです。

③チェックサムを追加

次に、2進数に変換したシードの末尾に、4つの2進数を追加します。追加する文字は何でもよいわけではなく、シードをSHA-256でハッシングして、その出力の最初の4ビット分です。

以下のサイトを使うとSHA-256でのハッシングができます。

今回ハッシングするのは、シードである「0EFC7726932C355F66C1BE4431700A9B」です。これの出力は、「374564d9031c5d3e51c79c74fffe06ce67b14331a3d537b01912568d809d0a58」です。16進数の3は、2進数で表すと「0011」なので、末尾に「0011」を追加します。

チェックサムとして4ビットを加えることは、ニーモニックフレーズからシードを算出する際に役立つ可能性があります。シードを算出する際には、ニーモニックフレーズへの変換とほぼ逆の操作をすることになりますが、その中ではチェックサムを使った検証が行われ、その検証で間違っているという結果になれば、変換は中止されます。

④11文字(11ビット)ずつに整列

チェックサムを末尾に加えた2進数のシードを、11文字ずつに分けます。

実際にやってみると、以下のように12個のグループができます。

④各グループを10進数にする

グループ(11文字)ごとに10進数に変換していきます。この変換も、以下のサイトを使えばできます。

https://note.cman.jp/convert/bit/

実際にやってみると以下のようになります。

⑤各グループを単語に変換する

10進数に変換できたら、一つずつ単語リストの英単語に変換していきます。英語の単語リストは以下から確認できます。

https://github.com/bitcoin/bips/blob/master/bip-0039/english.txt

単語に変換すると以下のようになります。

この記事が気に入ったらサポートをしてみませんか?