DEXでスワップを実行すると、あなたのトランザクションは一度メンプールに置かれます。ここで待機している間、MEV(Maximal Extractable Value)を狙うボットが注文を観測し、価格に先回りして利益を抜き取るのがサンドイッチ攻撃です。本稿では、なぜ起きるのか・どこで損するのか・どう守るのかを、初歩から実践レベルまで体系的に解説します。
サンドイッチ攻撃のメカニズム
典型的な流れは「Front-run(先買い)→ Victim(あなたのスワップ)→ Back-run(先買い分の利確売り)」です。AMMでは価格が自動式で決まるため、あなたのスワップ量が大きいほどプール価格が動き、フロントの高値買い+あなたの成行スワップで価格を押し上げ+バックで売り抜けの差分が攻撃者の利益になります。
どこで損が生まれるか
損失源は主に3つです。(1)不利な約定価格(価格インパクト)、(2)スリッページ許容幅の食い潰し、(3)ガス代の増加。結果として、同じスワップ量でも受け取りトークンが減少します。
簡易モデルで直感を掴む
一定のプール深度 D で、あなたのスワップ量 Q が価格に与える影響を単純化して、price_impact ≒ Q / D
と置くと、攻撃者の先回り買い Δq が追加で上振れを作り、実効インパクトは (Q+Δq)/D
に拡大します。あなたの許容スリッページ s を超えると、取引が失敗または極めて悪い価格で約定します。
防衛の原則(要点)
守り方は「見られにくくする」「動かされにくくする」「高コスト化させる」の三本柱です。以下で具体策を順に実装します。
実践ステップ:あなたが今日からできる10の手順
1. スリッページ許容幅の初期設定
ボラティリティが低い主要ペア(例:USDC/ETH)では、0.1%〜0.3%から開始します。ボラティリティが高いアルトや低流動プールでは、0.5%〜1.0%に広げても、その分だけ攻撃余地も広がることを理解しておきます。
2. 注文分割(サイズを見せない)
1,000 USDCを一度にスワップせず、200 USDC × 5回などに分割します。各トランザクションの影響が小さくなるため、サンドイッチの利益幅が縮み、狙われにくくなります。
3. ルート分散(複数プールに逃がす)
アグリゲーター(例:1inch, Matcha, OpenOcean)を使い、複数のプール・AMM曲線に分散させます。単一路線で深いプールに突っ込むより、総合的な価格インパクトが抑えられます。
4. RFQ/競り型ルーターの活用
オフチェーンで見積りを競わせてからオンチェーンで結論だけを確定する仕組み(例:CoW Swapの競り、0x RFQ)を利用します。メンプールで注文の生のサイズが晒されにくく、サンドイッチ耐性が上がります。
5. プライベートメンプール(Protect)に送る
トランザクションを公開メンプールに出さず、ブロックビルダーへ直接ルーティングする手段(例:Flashbots Protectや類似の保護RPC)を使います。観測コストを引き上げ、前後挿入を難しくします。
6. タイミングをずらす
オンチェーンイベント直後や高ボラ時間帯は避けます。ガス急騰局面はブロック密度が上がり、攻撃者の回転効率が向上します。静かな時間に小口で執行しましょう。
7. 限定注文/TWAPの活用
対応プロトコル(例:UniswapXや0x系のリミット)では、希望価格を明示できます。もしくは時間分散(TWAP)で連続的に小さく約定させ、価格インパクトの局所集中を避けます。
8. トークンの許可(Allowance)を最小化
大きな許可はコントラクト乗っ取り時の被害を増やします。スワップ前に必要分+α程度に絞り、完了後は不要な許可を取り消す運用を徹底します。
9. ルーターとプールの健全性チェック
不自然に薄いプール、片側に偏ったLP、運営のアクティビティが低いプロジェクトは避けます。ルーティング先の品質が悪いと、価格ずれと攻撃余地が拡大します。
10. ガス価格とガスリミットの設計
ガス価格を過度に上げすぎると攻撃者の収支も成立しやすくなります。一方で低すぎると待機時間が伸び観測されやすい。標準〜やや高めのバランスで、gas_price × gas_used
の総コストを管理します。
コストとベネフィットの比較フレーム
サンドイッチを受けやすい設定(例:広いスリッページ・単一大口・公開メンプール)を A、耐性の高い設定(例:狭いスリッページ・分割・プライベート送信・RFQ)を B とし、以下の差分を観測します。
- 受取トークン差:
Δout = out_B − out_A
- 失敗率差:
fail_B < fail_A
を目標 - ガス差:
gas_B
はやや増えてもΔout
が上回れば採用
ケーススタディ:USDC→ETHを5回に分割
前提:1,000 USDCをETHにスワップ、標準的な主要プール、平常時。
A:一括・スリッページ1.0%・公開メンプール。
B:200 USDC × 5回・スリッページ0.3%・アグリゲーター経由で分散・Protect送信。
経験則として、BはAに比べて受取ETHが数十bps改善することが多く、ボットの成立余地が削られます。小口・分散・秘匿の組合せが効きます。
よくある誤解
「スリッページを広げれば失敗しない」は半分正解ですが、攻撃者の利益幅を自ら献上しがちです。「ガスを極大にすれば安心」も誤りで、観測容易性と回転速度が上がり、むしろ狙われることがあります。
運用チェックリスト
(1)許容幅は0.1〜0.3%から開始。(2)200〜500USD相当で分割。(3)アグリゲーターでルート分散。(4)Protect RPCかRFQ/競り型を優先。(5)薄いプールは避ける。(6)高ボラ時間は避ける。(7)約定ログを毎回保存して差分を可視化。
まとめ
サンドイッチ攻撃は、観測される・価格を動かす・広く許容すると成立します。逆に、見せない・分散する・狭く許容する運用へ切り替えれば、初心者でも十分に被害を抑制できます。今日から設定を見直し、小口・分散・秘匿の三点セットを徹底しましょう。
コメント