最近、ノンカストディアルなライトニングウォレットであるBlixt Walletが注目されています。

Diamond Handsでも話題沸騰?!

カストディアルなWallet of Satoshiと同等レベルのUXをノンカストディアルで実現している点が画期的です。また、Android版に加え、iPhone版もTestFlightを利用する開発バージョンではありますが提供されています。

どんな雰囲気のアプリかは公式サイト上でポチポチさわれますので、気になる方はまずはそちらをいじってみてはいかがでしょうか。

Blixt Wallet

公式サイトでは、主な特徴として次のような項目をアピールしています。

  • Neutrinoを導入しており、最初のブロック同期が5分以内に終わる
  • フルノンカストディアルLND nodeが動いている
  • オンチェーンのウォレット機能は意図的に隠している(最低限の、アドレスを見たり出金したりする機能がメニュー内にある)

その他にも技術面では、

  • Dunder LSPと融合している
  • Multi-Path Paymentsに対応している
  • Torに対応している

といった特徴もあり、なかなかしっかりしていますね。

Lightning Addressへの対応については、送金先として指定はできますが受金用の自身のアドレスを生成することは現状できません。ノンカストディアル型あるあるな課題ですが、ここはそのうちLSP連携で対応する気もします。

さて、実際さわってみると、とてもシンプルで思ってた以上に安定したUXを体感できました。ただ、そうはいってもノンカストディアル型なので、チャネルという概念であったりインバウンドキャパシティ、アウトバウンドキャパシティといった知識がないとちょっと辛いかもです。

最初のセットアップ時にオンチェーンで入金をするオンボーディングフローになっており、Blixt Walletの運用するノードとの間で自動的にチャネルが張られます。そのため、最初から送金できます。

受金はインバウンドキャパシティの確保が必要ですね。この辺はノード運営している感覚と同じです。

さて、今回はそんなBlixt Walletがどういった仕組みで動いているのか、ソースコードを解析して深堀りしてみようと思います。

全体の俯瞰

Blixt WalletはHampus Sjöbergリードのもと、MITライセンスなオープンソースで開発されており、ソースコードはGitHub上で管理されています。

GitHub - hsjoberg/blixt-wallet: Bitcoin Lightning Wallet with focus on usability and user experience
Bitcoin Lightning Wallet with focus on usability and user experience - GitHub - hsjoberg/blixt-wallet: Bitcoin Lightning Wallet with focus on usability and user experience

リポジトリを覗いて見ると次のような特徴がみられました。

  • 開発がそこそこ活発(アップデートにはコントリビュータ一覧が添付されており、毎回5人程度記載されている)
  • 各言語への翻訳部分をコミュニティに任せる仕組みがある(日本語サポートしてる方はまだ誰もいないようです)
  • React Native製である(HTML, JavascriptといったWeb系技術でアプリをつくるフレームワーク)
  • LNDmobileモジュールを利用している
  • LNDmobileモジュールとのRPC通信をProtocol Bufferで独自にラップしている
  • メイン開発言語はTypeScriptで最近のアプリというかんじ
  • ストレージにはSQliteを利用している(トランザクションデータ、LN関係データ、コンタクトリスト等を保存)
  • キーストアにはキーチェーンを利用している(秘密鍵はOSの提供するセキュア領域にて保管されている)
  • ストアにはeasy-peasyというReduxラッパーを利用している
  • テストコードはずいぶんとコンパクト。ほぼ無いに等しい(まあ、コアロジックはLNDmobile側にある、ということでいいのかな)
  • 高速Prototyping用にWeb版ビルドに対応している

ということで、典型的なReact Native製アプリでした。

設計や技術選定は今風でとても読みやすいコードベースです。また、ノンカストディアル型なのでもっと複雑なんだろうと思っていたのですが意外なほどシンプルでした。LNDmobileとの通信をいいかんじにProtocol Bufferで固めているのがミソかな、と思いました。

これであれば開発に貢献する敷居も低いかと思います。モバイルアプリをつくった経験のあるエンジニアであれば素直に参画できそうです。

また、自分でライトニングウォレットをつくりたい方にとっては良いベンチマークになるコードベースかと思います。

テストコードがほとんどない点はちょっとビックリでした。まあ、ライトニングネットワークにまつわる大事な部分はLNDmobile側がやってくれるため、これでいいのかもしれません。

Web版をたちあげてみる

よくメンテナンスされているため、拍子抜けするくらい簡単に開発用Web版アプリを立ち上げることができます。

下図にあるように数コマンドをターミナルに打ち込むだけで、5分もあれば開発がはじめられちゃいます。

開発用サーバーがhttps://localhost:8080/に立ち上がりますので、これをブラウザで開くとこんなかんじでWeb版のウォレットアプリが立ち上がります。

開発用なので送受金利歴とか残高は適当なものが入っているようです。

React Native製なので、Visual Studio Codeなどで適当にコードをいじると、即座にブラウザ上で変更点を確認出来ます。なんて簡単なんでしょう。

HTML, TypeScript (Javascript)でできていますので、ちょっとウェブを作ったことがある、という方もUIをいじって遊べるかと思います。

MITライセンスなのでフォークして独自のウォレットとして進化させるのもありかもですね。

まとめ

Blixt Walletは、Blue WalletやTrust Walletといった有名どころのウォレットに比べ、コードベースがとてもコンパクトでした。機能面をシンプルにそぎ落としている点と、ほとんどのコアロジックをLNDmobileに寄せているからですね。

メンテナンスが行き届きやすい構造なため、安定さを期待できるな、と思いました。

さて、良いウォレットなのですが日本語UIが用意されていないためか日本での認知度はいまいちぱっとしません。翻訳自体は外部のTransifexというサービスを利用しているようで、コーディングが出来ない方でもサポートできます。

自分も翻訳要員として登録してみました。みなさんもいかがでしょうか。 https://github.com/hsjoberg/blixt-wallet#translation