Umbrelのソースコードを解析してみる
ここ数ヶ月で、ビットコイン即時決済を実現する技術であるライトニングネットワークが急速に発達しはじめました。
BitMEX Researchによる統計情報によると6月時点で1,500BTCであったキャパシティが2ヶ月で46%も急拡大したとのことです。
fig.1.
https://bitcoinmagazine.com/.../lightning-network-over...

こうした急成長を支えるドライバーとして、ラズベリーパイでライトニングネットワーク用ノードを立てられるUmbrelやmyNodeといったプロジェクトの登場があげられます。
今回は、そうした中で最近特に元気なUmbrelに関して、そのソースコードを解析しちゃおうという内容となります。
Umbrel
Umbrel: https://getumbrel.com/
Umbrelがなにか、については本研究所でも私であったり、加藤さんであったりが紹介しておりますので是非そちらも確認いただけますとイメージが沸くかと思います。
【2021/5/6】ビットコインエコシステムの新星:Umbrel
【2021/6/30】オープンソースなアプリとの付き合い方

上記から引用すると、
Umbrelはラズベリーパイや古いPC、NUCなどに簡単にインストールできる、ビットコインノードとライトニングノードおよび周辺機能をまとめたソフトウェアです。Umbrel自体もオープンソースで無料なので、必要なのは動かすためのハードウェア (PCやラズベリーパイなど)だけです。
UIがわかりやすく、設定が一箇所にまとまっているUmbrelを使うことで、ユーザーはビットコインウォレットを自分自身のノードに接続して使ったり、ノンカストディアルなライトニングウォレットを使用することがこれまで以上に簡単にできます。また、Umbrelはすべての接続にTorを使用するため、外部からの接続を受け入れるために難しいネットワークの設定も特に必要ありません。
といった代物です。
そして、素晴らしいのがアプリストアを内蔵している点です。
改めて引用すると、
UMBREL APP STORE
さて、Umbrelの一番の目玉機能はUmbrel App Storeだと私は思います。App Storeとはいっても、掲載されているアプリはすべて無料でオープンソースのものなので、ユーザーからすればオプション機能をインストールするようなイメージです。インストールボタンを押すだけで導入でき、特に難しい設定などが必要ない点が素晴らしいです。
現在入れられるアプリで代表的なものをいくつか挙げると:
・BTCPay Server-オンラインストアやクラウドファンディングを作れる。
・Bluewallet Lightning-Bluewalletのサーバーを動かすことで、通常はカストディアルなBluewalletのライトニングウォレットをノンカストディアルに使える。家族などにサービス提供もできる。
・Specter Desktop-使いやすいマルチシグ機能を重視したウォレット。
・Samourai Server-プライバシー向上のためにミキシングを実行できる。
界隈の代表的なオープンソースソフトウェアプロダクトの多くがすでにUmbrel App Storeに登場していることがわかると思います。Umbrel普及の勢いが持続すれば、今後もその数は増えていき、ユーザーにとって使いやすくなると考えられます。ノードに同梱という特長によって、エンドユーザーがサーバー系 (常駐)のアプリを簡単に動かせるのが特にいいですね。
こうした仕組みは果たしてどうやって実現しているのでしょうか。
ソースコードを解析してみる
UmbrelもソースコードはGitHubにて公開されています。
GitHubリポジトリ: https://github.com/getumbrel/umbrel
こちらのREADME.mdというファイルに、利用しているオープンソースプロジェクトの一覧が記載されています。
- Umbrel Dashboard
- Umbrel Manager
- Umbrel Middleware
- Bitcoin Core
- LND
- Tor
- Nginx
- Neutrino Switcher
- Electrs
どうやら、ビットコインノードとしてはデファクトであるBitcoin Coreを利用しており、ライトニングネットワークノードとしてはLightning Lab社のLNDを採用しているようです。
とてもオーソドックスな構成です。
ちょっと面白いのは、Neutrino Switcherの存在です。
Neutrinoはいわゆるライトクライアントと呼ばれるもので、フルノードと繋げることでウォレット機能を実現させるためのものです。
Umbrelでは、初期セットアップ時のフルノード同期を待つ間、実はNetrinoモードでのウォレットが動作します。同期が完了し次第、裏側でこっそりとBitcoin Coreによる自前フルノードに接続し直されます。
下手したら1週間セットアップに時間がかかるところを、このギミックを導入することで、電源をいれてすぐに機能を試せる状態にさせるという、UX面を考えた場合にとても画期的な機構だと思います。
リポジトリを見て初めて知ったのですが、このNeutrino SwitcherはChaiang Mai LN devsというタイ拠点の団体がメンテナンスしているプロジェクトです。アジアも頑張っているんだな、と。
さて、Umbrelがすごい、と思えるのはこうしたオープンソースプロジェクトを沢山利用しつつも、大変シンプルなUIを被せて、裏側部分を見せなくさせている点です。ぱっと見、かわいい色使いでとてもシンプルです。アプリストアでポチっとアプリを入れられちゃいます。
裏側考えると恐ろしくもなります。いったいどれだけのオープンソースプロジェクトが関連しているんだろうな、と。それらを有機的にリンクさせ、安定させた状態でリリースさせるのって相当大変なんじゃないか、と思えてしまいます。
このちゃんこ鍋あるいは闇鍋的な代物の隠し味を探るべくソースコードを潜ってみました。
Dockerを採用していた
たくさんのオープンソースプロジェクトを有機的にリンクさせているキーは、Dockerというコンテナ仮想化プラットフォームを導入している点でした。
コンテナ仮想化とは、アプリケーションをOS自体をエミュレートする環境(コンテナ)の中に入れ込んで固めてしまう技術です。複数のコンテナを同時に1つのサーバーに展開したり、調子の悪くなったコンテナだけ捨てちゃって新たに立ち上げ直す、といったことが簡単にできるようになります。
Amazon Web Services等のIaaSと相性が良いこともあり、いわゆるクラウドを構成する技術の1つと見ることもできます。
Dockerはそうしたコンテナ仮想化技術のデファクトとなっているオープンソースフレームワークです。
UmbrelはこのDockerをラズベリーパイという家の中サーバーで用いてしまおう、という戦略をとったわけです。
こうすることで、例えばアプリストアでのアプリインストールはDockerコンテナを立ち上げるだけで済みます。調子が悪くなったらコンテナ単位で再インストールしちゃうこともできます。
なかなかスマートな戦略ですね。
これが実現できるようになったのはラズベリーパイ自体がバージョン4となり、クアッドコアでメモリも8GBになったりと、数年前のPC並のスペックになったからというのもあるかと思います。
こうしたハードウェアの進歩に合わせ、タイミング良く登場したのがUmbrelというソリューションなんですね。
課題
さて、良い面を見たところで、逆の闇な面も見てみましょう。こうした闇鍋的ソリューションの課題について、です。
闇鍋と表現したのには意味するところがあります。つまるところ正体が分からないものが混じっているんじゃないの、という懸念があるわけです。Umbrelほどの規模になると依存するプロジェクト数は何百にも及びます。
- 依存プロジェクトのどこかに秘密鍵を窃取するコードが混じったとして気づけるの?
- バグが沢山ある低クオリティなプロジェクトに依存していたとして、そこには本当に侵入経路となる穴は開いていないの?
- 既知の侵入経路が判明しているがメンテナンスがされなくなってほっとかれているプロジェクトに依存しているんじゃないの?
こうしたことを考えると、ちょっと恐ろしくなります。
実際、有名なウォレットアプリの依存するオープンソースプロジェクトに秘密鍵窃取コードが、コード改善の体をとって紛れ込んだ事件、プロジェクトがいつの間にか悪意あるオーナーに買収されて窃取コードが仕込まれた事件、といったニュースが報じられる時代になっています。
ライトニングネットワークのノードはホットウォレットです。
秘密鍵がそこには入っています。
そして、アプリストアでインストールするアプリには極端に大きな権限が与えられています。
秘密鍵の保管されているところとほぼ同じエリアに、こうしたアプリは陣取っています。
一方、冒頭にて紹介したように1,500BTC以上もの額が、ライトニングネットワークノードに預け入れられる時代になりました。
ネットワーク経由での攻撃というより、こうした内部から侵食される、トロイの木馬的な攻撃への備えが必要なフェーズにあるのではないでしょうか。
いわゆるソフトウェア版サプライチェーン攻撃がライトニングネットワークにおける差し迫った脅威であると考えます。
あと、物理的盗難も、リアルな脅威ですね。
次の記事
読者になる
一緒に新しい世界を探求していきましょう。

ディスカッション