BlueWalletというLightning Networkに対応したビットコインウォレットをご存じでしょうか。
見た目がよく、結構安定しているということで人気なウォレットです。
今回は、このBlueWalletのソースコードを解析することで、設計思想やどの程度手堅い作りをしているか、ということに迫ってみたいと思います。
全体像
BlueWalletのソースコードはGitHubにてMITライセンスの下に公開されています。
https://github.com/BlueWallet/BlueWallet/
MITライセンスというのは平たく言うと、ソースコードを再利用していいよ、ただしコピーライトはちゃんと明記してね、というライセンスです。商用利用も問題なく、勝手が良いため現在オープンソースプロジェクトを公開する際によく利用されています。
GitHubで公開されているプロジェクトの場合、Insightsというページを開くとどの程度開発が活発かが分かります。
さて、BlueWalletのGitHubにてトップページやInsightsを覗いてみる(添付図)と、ぱっと見で以下の事がわかります。
- 開発がとても活発(7月10日〜17日だけでも5人によって数十ものコミットが当てられている)
- 中の人以外も開発に参加するコミュニティが育っている(Contributersが65人いる)
- 開発項目がチケット化されBacklogにて管理されており、どう開発に参加すればよいか分かりやすい
アプリのアップデートが速いなあ、とは思っていましたがこんなところにも秘密がありそうです。
さて、実際にソースコードの中身に目を向けてみると、
- ReactNativeというHTML, Javascriptベースな開発基盤を採用している
- bitcoinjs-libなど、業界のオープンソースなライブラリをがっつり利用している
- 乱数生成器、データ記録方式などセキュリティ的に気になるところは手堅く手を打っている
といったところが分かりました。
うまくエコシステムに乗っかり、自分達の開発すべきものを絞っている印象です。
データの記録方法について
最初はカストディアルなLightning Networkによる支払い機能搭載ウォレットとして始まったBlueWalletでしたが、最近ではマルチシグだったり、ハードウェアウォレット対応だったりと色々と機能が増えています。
こういった息の長いアプリになると、バージョンアップをする過程で保管するデータ構造がどんどん変化してきたはずで、その保存方法が気になります。このへんの恨み辛みを調査すべく、ちょっと潜ってみました。
とりあえず、"storage"とかそれっぽい単語でGitHub内を検索してみると、以下のようなトピックを見つけました。
https://github.com/BlueWallet/BlueWallet/pull/1545
どうやら、2020年夏頃にRealmというデータベースエンジンへの乗り換えをしたようです。JavaScriptなエンジンベースからネイティブコードベースなエンジンに処理をオフロードすることを意図しているようです。
既存の保存方法では読み込みスピードが課題になっていたようですね。BlueWalletの場合、トランザクジョンデータをウォレット内にキャッシュする設計思想なようです。この場合、UTXOベースなビットコインですとアプリ内に保存すべきデータがどんどん膨らむことになります。
Realmは、データ構造に統一感を持たせ、いわゆる正規化されたデータを保管すると最大限の性能を発揮できます。ですが、BlueWalletの場合、トランザクジョンデータをアプリ内に保管しているのですが、その構造がtree-likeでちょっと特殊だったようで、せっかくのRealmの機能を最大限使うことはできてないよ、とコメントされていました。それでもデータベースを乗り換えたことで十分速くなったようでよかったですね。