Appearance
L3-9: MEV Bot(MEV ボット)
1. 問題
イーサリアムのブロック構築プロセスは、独自の経済現象を生み出しています。マイナー/バリデータはトランザクションの順序付けに関する裁量権を持っています。彼らはどのトランザクションを含め、どの順序で並べるかを選択できます。これが MEV(最大抽出可能価値、Maximal Extractable Value)を生み出しました。トランザクションの順序付けから追加の利益を抽出する活動です。MEV サーチャーはメモリプール(mempool)内の保留中のトランザクションを監視し、アービトラージ、清算、サンドイッチ攻撃の機会を探します。
防御者の視点から MEV を理解することは、安全な DeFi コントラクトを書くための前提条件です。多くのコントラクト脆弱性(フラッシュローン攻撃など)は、実際には MEV サーチャーによって積極的に悪用されています。彼らがどのように運用しているか(メモリプール監視から Flashbots バンドル提出まで)を理解することは、開発者が MEV 耐性のあるコントラクトを設計する助けになります。同時に、MEV ボット自体も多くの重要なエンジニアリングスキルを示しています。リアルタイムイベントリスニング、ガス入札戦略、トランザクションシミュレーション、アトミックバンドル実行などです。
2. 理由
MEV はイーサリアム経済学において最も重要で、かつ最も議論のある分野の一つです。Flashbots の統計によると、2020年以降に10億ドル以上の MEV が抽出されています。MEV は一般ユーザーに悪影響を及ぼします。サンドイッチ攻撃はより高いガス代とより悪い約定価格をもたらします。しかし、ポジティブな貢献も提供しています。アービトラージは DEX 価格の一貫性を保ち、清算はレンディングプロトコルの健全性を維持します。
MEV を理解することは開発者にとって3つの理由で重要です。(1) 防御的設計 — コントラクトが MEV 攻撃の被害者になるのを防ぐ方法を理解する必要がある、(2) 市場効率 — アービトラージと清算ボットのロジックは、DEX アグリゲーターやレバレッジプロトコルの設計に直接関連する、(3) PBS(提案者-ビルダー分離) — MEV はイーサリアムのブロック構築アーキテクチャの根本的な変革を推進しており、それを理解することは L1 経済学を理解する中心です。
3. 解決策
scripts/mev-bot.js は教育的な MEV サーチャーの骨格であり、MEV ボットの完全なアーキテクチャを示しています。
アーキテクチャ階層:
メモリプール監視:WebSocket で
pendingTransactionsを購読し、保留中のトランザクションハッシュをリアルタイムで受信します。各トランザクションについて、完全なトランザクション詳細を取得し、対話先とメソッドシグネチャを解析します。本番環境では、サーチャーは通常、最小限のレイテンシを得るために独自のフルノードを運用します。アービトラージ検出:Uniswap V2 の
x*y=kAMM 式を使用して2つの DEX 間の価格差を計算します。- Uniswap と SushiSwap の Pair コントラクト(
getReserves())から準備量を取得 - 2つの DEX 間で循環取引(Uniswap -> SushiSwap またはその逆)の利益を計算
- 利益 > ガス代 + 賄賂の場合、アービトラージ機会が存在する
- 計算式:
amountOut = (amountIn * 997 * reserveOut) / (reserveIn * 1000 + amountIn * 997)
- Uniswap と SushiSwap の Pair コントラクト(
サンドイッチ攻撃検出:メモリプール内の大口スワップトランザクションを特定します。原理:
- フロントラン(frontrun):被害者のトランザクションの前に購入し、価格を押し上げる
- 被害者トランザクション:大きなスリッページで約定
- バックラン(backrun):被害者のトランザクションの後に売却し、価格差から利益を得る
清算検出:レンディングプロトコル(Aave、Compound)内で清算閾値に近いポジションを監視します。ポジションの健全性因子が1を下回った場合、清算をトリガーし清算報酬(通常5-10%)を獲得します。
Flashbots バンドル提出:
- 複数のトランザクションをアトミックなバンドル(bundle)にパッケージ化
- Flashbots リレーを通じてバリデータに直接送信し、公開メモリプールをバイパス
- バンドルのアトミック性:すべて成功するか、すべて失敗する(部分的な実行による損失を防止)
- バリデータへのチップ(バンドルチップ)を経済的インセンティブとして含める
参考ソースファイル:scripts/mev-bot.js
4. 遭遇した落とし穴
- レイテンシ競争:MEV サーチはスピードゲームです。ミリ秒レベルのレイテンシの差が勝敗を決めます。公開 RPC ノードに依存する場合のレイテンシは通常 >100ms ですが、競合他社は専用ノードで <10ms のレイテンシを実現しています
- シミュレーションと実行の差異:
eth_callで成功をシミュレートしたバンドルが、実際の実行時には状態変化により失敗する可能性があります。他のサーチャーのトランザクションがあなたのバンドルより先に状態を変更している可能性があります - ガス入札スパイラル:複数のサーチャーが同じ機会に対して優先手数料を競り合い、利益がガス代に食い潰されます。サンドイッチ攻撃では3つのトランザクションすべてにガスが必要で、総コストが利益を超える可能性があります
- トランザクションデコードエラー:メモリプール内のトランザクションは任意のコントラクト呼び出しである可能性があり、誤った ABI でデコードすると機会を誤判定または見逃します
- 非アトミックリスク:Flashbots バンドルを使用しない場合、公開メモリプール内のトランザクションはフロントランされる可能性があります(他人があなたのトランザクションを見てコピーする)
- トークン承認のセキュリティ:MEV ボットを実行するウォレットは複数のトークンとルーターコントラクトを承認する必要があります。ウォレットの秘密鍵が漏洩した場合、すべての資金がリスクにさらされます
5. 落とし穴の原因
レイテンシ競争は MEV の最も根本的な課題です。ブロック時間12秒のイーサリアムでは、ブロックごとに1回のチャンスしかありません。サーチャーネットワーク(bloXroute、Eden Network など)は公開ノードよりも高速なメモリプールデータを提供し、プロのサーチャーはバリデータとの直接接続(PBS パイプライン)を確立しています。mev-bot.js の WebSocket 監視は出発点に過ぎません。本当の競争はサブミリ秒レベルで行われています。
ガス入札スパイラルは MEV のゼロサム的性質に起因します。各アービトラージ機会に対して、1人のサーチャーだけが勝つことができます。機会の価値が 0.1 ETH であれば、サーチャーは 0.099 ETH までの優先手数料(またはバリデータへの賄賂)を支払う用意があります。より多くのサーチャーが市場に参入するにつれて、利益率はゼロに近づきます。完全競争の経済学原理がオンチェーンでリアルタイムに展開されています。mev-bot.js の minProfitEth = 0.01 は合理的な下限ですが、実際の競争の激しい取引ペア(WETH-USDC など)では、より高い閾値を設定する必要があるかもしれません。
シミュレーションと実行の差異(「リバートリスク」)は MEV に固有の技術的課題です。eth_call のシミュレーションは現在のブロックの状態を使用しますが、バンドルが実際に実行される時点では、次のブロックまたはそれ以降のブロックに含まれている可能性があり、その間に他のトランザクションが DEX 準備量やレンディングポジションなどの状態をすでに変更しています。Flashbots の eth_callBundle は特定のブロック番号でシミュレーションすることでこの問題を緩和しようとしますが、完全に排除することはできません。
6. 落とし穴の解決方法
レイテンシ最適化:
- 共有 RPC ではなく専用ノードを使用して最小限のレイテンシを実現
- ポーリングではなく WebSocket を使用してリアルタイムのメモリプールデータを受信
- バリデータと同じリージョン(AWS us-east-1 など)にノードをデプロイ
- DEX 準備量データを事前計算・キャッシュして RPC 呼び出しを削減
ガス戦略:
eth_maxPriorityFeePerGasを使用して現在の優先手数料市場レートを照会- 最大許容ガス予算を設定し、超過した場合は機会を放棄
- バンドル内に
block.coinbaseに直接支払うバリデータチップトランザクションを含める - 過去のガスデータ分析を使用して入札戦略を最適化
シミュレーション安全性:
eth_callBundleシミュレーション後すぐにバンドルを提出し、シミュレーション-提出ウィンドウを短縮- バッファを設定(例:利益 > GasCost * 1.5 を要求)
- 同じバンドルを複数のリレー(Flashbots + bloXroute + Eden)に同時に提出
- バンドルに複数ブロックにわたる同じトランザクションを含める(Flashbots は複数ブロック範囲の指定をサポート)
セキュリティプラクティス(mev-bot.js のリスクチェックリストより):
- 独立した低残高ウォレットを使用し、MEV ボットウォレットに大量の資金を保管しない
- 各トランザクション前に
eth_callでシミュレーションし利益を確認 - スリッページ保護を設定(例:0.5% スリッページ)
- すべてのトランザクションの実行結果を監視し、監査用にログを記録
- コード内に秘密鍵をハードコードしない(環境変数または安全なキー管理を使用)
7. 技術ポイント
| 技術ポイント | 説明 |
|---|---|
| メモリプール監視 | WebSocket で pendingTransactions を購読し、リアルタイムで機会を発見 |
| AMM アービトラージ | x*y=k 式で DEX 間の価格差を計算 |
| サンドイッチ攻撃 | フロントラン購入 + 被害者取引 + バックラン売却 |
| 清算検出 | レンディングプロトコルの健全性因子を監視、閾値以下で清算をトリガー |
| Flashbots バンドル | アトミックバンドルで公開メモリプールをバイパスし、バリデータに直接提出 |
| トランザクションシミュレーション | eth_call/eth_callBundle で提出前に利益を検証 |
| PBS パイプライン | 提案者-ビルダー分離。サーチャーはビルダーを通じてバンドルを提出 |
| ガス入札 | 優先手数料 + バリデータ賄賂でバンドルの包含が決定 |
| ゼロサム競争 | 各機会に対して1人のサーチャーだけが勝利できる |
| 安全境界 | 独立ウォレット、シミュレーション検証、スリッページ保護、秘密鍵管理 |