BEAM がブロックチェーンに最適な 4 つの理由

Tyr Chen と Riley Shu が執筆し、Erlang Solutions Blog に掲載した記事です。
私が初めて Erlang/OTP を知ったのは、Joe Armstrong が世界を、人間のように互いに会話できるプロセスへと分解して説明した講演がきっかけでした。ArcBlock に加わり、ブロックチェーンプラットフォームの構築を任された私たちは、バックエンドサービスとブロックチェーンフレームワーク Forge に Erlang/OTP を広く採用しました。その理由を本稿で説明します。OTP の機能により、ブロックチェーンネットワークの運用に不可欠なサービスを提供するだけでなく、次世代のアプリケーションやサービスに必要な作業を大幅に簡素化する、実用的で本番運用可能なフレームワークを構築できました。
ブロックチェーンフレームワーク入門
Forge は、マルチチェーンネットワークや Build Your Own Chain(BYOC)を支えるフレームワークの構築を大幅に簡素化するツールです。Forge 以前は、独自チェーンを作るには、コンセンサスアルゴリズム、P2P ネットワークなど多数の構成要素を用意し、連携させた後、トークンの総供給量と配布、トランザクション設定、管理者アクセス制御などを調整する必要がありました。ようやく稼働しても少し問題が見つかれば、すべてのノードを停止して設定をやり直さなければなりませんでした。
Forge は Erlang/OTP が備える機能と利点を活用し、難しい作業を開発者に代わって行います。Forge でブロックチェーンを開始するには、設定時または実行時に各ビヘイビアを有効・無効にするだけです。さらに稼働後の更新も、ノード全体を再起動せず、システムの個別部分をホットアップグレードできます。これは製品レベルのアプリケーションやサービスに不可欠です。

設計・計画段階では Golang など、ブロックチェーンコミュニティで人気の言語も評価しました。Golang には高度なライブラリなどの利点がありますが、顧客に届けたい堅牢なプラットフォームを構築するうえで、私たちを Elixir へ導いた重要な点が 3 つありました。
プロセスが問題を単純化する
第一に、複雑な問題をプロセスへ分解する必要があります。ブロックチェーン自体が多数の問題に対する解決策の集合であり、OTP ならそれらを分解して一つずつ対処できます。異なるプロセスをアプリケーションへ柔軟にまとめられるため、コードベースも保守しやすくなります。
ブロックチェーンノードの構築は、オペレーティングシステムの構築に似ています。イベント(ブロックチェーンではトランザクションなど)を交換し、実行し、更新後の状態を保存する複数の「アプリケーション」を連携させます。この仕組みは、次の中核アプリケーションへ簡単に分解できます。
- コンセンサスアプリケーション:コンセンサス関連タスクを管理するプロセス
- ストレージアプリケーション:ファイルシステム関連タスクを管理するプロセス
- Forge アプリケーション:スマートコントラクトを実行し RPC インターフェースを提供するプロセス
- イベントアプリケーション:イベント購読を管理するプロセス
- インデクサーアプリケーション:状態データベースから継続的にデータを取得し、リレーショナルデータベースへ索引付けするプロセス
Forge 内では、さらに複数のプロセスが協調してブロックチェーンのトランザクションを処理します。例:
- ユーザーがトランザクションを送信すると、gRPC サーバーが処理して mempool のキューへ送る
- 有効なら mempool に挿入してネットワーク全体へ伝播し、無効なら破棄する
- 新しいブロックが同期されると、トランザクションを一つずつ取り出し、スマートコントラクトエンジンで実行する
これらの連携は困難ですが、OTP により継続的な分割統治で複雑さを容易に管理できます。機能をアプリケーションにまとめ、各アプリケーションを監督ツリーとして構成し、各ツリーを多数の小さなプロセスで形作ります。並行処理が必要ならプロセスプールを用意し、堅牢な逐次処理が必要なら単一プロセスを使います。その受信箱がメッセージキューとして働き、タスクを正しい順序で処理します。

クラッシュを容易に扱う
第二は「Let it crash」という考え方です。ブロックチェーンシステムはネットワークでつながった多数の実行主体で構成されるため、ネットワークの不安定さや予期しない障害が起きても全体を維持できる適切なエラー処理が不可欠です。
たとえば、あるプロセスが RPC リクエストを処理するためオンチェーン情報を読み取る際、ネットワークの不安定さでクラッシュしても、数回の再試行で解決できることがあります。OTP のスーパーバイザーはそのプロセスを復旧させます。Joe Armstrong が語った「一度書けば、永遠に動く」を体現する例です。
ブロックチェーンに必要な機能を標準装備
Erlang/OTP を選んだ第三の重要な理由は、ホットアップグレード、並行処理、高可用性など、ブロックチェーンシステムに有用な機能を標準で数多く備えていることです。
ブロックチェーンフレームワークは、自身のコードと顧客のコードを混在させて実行する必要があり、安全な分離が不可欠です。
たとえば、ユーザー定義のスマートコントラクトがフレームワーク定義のコントラクトと同じ変数名を使うことがあります。顧客がコンセンサスエンジンを独自実装へ置き換える場合や、可用性と安定性を損なわず、実行中のノードへ新機能を追加する場合もあります。Forge は、必要な機能を備え、実運用で鍛えられた巨大な基盤の上に構築されています。
オープンな柔軟性
Erlang/OTP は、ブロックチェーンフレームワークに他言語にはない重要な利点、すなわち柔軟性をもたらします。Forge は拡張に開かれており、異なるコンセンサスエンジンなど、より高度な機能を実装するアプリケーションを追加できます。
Erlang/OTP ベースのフレームワークで作ったネットワークでは、システム全体を停止せず、必要に応じてスマートコントラクトをホットアップグレードできます。通常、コードの一部を更新するため一つのノードを停止する場合、同じロジックで同じ結果を出すよう全ノードを同時に更新する必要があります。OTP なら部分更新をトランザクションに含め、全ノードが同じトランザクションを実行して同時にコードを更新できます。
まとめ
将来またブロックチェーンフレームワークを構築するなら、私たちは間違いなく Erlang/OTP を選びます。他のチームが複雑なシステムの構築と保守に苦労する一方、Erlang/OTP は長年にわたり過酷な環境で実証されてきました。現在の Erlang/OTP は課題の大半を解決し、私たちが高水準の機能と使いやすさに集中できるようにしてくれます。