こんにちは、AndGoのハードウェア担当です。
「シードフレーズを記憶する(2022年10月12日)」https://coinkeninfo.com/memorize-seed-phrase/ ではウォレットのバックアップのためのシードフレーズをより安全に管理するためのにシードフレーズそのものを記憶するための方法について紹介しました。実際にまだ記憶できているかを1ヶ月に一度確認をしていますが、本記事を執筆している2023年2月時点でもバッチリ覚えています!
記憶を定着させるためには、覚えたものを定期的に思い出してアウトプットすることが非常に効果的です。上記の記事では、シードフレーズを正確に記憶できているかをチェックするためにこちらのツール(https://iancoleman.io/bip39/)を使っています。しかしブラウザで動作するツールですので、セキュリティ上好ましくありません。他の方法としては、紙に書いたシードフレーズを見て時々チェックするという方法もありますが、定期的に紙を取り出すこともリスクになります。
そこで、今回は記憶しているシードフレーズを入力して答え合わせすることができるガジェットを作ってみました。名付けて「BIP39 SeedPhraseChecker」です。
このガジェット以下のような特徴があります。
- インターネットから切断されている
- 内部にシードフレーズを保存しておく必要がない
- 単機能かつシンプルなデザインでわかりやすい
特に二つ目はシードフレーズの仕組みと関係しています。
このガジェットはアルファ版ではありますがオープンソースとして公開します。今回の会員様向けの記事では実際に皆様に使っていただくための方法を一足先にご紹介しつつ、シードフレーズのしくみについてを解説しますのでぜひ御覧ください。
※ハードウェアは市販品ですが、オープンソースですので自由に使っていただくことができます。利用する際には自己責任でお願いします。
※シードフレーズの単語数は12〜24単語ですが、現時点では24単語のチェックにしか対応していません。Trezor Model Tなどはデフォルトで12単語なので、その他の単語数についても対応する予定です。→ 2023.2.16 12〜24単語に対応しました。
紹介
ハードウェアを一から制作するのは非常に大変ですので、M5Paperというプロトタイピングのためのプラットフォームを利用しました。e-inkを搭載していて、見た目は小型の電子書籍リーダーのような感じです。以前、DIYハードウェアウォレット勉強会(https://coinkeninfo.com/hww-study-report/)で使用したM5Stack Core2と同じシリーズです。M5Stack Core2でも作れそうだったのですが、画面が小さく文字入力が大変そうだったので、大型のディスプレイを搭載したものにしました。
動作についてはこちらの動画をご覧ください。(最初は手入力していますが時間がかかるので、途中から自動入力させています。動画がブレブレで申し訳ございません・・・。)
画面上のソフトウェアキーボードからシードフレーズを入力していきます。単語の誤りやチェックサムが間違っていると、間違っているよ!と指摘してくれます(0:21や0.54)。正しいシードフレーズを入力すると「Valid seed phrase.」と表示されます(1:14)。
右上の「x」ボタンを押すと画面が消去されて電源が落ちます(01:04)。残像が残らないように、ランダムな文字を数回書いてからリフレッシュして電源を落としています。念の為メモリもきれいに消去します。
ESP32を使用しているM5Paperは実はデュアルコアプロセッサを積んでいるので、シードフレーズのチェックをUIの処理とは別のコアで動作させているのが技術的なアピールポイントです。UIの処理をチューニングすればまだまだサクサク入力できると思います。
なおソースコードはAndGoのGitHubのリポジトリ(https://github.com/andgohq/seed-phrase-checker)で公開していますので、ぜひ開発に加わってください。
早速使ってみましょう
実際にご自身でM5Paperをご購入いただければ使ってみることができます。PCからファームウェアの書き込みが必要ですが、非常に簡単で、以下の3ステップです。
Step 1. M5Burnerのインストール
Step 2. M5Paperのドライバーをインストール
Step 3. ファームウェアの書き込み
M5Paper本体はだいたい13,000円程度で以下のようなところから購入できます。ハードウェア屋さんの中では非常に有名な電子パーツストアです。身元が知られたくない方は、秋月電子通商やマルツでしたら秋葉原に店舗がありますので、もしかしたら直接購入できるかもしれません。
- 秋月電子通商 https://akizukidenshi.com/catalog/g/gM-17206/
- マルツ https://www.marutsu.co.jp/pc/i/2228280/
- SwitchScience https://www.switch-science.com/products/7359
あとUSB Type-Cのケーブルが必要です。データ転送ができるものでしたら何でもOKです。
Step 1. M5Burnerのインストール
ファームウェアを書き込んでいきます。M5Burner(https://docs.m5stack.com/en/download)というアプリをダウンロードします。Windows/Mac/Linux用がありますので、環境に合わせたものを入手してインストールしてください。

Step 2. M5Paperのドライバーをインストール
M5Paper用のドライバーも必要です。こちらのURL(https://docs.m5stack.com/en/core/m5paper_v1.1)を開き、Driver Instllationのところから入手します。CP2104とCH9102、二種類のバージョンがあるようでとりあえず両方ダウンロードしてインストールします。

Step 3. ファームウェアの書き込み
M5Burnerを起動し、左のメニューからPAPERを選択します。「BIP39 SeedPhraseChecker」を探し、「Download」ボタンを押します。ダウンロードが完了したら、M5Paper本体とPCをUSBケーブルで接続し、「Burn」ボタンを押します。

”This is an unofficial firmware, are you sure you want to continue?” と聞かれますが、M5のオフィシャルではないというだけで自作したものですので、Continueを押して続行します。

COMにWindowsであればCOM、MacOSであればtty.wchusbserialで始まるポートを選択します。BaudRateは転送速度です。とりあえず一番大きなものを選択し、うまくいかなければより小さなものに変更します。

プログレスバーが表示され、100%までいけば完了です。”Hard resetting via RTS pin..."という表示が出ます。時々出ませんが、たぶん大丈夫です。

最後にUSBケーブルを抜くとBIP39 SeedPhraseCheckerが起動します。M5Paperはバッテリーでも駆動します。起動しない場合は上のジョグダイアルを長押しします。あとは冒頭の動画のようにシードフレーズを入力していきます。Valid sheed phrase.と表示されれば入力したシードフレーズが正しいことが分かります。まずはこちら(https://iancoleman.io/bip39/)から生成したダミーのシードフレーズを入力してみて練習してみると良いと思います。
電源を切るには画面右上の☓ボタンを押します。Would you like to shutdown?と聞かれるのでYを押すと画面がリフレッシュされたあとに電源が切れます。
シードフレーズのチェックの方法
BIP39 SheedPhraseCheckerはシードフレーズをフラッシュメモリに保存せずに、チェックだけを行うことができます。ここではそのしくみについて説明します。
シードフレーズは12〜24個の英単語で構成されており、使用できる単語は決められた2048単語です(https://github.com/bitcoin/bips/blob/master/bip-0039/english.txt)。これら2048単語は
- 最初の4文字は重複しない
- 紛らわしい単語を使用しない
というポリシーに則って選定されています。英単語以外にも、日本語、韓国語、スペイン語、中国語、フランス語、イタリア語、チェコ語、ポルトガル語の単語もありますが、互換性はありません(https://github.com/bitcoin/bips/blob/master/bip-0039/bip-0039-wordlists.md)。ちなみに日本語の745単語目は「さとし」です。
2048という数字は2の11乗ですので、11ビットで表すことができます。24単語分で合計264ビットとなります。乱数を使って決めていきますが、自由に乱数で決められるのは最初の256ビットまでです。残り8ビットはチェックサムといい、全体の264ビットに誤りがないか確認をするためのものです。チェックサムを計算するためには最初の256ビットからSHA256でハッシュ値を計算し、さらに得られたハッシュ値の最初の8ビットを使用します。
24単語以外の単語数の場合については乱数のビット数とチェックサムのビット数が異なります。その他詳しい仕様はBIP39(https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki)を御覧ください。

じつは皆さんおなじみのバーコードにもチェックサムがついています。バーコードの場合は最後の一桁がチェックサムで、誤りを防止するためのものです。
まとめると、シードフレーズをチェックするためには
- 単語が2048単語のリストに含まれていること
- チェックサムが一致していること
が満たされていれば良いことになりますので、今回作成したガジェットは内部のフラッシュメモリーにシードフレーズを保存せずに、入力されたものが正しいかだけを判断することができます。
もちろん誤って入力したシードフレーズが偶然、チェックサムが一致してしまうということが、1/256の確率で起こりますが、そうそうないと考えて良いでしょう。先に単語そのもののスペルを誤ってしまうことや、2048単語に存在しない単語に間違えることもあるからです。また、チェックサムの計算にはハッシュ値を利用しているので、たとえば単語が入れ替わっただけではチェックサムが一致することは、ほぼ起きません。
まとめ
今回は作成したシードフレーズの暗記をサポートするためのガジェットをご紹介しました。ビットコインの基本的な技術は全てオープンになっています。また、符号暗号やプログラミングの知識があれば、エコシステムの構築に貢献できることが魅力です。もし、BIP39 SeedPhraseCheckerに興味を持たれましたら実際に使っていただきたいですし、開発に参加していただけるとより理解も深まり、面白さを実感していただけるはずです。
今後は以下のような機能改善を予定しています。他にもご意見やご要望などあればぜひお寄せください。
- キー入力のレスポンスの向上
- カーソル移動
- オートパワーオフ
- 入力済みの単語を隠す機能
- 24単語以外のシードフレーズへの対応