
Monad入門ガイド:並列EVMとパフォーマンス向上を素早く理解
TechFlow厳選深潮セレクト

Monad入門ガイド:並列EVMとパフォーマンス向上を素早く理解
再実行はボトルネックではなく、ボトルネックはイーサリアムのメモリへのアクセスである。
執筆:Decentralised.Co
翻訳:TechFlow
トランザクションのスケーラビリティは常にホットな話題です。ここ数週間、我々はMonadがTPSの拡張をどう支援するかを探求してきました。
以下は、Saurabh Deshpande氏によるMonadの動作原理の詳細な解説です。
TPSは私たちが非常に注目している指標です。より多くのユーザーとアプリケーションをサポートできるように、チェーンがより高いTPSを実現することを望んでいます。以下のグラフはイーサリアムおよびL2のTPS数値を示しています。これまでにどのチェーンも100 TPSの壁を破ったことはありません。なお、TPSは規模を測る一般的な用語ですが、正確さには欠けます。なぜならすべてのトランザクションが同じではなく、その複雑さに違いがあるためです。しかし単純化のために、規模の尺度としてTPSを使用しています。

では、TPSを増加させるにはどうすればよいでしょうか?
-
第一のアプローチはSolanaが採用したように、全く新しいシステムを構築する方法です。これは速度に対するEVM互換性を犠牲にしており、マルチスレッド実行(マルチコアCPU対シングルコアCPU)により並列処理を行い、異なるコンセンサスメカニズムを採用しています。
-
第二のアプローチはオフチェーンでの実行を行い、集中型のソーターを使ってイーサリアムをスケールアップする方法です。
-
第三のアプローチはEVMを個別のコンポーネントに分解し、それぞれをスケーラビリティ向上のために最適化する方法です。
Monadは最近2億2500万ドルを調達した、EVM互換の新規L1であり、既存のものをそのまま使うのではなく、ゼロからEVMを再構築しています。スケーラビリティの向上にはこの第三のアプローチを選択しています。
ここでは、Monadがもたらすいくつかの重要な変更について説明します。
並列実行
イーサリアム仮想マシン(EVM)はトランザクションを逐次的に実行します。次のトランザクションを実行するには、まず一つ前のトランザクションの完了を待つ必要があります。これをモーターサイクルのアセンブリ工場に例えてみましょう。一つのプラットフォームがあり、複数のトラックがバイクの部品を運んできます(各トラックは50台分のバイクを組み立てるのに必要な部品をすべて持っています)。アセンブリ工場では、荷降ろし、仕分け、組み立て、荷積みという4つの異なる機能を担当しています。

現在のEVM設定では、プラットフォームは1つしかなく、荷降ろしと荷積みは同じ場所で行われます。そのため、トラックが駐車すると、バイクの部品がその場で降ろされ、仕分けられ、組み立てられ、そして完成したバイクが同じトラックに積まれます。仕分けチームが作業している間、他のチームはすべて待機しています。つまり、それぞれの作業を異なるスロットと考えると、各チームは4つのスロットのうち1回だけ働きます。これにより大きな非効率が生じ、よりスムーズな方法が必要であることが明らかになります。
ここで、荷降ろし・荷積み用の異なるエリアを持つ4つの独立したプラットフォームがある状況を想像してみてください。荷降ろしチームが一度に1台のトラックしか扱えなくても、次の3つのスロットを待つ必要はありません。次のトラックに直接移動できます。
仕分け、組み立て、荷積みチームも同様です。荷降ろしが終わると、トラックは荷積みエリアに移動し、完成したバイクの積み込みを待ちます。このように、1つのプラットフォームと1つの荷降ろし・荷積みエリアを持つ倉庫ではすべての作業が順次行われますが、4つのプラットフォームと別々のエリアを持つ倉庫では並列処理が可能になります。

Monadをインフラとして捉えると、複数のトラック用プラットフォームを持つ倉庫に相当します。しかし、これは単純ではありません。トラック間に依存関係がある場合、複雑さが増します。例えば、あるトラックが50台分のバイクを組み立てるのに必要なすべての部品を持っていない場合はどうなるでしょうか? トランザクションは常に独立しているわけではありません。したがって、Monadがそれらを並列実行する際には、相互に依存するトランザクションを処理しなければなりません。
どのように処理するのでしょうか? Monadは「楽観的並列実行(optimistic parallel execution)」と呼ばれる手法を採用しています。このプロトコルでは、独立したトランザクションのみを並列実行できます。たとえば、Joelの残高が1ETHである状態で、以下の4つのトランザクションを考えます。
-
Joelが0.2ETHをSaurabhに送信
-
SidがNFTをミント
-
Joelが0.1ETHをSidに送信
-
ShlokがPEPEを購入
これらすべてのトランザクションは並列に実行され、保留中の結果が順次コミットされます。保留中の結果の出力がいずれかのトランザクションの元の入力と衝突する場合、そのトランザクションは再実行されます。トランザクション2と4は、他のトランザクションの入力と競合する保留結果を持たないため、互いに独立しています。しかし、トランザクション1と3は独立していません。
すべての4つのトランザクションが同じ状態(Joelの残高1ETH)から開始されることに注意してください。Joelが0.2ETHを送信した後、残高は0.8ETHになります。その後JoelがSidに0.1ETHを送信すると、残高は0.9ETHになります。結果は順次コミットされ、出力がいずれの入力とも競合しないことを保証します。トランザクション1の保留結果がコミットされた後、Joelの新しい残高は0.8ETHになります。
この出力はトランザクション3の入力と競合します。そこで、トランザクション3は0.8ETHを新たな入力として再実行されます。再実行後、Joelの残高は0.7ETHになります。
MonadDb

ここで自然に浮かぶ疑問は、「なぜ大部分のトランザクションを再実行する必要がないのか」という点です。答えは、再実行自体がボトルネックではないことにあります。真のボトルネックはイーサリアムのメモリへのアクセスです。実は、イーサリアムがデータベース内に状態を保存する方法は、状態へのアクセスを困難(時間とコストがかかる)にしています。これがMonadのもう一つの改善点、MonadDbの存在意義です。Monadはデータベースの構築方法を変更することで、読み取り操作に関連するオーバーヘッドを削減しています。
トランザクションの再実行が必要な場合、すべての入力はすでにキャッシュメモリ内にあり、全体の状態に比べてはるかに容易にアクセスできます。
Solanaはテストネットで5万TPSを記録していますが、メインネットでは現在約1,000TPSです。一方、Monadは内部テストネットで既に1万TPSの実績を達成していると主張しています。これは必ずしも実際のパフォーマンスを保証するものではありませんが、実際に運用された際のMonadの性能を見るのが待ちきれません。
TechFlow公式コミュニティへようこそ
Telegram購読グループ:https://t.me/TechFlowDaily
Twitter公式アカウント:https://x.com/TechFlowPost
Twitter英語アカウント:https://x.com/BlockFlow_News














