分散型取引所(DEX)では、注文が確定する前にメンプールで取引が観測され、アービトラージャーやサーチャーが先回りして価格に影響を与える「サンドイッチ攻撃(MEVの一種)」が発生します。本稿は、AMMの価格式とスリッページに立ち返り、攻撃が成立する条件と、個人投資家が現実的に取り得る回避・低減策を、実務手順と数値例まで含めて徹底解説します。
前提:サンドイッチ攻撃のタイムライン
- あなたがAMMに大きめの買い注文(許容スリッページ1〜2%など)をブロードキャスト。
- 攻撃者(サーチャー)がメンプールで取引を検知し、ブロック内順序を調整できるバンドルや高ガスで先買い(Front-run)する。
- あなたの注文が実行され、AMMの価格がさらに押し上げられる。
- 攻撃者が直後に利確の売り(Back-run)を出して差益を確定。あなたは高い実行価格を押し付けられ、暗黙のコストを負担する。
この構造は、あなたが設定したスリッページ許容度と、プールの実効流動性に依存します。許容度が広く、プールが浅いほど成立しやすく、被害額が大きくなります。
AMMの価格式:価格影響とスリッページの正体
定数積型AMM(例:Uniswap v2系)では x × y = k
。入力トークン量 Δx
を投入すると、出力は手数料控除後の新しい準備金比から決まります。
概念的な近似として、価格影響(Price Impact)は「取引規模 ÷ 有効流動性」に比例して大きくなります。
簡易近似:
price_impact(%) ≈ trade_size / (pool_depth) × 100
厳密には手数料や曲線形状、集中流動性範囲(v3系)で変わりますが、大きな注文ほど非線形に不利という直感は正しいです。
数値例:ETH/USDCプールでの買い
仮に AMM に USDC: 3,000,000
、ETH: 1,000
がロックされており、ETH = 3,000 USDC
付近だとします。あなたが 50 ETH
分の買い(約15万USDC)を入れると、実行平均価格は理論価格を上回り、価格影響が発生します。ここに攻撃者の先買いが重なると、あなたの平均約定はさらに悪化します。
攻撃者の損益構造(直観)
攻撃者の期待利益は概ね次で捉えられます:
Expected PnL ≈ (あなたのスリッページ許容幅 × 実際の価格押し上げ)
− (攻撃者のガスコスト+失敗確率コスト)
つまり、あなたの許容スリッページが広いほど、攻撃者は先買い→後売りの幅を取りやすくなります。逆に、プライベート送信・低スリッページ・分割発注は攻撃の成立を困難にします。
被害を最小化する実用テクニック
- スリッページ許容を極力絞る:デフォルト1%→0.1〜0.3%へ。約定失敗のリトライ戦略とセットで。
- 注文分割(TWAP/時間分散):1回で50ETHではなく、5ETH×10回など。非線形の価格影響を抑える。
- プライベート送信:メンプールに晒さない経路(MEV保護RPCやRFQ/オフチェーン見積もりを使うアグリゲータ等)を選ぶ。
- 板厚プールの選好:同一ペアでも、流動性が深いプール/レンジを選ぶ。集中流動性の外れにぶつけない。
- 最小受取量(minReturn)を厳格化:UIの最小受取量設定を活用し、想定外の滑りを拒否。
- ガス逼迫時間帯を避ける:混雑時はブロック内競争が激化し、被害も悪化しやすい。
- DEXアグリゲータの活用:複数ルート分割、RFQ、クロスプール最適化で価格影響を低減。
- 大口はリミット注文やRFQ:AMM成行ではなく、成立価格を固定できる手段で。
実務フロー:失敗コストまで含めた発注手順
- 事前計測:対象プールの流動性、直近のブロック混雑、ガス価格帯を確認。
- 設計:許容スリッページ(0.1〜0.3%目安)、分割回数、最小受取量、送信経路(プライベート or パブリック)を決定。
- スモールテスト:本番の1/20〜1/50で試し、実行価格と失敗率を観測。
- 本実行:プライベート送信+分割。混雑が増したら一時停止。
- 事後評価:理論価格 vs 実行平均価格、価格影響、失敗ガスコスト、総合コストを記録。
具体例:50ETHの買いを3パターンで比較
方式 | 想定実行 | 価格影響 | リスク | 総コスト感 |
---|---|---|---|---|
一括・公開メンプール・1%許容 | 高速約定 | 大 | サンドイッチ成立しやすい | 高 |
分割(5ETH×10回)・0.3%許容 | やや時間 | 中 | 失敗再送の管理必要 | 中 |
プライベート送信+RFQ | 条件成立で約定 | 小 | 流動性提供者の提示次第 | 小〜中 |
よくある落とし穴と対策
- 「スリッページ0%」は常に良い?:約定失敗が連発し、逆にガス浪費。0.1〜0.3%など現実的な範囲で。
- 集中流動性の外側を叩く:一見TVLが大きくても、あなたの価格帯が薄いと一気に滑る。有効流動性を確認。
- 最小受取量の未設定:UI任せにせず、自分で閾値を入力する。
- 同一チェーン・同一ペアでもプール品質が違う:手数料、レンジ、LP構成で実行結果が変わる。
実務KPI:結果を数値で管理
- 実行平均価格の乖離(bps):理論価格 vs 実行の差。
- 有効スリッページ消費率:許容に対し実際どれだけ使ったか。
- 失敗取引率/ガスコスト:過剰に高ければ許容を少し緩める余地。
- 1取引あたりの総合コスト:価格影響+ガス+失敗コスト。
Q&A
Q:小口でも狙われますか?
A:可能性は下がりますがゼロではありません。特に浅いプールや混雑時は注意。
Q:CEXと比べた優位は?
A:自己保管と透明性。ただし実行価格の質は設計依存。大口はRFQやリミットで。
まとめ
サンドイッチ攻撃は「大きめの成行 × 広いスリッページ × 浅い流動性 × 公開送信」が揃うと発生確率が急上昇します。スリッページを絞り、注文を分割し、プライベート送信やRFQを使う――この基本を守るだけで、実行価格の悪化は大幅に抑えられます。毎回の取引でKPIを記録し、設計 → 実行 → 事後評価のループを回してください。
コメント