新年あけましておめでとうございます。AndGoのハードウェア担当の片山です。

前回はハードウェアウォレットの選び方についての記事を書きました。最近のソフトウェアは有料のものであってもほとんどがトライアルをしてみて機能や使い勝手などを確認するできます。しかし、ハードウェアとなるとなかなか試しに使ってみることはできません。特にハードウェアウォレットは店頭で販売しているようなものではありませんし、通販での返品前提の購入も個人情報が知られてしまうので、多くの製品を試すようなことはセキュリティ上好ましくありません。

いくつかのオープンソースのハードウェアウォレット(例えばTrezor、ColdCard、Jade)はエミュレータが提供されています。本来は開発時にデバッグ用に使うものですが、実際のハードウェアウォレットが手元に無くてもPCの画面上で実物と全く同じ動作をさせることができますので、購入前の試用にも使うことができます。以前、ColdCardのエミュレーターを動かしてみましたが、今回はTrezor Model Tのエミュレーターを実際に動かしてみたいと思います。

※エミュレータで動作させるハードウェアウォレットは本来はハードウェアウォレットの開発用です。失っても良いぐらいの少額の資産でのトライアルにとどめ、大きな資産の保管には使わないでください。

エミュレータを動作させるための環境設定

本記事ではMacOSを試用されていることを前提とします。M1チップを搭載したMacBook Airを使って動作していますが、Intel Macでもおそらく問題なく動作するでしょう。Ubuntu等のLinuxでも動作しますが、Windowsはサポートしていないようです。

まずは環境構築から。以下のものをインストールします。これらはハードウェアウォレットの他に多くのオープンソースソフトウェアの開発に使われますのでインストールしておいて損はないでしょう。

Homebrew
MacOSで動作するパッケージ管理ツールです。ターミナルを開き以下のコマンドを入力するとインストールされます。

/bin/bash -c "$(curl -fsSL <https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh>]

Git
trezor-firmwareリポジトリのクローンに必要です。
brew install git

XCode
ファームウェアのビルドに必要です。App Storeからインストールします。詳細はAppleの公式サイトへ。

Python3
エミュレータの動作に必要です。
brew install python3

Rust
ファームウェアのビルドに必要です。
brew install rust

Trezorのファームウェアは大部分はCとPython (MicroPythonというマイコンで動作させられるPython)で書かれていますが、一部はRustも使われています。暗号関連の計算はC、UIはPython、UIの部分でもイベント処理やアニメーションなどの処理はRustが使われています。

次にライブラリ等をインストールしていきます。

必要なバイナリパッケージ
brew install scons sdl2 sdl2_image pkg-config llvm
sconsはビルドツール、sdlはGUI関係のライブラリ、pkg-conifg、llvmはビルドのために必要なものです。

Pythonの仮想環境ライブラリ
pip3 install poetry
Pythonのライブラリを管理するためのツールです。

Rust
rustup default nightly
rustup update

Rustの最新リリースを使います。nightlyはbetaよりも実験的なリリースですが、安定版でなくても良いのかが個人的には不安です・・・。

エミュレータのビルド

ターミナルを起動して、適当なディレクトリでtrezorのリポジトリを取得します。

git clone --recurse-submodules https://github.com/trezor/trezor-firmware

trezor-firmwareというディレクトリができています。 中にコードが入っているはずです。cd trezor-firmware でディレクトリ内に移動します。

以下のコマンドでPython関係のライブラリを仮想環境にインストールし、その仮想環境の中に入ります。ライブラリは .env という隠しディレクトリの中にインストールされます。

poetry install
poetry shell

(2025-03-22追記) MacOSの環境ではエミュレータウィンドウに対してTrezorの描画が小さくなってしまうので、core/embed/io/display/unix/display_driver.c に1行いれます。

  SDL_SetHint(SDL_HINT_VIDEO_HIGHDPI_DISABLED, "1"); //これを追加
  drv->window =
      SDL_CreateWindow(window_title, SDL_WINDOWPOS_UNDEFINED,
                       SDL_WINDOWPOS_UNDEFINED, WINDOW_WIDTH, WINDOW_HEIGHT,

自分の環境では次のステップのコンパイルが警告で止まってしまうので、警告が出てもコンパイルを続行するようにコンパイルオプションを変更します。おそらくC/C++のコンパイラがApple Silicon用のものを使っている関係で若干コンパイラの仕様が異なるのでしょう。trezor-firmware内の以下のファイルの432行目を変更します。

core/SConscript.unix

-    '-std=gnu99 -Wall -Werror -Wuninitialized -Wno-missing-braces '
+    '-std=gnu99 -Wall -Wuninitialized -Wno-missing-braces '

いよいよビルドです。cd core でファームウェアのソースコードが入っているディレクトリに入り、以下のコマンドでビルドします。M1チップを搭載したMacBook Airで1分ほどでビルドが完了します。

make build_unix

build というディレクトリが作成されます。以下のコマンドでエミュレータが起動します。

./emu.py

エミュレータが正常に起動すると画像のようなウィンドウが現れば成功です。Trezor Model Tそのものですね。画面の右上に赤い小さな正方形が表示されているのは開発モードということを表しています。

Screenshot 2023-01-02 at 10.11.35.png

Trezor本体のエミュレータだけでは何もできないので、Trezor Suiteをインストールします。(すでにインストール済みの方はインストール不要です。)公式サイト(https://trezor.io/trezor-suite)からダウンロードしてインストールします。

Screenshot 2023-01-02 at 10.18.39.png

本来、TrezorはUSB接続して使用するものなので、そのままではエミュレータで動いているTrezorとは接続できず、上の画面のように「Connett your Trezor」という表示がでます。一旦Trezor SuiteをCommand + Qで終了し、別ターミナルを開き、以下のコマンドでTrezore Suiteを起動します。

cd "/Applications/Trezor Suite.app/Contents/MacOS"
./Trezor\\ Suite --bridge-dev

以下のようなウィンドウが表示されれば成功です。

動作させている様子の動画はこちらです。(動画ではシードフレーズをスクリーンショットで保存したり安易なPINを設定したりしていますが、決してマネしないでください・・・)

下に考えられる利用方法をまとめてみます。

  • ハードウェアウォレットを購入する前に使い勝手を確認する。
  • 自分が使っているハードウェアウォレットで使ったことがない機能を試しに使ってみる。
  • 他のハードウェアウォレットのリカバリーシードで復元できるかを確認する。(もちろん少額の資産のみが入ったウォレットで試してください。)
  • デバッガを使えばどのような処理をしているか追えるので、バックドアが仕掛けられていないか調べる。

まとめ

今回はTrezor Model Tのエミュレータを動作させてみました。ハードウェアウォレットを導入しようと考えている方も増えていますが、そのような方に非常におすすめできます。すでに所持している方も使ったことの無い機能を試したり緊急時の復元の練習にも良いでしょう。

最近は開発環境も整ってきていて、共通化もされていますので、ハードウェアウォレットに限らず、家電やガジェットを販売しているハードウェアメーカもエミュレータを提供してくれると、ユーザーが購入前に製品を試すことができて良いのになぁ、とも思ったりもしています。