こんにちは。AndGoのハードウェア担当の片山です。

今回はマイコンなどの低スペックのプロセッサ上でも動作するハードウェア用ライブラリであるuBitcoin (Micro-Bitcoin)のリポジトリの中身を見てみたいと思います。

UBITCOINとは

uBitcoin(https://github.com/micro-bitcoin/uBitcoin)は32bitマイコン用の軽量なビットコインライブラリです。鍵生成,リカバリーフレーズの生成,拡張公開鍵の生成,トランザクションへの書名といったウォレットを作るために必要なものが一通り揃っています。前回紹介したBowserWallet(https://github.com/arcbtc/bowser-bitcoin-hardware-wallet)やKooper(https://github.com/arcbtc/koopa)や昨年12月1日の記事でも同様のライブラリが使用されています。作者はSpecter Walletの開発にも携わっているStepan Snigirevというドイツの方で,個人で開発をされているようです。

uBitcoinはハードウェアに依存しないC++で書かれているので,様々なマイコンで使用することができ,Trezorなど多くのハードウェアウォレットに採用されているSTM32はもちろん,RISC-VやESP32などでも使うことができます。また,Arduino IDEからライブラリを簡単にインポートできますので(https://www.arduino.cc/reference/en/libraries/ubitcoin/),M5Stackのようなホビー用途でも使われているプラットフォームを利用して,独自のハードウェアウォレットを作ることもできてしまいます。ただし,Arduino IDEに対応しているとはいっても,Arduino Unoには対応していません。というのも,Arduino Unoは搭載しているマイコンが8bitですし,フラッシュメモリも32kBしかないためです。

また,楕円曲線暗号やハッシュ関数等の演算についてはオリジナルではなく,trezorのものをつかっています。きちんとメンテナンスされているコードですので信頼もおけるはずです。

実際にライブラリを使用してみる

リポジトリ(https://github.com/micro-bitcoin/uBitcoin)の中身を見てみたいと思います。srcディレクトリの中にライブラリのソースコード,testsにはユニットテスト,exampleには実装例のためのコードが入っています。

早速srcディレクトリの中を見ていきましょう。マイコンのプログラムはフラッシュメモリの制約や歴史的な背景(?)から非常に保守的でCで書かれていることが多いのですが,uBitcoinのコードのオリジナルの部分はC++で書かれています。ファイルを見てみると,Bitcoin.cpp,PSBT.cpp,Electrum.cppなどコアになるようなコードが入っていることがわかります。

さらにutilityディレクトリの中にtrezor由来のコードが入っていますが,こちらはCで書かれているようです。最終コミットが本記事を執筆している時点で7ヶ月前になっています。本家trezorのリポジトリはもっと頻繁に更新されていますが,それなりにアップデートはされていそうです。

exampleには一通りのサンプルが入っています。*.inoファイルはArduino IDEのためのファイル形式で,M5Stackなどで実行できる形になっています。さらに,cppというディレクトリを開くとPCからビルドできるサンプルが入っています。今回はこちらを試してみました。

こちらは環境依存のコードが含まれていないようので,問題なくビルドできそうです。私の環境では,警告で止まってしまうので,Makefile内の-Werrorを削除したところmakeコマンドでビルドできました。

実行してみると,画像なような出力がでてきます。このサンプルではハードコードされているニモニックから秘密鍵を復元し,ビットコインアドレスを5つ生成したあと,最後にトランザクションに署名をします。基本的なウォレットの機能を試すことができます。せっかく安価なハードウェア上で開発ができますので,マルチシグにも対応していると嬉しいところです。

まとめ

今回はオープンソースのハードウェアウォレット用ライブラリのuBitcoinについてみてきました。一人で開発できるぐらいの規模のライブラリですので,頑張れば他の人がコードの検証をできるぐらいの分量です。ビットコイン関係のプロジェクトは多くがオープンソースになっています。あまりにも大きなプロジェクトでは検証がなかなかできず,バックドアが仕掛けられるかもしれませんし,意図せずセキュリティホールができる可能性もあります。今回ご紹介したuBitcoin程度の分量であれば,様々な人がそれぞれの目的に応じて,チェックできる規模であるので非常に安心感があります。