Monadのアーキテクチャ解説

## はじめに

MonadはLayer 2の非効率性を考慮し、Layer 1としてのMonadの理念を貫くために設計されています。この記事では、Monadの他チェーンとの違いや、それをどう実現しているかなど、Monadのアーキテクチャについて深掘っていきます。
![](https://storage.googleapis.com/zenn-user-upload/623d03b5b8b9-20241211.png)

## 特徴

### 高トランザクションスループット
Monadは1秒間に10,000トランザクション（TPS）を処理する能力を持ち、これはほとんどの既存のブロックチェーンの実装を大幅に上回ります。高いトランザクションスループットは、迅速なトランザクション処理を必要とするアプリケーションにとって重要です。

### 並列実行
Monadは並列実行を実装することで、複数のトランザクションを同時に処理し、ネットワークの効率を劇的に向上させるとともに、従来の逐次的な実行方法と比較してレイテンシを最小限に抑えています。

### 即時確定性
MonadBFTのパイプライン化されたコンセンサスにより、トランザクションは即時ブロック確定性を達成し、より迅速で信頼性の高いトランザクションの決済を保証します。

### イーサリアム互換性
MonadのEVM互換性により、イーサリアムの開発者は自分のアプリケーションをMonadに移植でき、イーサリアムのインターフェースやツールシステムに馴染みがあります。

### スケーラビリティ最適化
Monadの最先端の並列実行とスーパーシリアルパイプラインコンセンサスアーキテクチャは、スケーラビリティのボトルネックに対処するために特別に設計されており、プラットフォームが増え続けるトランザクションとユーザーをサポートできるようにします。

### 低運用コスト
Monadプラットフォームの高効率性により、ほとんどのブロックチェーンシステムと比較して大幅に低いトランザクション手数料が実現され、ネットワークはユーザーや開発者にとって安価で使いやすく、経済的に実行可能です。

![](https://storage.googleapis.com/zenn-user-upload/5fb7a8732f00-20241211.png)


## イーサリアムのパフォーマンスボトルネックとMonadのEVM互換性

今日のイーサリアム環境では、以下のような実行制限（1.25Mガス/秒）に関連するいくつかのパフォーマンス課題が存在します。

- 不十分なストレージアクセスパターン
- シングルスレッド実行（マルチスレッドではない）
- 実行予算の極端な制限（コンセンサスが実行なしには実現できない）
- 状態の増加と将来の状態アクセスコストへの影響に関連する問題

Monadは、アルゴリズムの改善とアーキテクチャの変更を通じて、これらの制約に対処するように設計されています。Monadは、状態ストレージ、トランザクション処理、および分散コンセンサスに関連するボトルネックを、MonadBFT、Deferred Execution、Parallel Execution、およびMonadDbの4つの重要な領域でパイプライニングと最適化を通じて解決します。この設計により、分散化とスケーラビリティのトレードオフを根本的に進化させ、EVMのパフォーマンスを向上させます。

さらに、現在のブロックチェーン環境において、多くのネットワークが極端なスケーラビリティを持つ一方で、イーサリアム互換性を欠いており、イーサリアムの開発環境がそのチェーンにアプリケーションを容易に移植することを妨げています。Monadは、完全なEVMバイトコード互換性を実装することで開発者の既存のボトルネックに対処し、Ethereum RPC API互換性を通じてユーザーにも対応しています。

### 開発スタックの統合
- **アプリケーション:** イーサリアムで構築されたアプリケーションとの完全な互換性を提供
- **開発ツール:** Hardhat、Apeworx、Foundryなどのイーサリアム開発ツールシステムとの接続を提供
- **ウォレット:** MetaMaskなどのほとんどのイーサリアムウォレットタイプとのクロスシステム機能を有効化
- **アナリティクス/インデックス:** Etherscan、Dune Analyticsなどの様々なアナリティクスおよびインデックスツールとの完全な統合を提供

![](https://storage.googleapis.com/zenn-user-upload/a922251ac06c-20241211.png)

## スーパーシリアルパイプライニングと非同期I/Oの概要

Monadは、ハイパースケーラビリティを維持するために、スーパーシリアルパイプライニングと非同期I/Oを利用しています。

### スーパーシリアルパイプライニング
スーパーシリアルパイプライニングは、マルチスレッドおよびマルチコアの並列実行フレームワークを補完するプロセスであり、トランザクションを順次ステージで完了させることにより並列化された方法で実行します（ただし、元々意図された順序で結果をコミットします）。

スーパーシリアルパイプライニングでは、計算のステージが前のステージが完了する前に開始され、システム全体のパフォーマンスを指数関数的に向上させます。パイプライニングは通常、コンピュータプロセッサで使用され、時間ベースの命令セットを順次実行することでスループットを劇的に改善します。

### 非同期I/O
非同期I/Oは、CPUが通信中に同時に実行を続行できる入力出力処理メカニズムです。通常、ディスクおよびネットワークオーダーはCPUよりも指数関数的に遅いです。

そのため、入力/出力操作を開始して結果を待つ代わりに、CPUは特定のデータが必要であることを知っているときにすぐに入力/出力操作を開始し、同時に入力/出力操作の結果に依存しない追加の命令を実行できます。

![](https://storage.googleapis.com/zenn-user-upload/3b5a81d07af4-20241211.png)

### Monadにおけるパイプライニングの実装
Monadは、コンセンサスレベル、トランザクション実行中、実行フェーズとコンセンサスフェーズ間、および状態アクセスレベルの4つの主要な方法でパイプライニングを実装し、ネットワークのスケーラビリティとトランザクションスループットを指数関数的に向上させています。  
> *画像クレジット: Monad Twitter post via Monad Twitter*

## Monadコンセンサスの相互接続された側面

Monadのコンセンサスは、以下の4つの相互接続されたコンポーネントを使用しています。これらについては、以下のセクションで詳細に説明します。

1. **Monad BFTコンセンサス:** 部分的に同期した条件下で任意のペイロードに対する合意を達成するビザンチンフォールトトレラント（BFT）コンセンサスメカニズム。
2. **Deferred Execution（遅延実行）:** コンセンサスのホットパスから実行を除去することによるコンセンサス実現のメカニズムに対する主要な最適化の実装。
3. **共有メンプール:** トランザクションをハッシュで参照し、事前にメンプールを介してトランザクションが伝播されることを保証するコンセンサスペイロードに関連する大幅な最適化の実装。
4. **キャリッジコストおよびリザーブバランス:** コンセンサスが実行の遅延ビューを通じて完了するため、スパムから防御するために必要なトランザクション価格設定の行動修正の実装。

> *画像クレジット: SkillovuU via Monad*

### Monad BFTコンセンサスとは？

Monad BFTは、ビザンチンアクターの影響下で部分的に同期した条件を通じてトランザクション合意を達成します。コンセンサス自体はHotStuffコンセンサスの派生であり、リーダーのタイムアウトが発生した場合に2ラウンドを実装し、Joltean、DiemBFT、Fast HotStuffなどのイテレーションと同様に、通信の複雑さは二次的です。

MonadBFTは、楽観的な応答性と線形の通信オーバーヘッドおよびタイムアウト時に二次的な通信を活用した2フェーズパイプライン化BFTアルゴリズムです。ほとんどのBFTアルゴリズムと同様に、通信はフェーズごとに処理されます。

#### コンセンサスラウンドのプロセス

1. **各コンセンサスラウンドの開始:**
   リーダーは新しいブロックと前のラウンドからのタイムアウト証明書（TC）またはクォーラム証明書（QC）をバリデーターにブロードキャストします。

2. **バリデーターのレビューと投票:**
   各バリデーターはブロックをレビューし、チェーンに追加すべきかを判断します。合意に達すると、バリデーターは次のラウンドのリーダーに署名付きYES投票を送信します。リーダーは、少なくとも2/3のバリデーターからのYES投票を集約（閾値署名を通じて）し、クォーラム証明書（QC）を作成します。この場合、通信は線形であり、リーダーはブロックをバリデーターに送信し、バリデーターは直接次のリーダーに投票を送信します。

   一方、バリデーターが予め定められた時間内にブロックを受け取らない場合、バリデーターは署名付きタイムアウトメッセージをピアにブロードキャストし、観察した最も重要なクォーラム証明書を含めます。ネットワーク内の正直なバリデーターからのタイムアウトメッセージを2/3以上収集すると、タイムアウト証明書（TC）を形成し、次のラウンドのリーダーに直接送信します。

3. **ブロックの確定:**
   ネットワークの各バリデーターは、次のコンセンサスラウンド（ラウンド2）からのクォーラム証明書（QC）を受け取ると、初期コンセンサスラウンド（ラウンド1）で提案されたブロックを確定します。

   - **例:**
     - ラウンド1のリーダー（Abby）は新しいブロックを各バリデーターに送信します。
     - 2/3以上のバリデーターがラウンド2のリーダー（George）にYES投票を送信すると、ラウンド2のブロックにはラウンド1のクォーラム証明書が含まれます。しかし、Bethはラウンド1のブロックが伝播されたことを確認できないため、ラウンド2のブロックに対して投票し、ラウンド3のリーダー（James）に投票を送信します。
     - ラウンド3で2/3以上のバリデーターがラウンド2のブロックにYES投票を送信すると、ラウンド3のリーダーはラウンド2のクォーラム証明書を含むブロック提案を送信します。これにより、ラウンド1のブロックが確定されます。

   - **不正リーダーの対処:**
     ラウンド2のリーダー（George）が不正行為を行った場合、タイムアウト証明書が形成され、ラウンド3のリーダー（James）がタイムアウト証明書を公開します。

   このコミット手順は、2チェインコミットルールとして知られています。隣接する2つの認証ブロック（ブロック1とブロック2）が観察されると、ブロック1とそのすべての先祖ブロックをコミットできます。

> *画像クレジット: Boneh–Lynn–Shacham署名 via Golden*

### Monad BFTコンセンサスの概要

MonadBFTは、時間ベースのコンセンサスラウンド（エポック）を利用してトランザクションを処理し、ブロックをオンチェーンに追加します。ほとんどのBFTフレームワークと同様に、Monadではバリデータノードの2/3が悪意のない（合法的で非悪質な）状態である必要があり、同等の投票ステークウェイトを持ちます。

#### コンセンサスプロセスの詳細

1. **ラウンドごとのリーダーのブロードキャスト:**
   リーダーは新しいブロックと前のラウンドからのタイムアウト証明書またはクォーラム証明書を各バリデーターにブロードキャストします。

2. **バリデーターのレビューと投票:**
   各バリデーターはブロックをレビューし、チェーンに追加すべきかを判断します。合意に達すると、バリデーターは次のラウンドのリーダーに署名付きYES投票を送信します。リーダーは、少なくとも2/3のバリデーターからのYES投票を集約（閾値署名を通じて）し、クォーラム証明書（QC）を作成します。

   もしバリデーターが予め定められた時間内にブロックを受け取らない場合、バリデーターは署名付きタイムアウトメッセージをピアにブロードキャストします。

3. **ブロックの確定:**
   次のコンセンサスラウンドからのクォーラム証明書を受け取ると、初期ラウンドのブロックを確定します。

   - リーダーが悪意を持ってブロックを提案した場合、タイムアウト証明書が形成され、次のラウンドでタイムアウト証明書が公開されます。

このコミット手順により、2つの隣接する認証ブロックが観察されると、最初のブロックが確定されます。

![](https://storage.googleapis.com/zenn-user-upload/b55020f60b61-20241211.png)

### セキュリティ保証とスケーラビリティの向上

Monadは、Boneh-Lynn-Shacham（BLS）署名と楕円曲線デジタル署名アルゴリズム（ECDSA）署名の組み合わせを使用して、セキュリティ保証とスケーラビリティを向上させています。

- **証明書の取り扱い:**
  クォーラム証明書（QC）やタイムアウト証明書（TC）は、secp256k1曲線を使用したECDSA署名として利用可能ですが、証明書のサイズは署名者の数に比例して線形に増加します。これにより、スケーリングの限界が曖昧になります。

- **BLSマルチ署名の活用:**
  これに対処するために、MonadはBLSマルチ署名を使用し、BLS12-381曲線と組み合わせて署名を段階的に集約します。これにより、単一の有効な集約署名を検証することで、公開鍵に関連付けられたステークがメッセージに正しく署名したことが証明されます。

- **混合署名スキーム:**
  BLS署名はECDSA署名よりも遅いため、MonadBFTはBLS署名を集約可能なメッセージタイプ（主に投票とタイムアウト）でのみ使用し、メッセージの整合性と正当性はECDSA署名で提供します。

![](https://storage.googleapis.com/zenn-user-upload/6fd8e4011c27-20241211.png)

## 遅延実行（Deferred Execution）

Monadブロックチェーンは、コンセンサスと実行を分離するネットワークとして設計されています。遅延実行は、パイプライン化されたコンセンサス実行を段階的に行うプロセスです。

- **コンセンサス:** ネットワーク上のトランザクションの公式な順序にバリデーターが合意するプロセス。
- **実行:** トランザクションを実際に実行し、システムの状態を更新するプロセス。

### Monadとイーサリアムの違い

Monadでは、リーダーやバリデーターがトランザクションを実行する前に、ネットワークの公式なトランザクション順序に合意します。一方、イーサリアムでは、コンセンサスの前にトランザクションを実行する必要があります。これにより、イーサリアムではトランザクション実行の時間予算が非常に制限され、複数ラウンドのグローバルなコンセンサス通信を完了するための余裕が必要になります。

### 遅延実行の利点

- **効率性:** トランザクションの実行がコンセンサスと並行して行われるため、実行時間の予算が大幅に拡大します。
- **スケーラビリティ:** 実行とコンセンサスがブロックの確定をブロックしないため、Gasリミットを緩和できます。
- **経済的モデル:** キャリッジコストとリザーブバランスにより、スパム攻撃を防御します。


## 共有メンプール（Shared Mempool）

Monadは、各バリデーターに独立したメンプール内に保留中のトランザクションを保存し、確定ブロックに含める前に他のバリデーターのメンプールと共有します。このプロセスは、トランザクションを消去符号化（エラー訂正符号化）し、効率を高めるためにブロードキャストツリーを介して通信することで行われます。

- **ブロック伝播のボトルネック:** 例えば、10,000トランザクションと500バイトのトランザクションを含むブロックは通常5MBとなり、高帯域幅のためにバリデーターを制約します。
- **トランザクションハッシュの利用:** トランザクションをハッシュで参照することで、ネットワーク帯域幅を大幅に節約します（ハッシュは32バイトのみ）。

## キャリッジコストとリザーブバランス（Carriage Cost and Reserve Balance）

遅延実行により、ネットワーク上で実行とコンセンサスが並行して行われるため、実行のタイムビューが最新でない場合、ガスを使い果たしたアカウントからのトランザクションが誤って含まれる可能性があり、サービス拒否攻撃の脆弱性が生じる可能性があります。

### キャリッジコストの導入

この可能性を排除するために、Monadは以下を導入しています：

- **キャリッジコスト:** トランザクションがブロックに含まれる際に支払われるコスト。
- **リザーブバランスアカウント:** 各アカウントに対してリザーブバランスを維持し、キャリッジコストを支払います。

### リザーブバランスの詳細

- **リザーブバランス:** 「インフライト」注文の予算を表し、ブロックに含まれるトランザクションが支払われることを保証します。
- **実行バランス:** トランザクション実行に関連するコストを支払うために使用されます。

### キャリッジコストの仕組み

- **ブロック内のトランザクションに対して:** キャリッジコストがリザーブバランスから差し引かれます。
- **実行時:** キャリッジコストが実行バランスから差し引かれ、ブロック遅延期間（10秒後）にリザーブバランスに返済されます。

### リザーブバランスのパラメータ

リザーブバランスは各アカウントに基づくパラメータで設定され、デフォルトではキャリッジコストの200倍の大きな値が設定されており、ユーザーは多数のインフライト注文を送信できるようになります。また、オンチェーントランザクションを通じてリザーブバランスを増加させることも可能です。これは、多数の注文をブロックごとに送信するマーケットメイカーなどに関連します。

## Monadブロックチェーンの実行

Monadプロトコルがハイパー効率的なトランザクション実行を実現するために、ネットワークは以下の2つの主要コンポーネントを利用しています。

1. **並列実行（Parallel Execution）:** 並列化（または並列処理）に基づいた実行フレームワーク。
2. **MonadDb:** ブロックチェーンの状態を保存および最適化するためのデータベース。

> *画像クレジット: SkillovuU via Monad*

### 並列実行（Parallel Execution）

Monadの主要な特徴として、並列実行を活用してネットワーク上のトランザクションを同時に処理し、ネットワークスループットとスケーラビリティを指数関数的に向上させています。このモデルは、ほとんどの従来のブロックチェーンシステムで使用される逐次的なアプローチとは異なります。

- **楽観的実行:** プロトコルはブロック内の以前のトランザクションが完了する前にトランザクションの実行を開始します。これにより、誤った実行が発生する可能性がありますが、以下の方法で対処します。

- **入力と出力の追跡:** 各トランザクションの入力と出力を追跡し、ブロック内の後続のトランザクションが誤ったデータを使用して実行されないように衝突を再スケジュールします。

- **再実行の効率化:** トランザクションの再実行は最小限のオーバーヘッド（約1.5％）で行われ、データの再読み込みは不要です。

- **リソースの最適利用:** Monadの実行エンジンはシステムリソースを完全に活用し、再実行が可能な場合はインテリジェントな判断を行います。トランザクションは自然なブロック順序で再スケジュールされます。

#### 例
- **Tx2とTx3の状況:**
  1. Tx2が戻り、スレッドが利用可能になり、Tx3が戻る → Tx2を先に実行。
  2. Tx3が戻り、スレッドが利用可能になり、Tx2が戻る → Tx3を先に実行し、Tx2を再スケジュール。
  3. Tx2とTx3が同時に戻り、スレッドが利用可能になる → ブロック順序に従ってTx2を先に実行。

> [1] [Twitterリンク](https://x.com/keoneHD/status/1744091485471948869?s=20)

### MonadDb

MonadDbは、ブロックチェーンの状態を保存し、チェーンのトランザクション実行システムのスケーラビリティを大幅に向上させるカスタムデータベースです。

- **従来のEthereumクライアント:** 多くのEthereumクライアントは、B-TreeまたはLSM-Treeデータ構造を持つキー-バリューデータベースを利用し、状態の保存にはMerkle Patricia Trie（MPT）データ構造を使用しています。この組み合わせは、異なるタイプのデータ構造が根付いたため、効率が低下します。

- **MonadDbのアプローチ:** MonadはPatricia Trieデータ構造をネイティブにオンディスクおよびインメモリで利用し、複数のトランザクションを並列に実行する際にディスクからの状態読み取りがブロックしないようにします。これを実現するために、データベースは非同期I/Oモデルを活用します。

- **非同期I/Oの利点:** 最新のカーネルサポートを活用することで、大量のカーネルスレッドを作成して保留中のI/Oリクエストを管理する必要がなくなり、必要な計算を非同期的に実行できます。

従来のEthereumクライアントのキー-バリューデータベースは適切な非同期I/Oサポートを欠いていますが、MonadDbはこれを克服し、並列トランザクション実行の効率を大幅に向上させています。

## まとめ

Monadは、Layer 1ブロックチェーンとしての強力な技術アーキテクチャを持ち、高スループット、並列実行、即時確定性、EVM互換性、スケーラビリティ、低運用コストなどの特徴を備えています。これにより、Ethereumのパフォーマンスボトルネックを克服し、開発者とユーザーにとって魅力的なプラットフォームを提供しています。Monadの革新的なコンセンサスメカニズム、並列実行フレームワーク、およびカスタムデータベースは、ブロックチェーン技術の未来を牽引する重要な要素となっています。

# 参考文献
[Monad: Exploring the Technical Architecture of the Monad Blockchain](https://daic.capital/blog/monad-exploring-technical-architecture-blockchain)