分散型取引所(DEX)でスワップした直後に約定価格が悪化し、「見積もりより高く買わされた/安く売らされた」という経験はありませんか。多くの場合、メンプールで注文が覗かれ、攻撃者の先回り買い・後追い売りに挟まれる「サンドイッチ攻撃」が原因です。本稿では、初心者でも今日から実務に落とし込める発注設計と運用フローを提示し、被害の再現可能な抑制方法を解説します。
サンドイッチ攻撃のメカニズム
あなたのスワップ取引(被害者TX)がメンプールに到達すると、ボットが価格影響とスリッページ許容値を推定します。成立余地があると判断されると、攻撃者は先に少量を買い(Front-run)、あなたの取引で価格を押し上げ、その直後に売り戻す(Back-run)ことで差益を確定します。結果としてあなたの実行価格は見積もりより悪化します。
なぜ成立するのか(経済合理性)
AMMではプールの準備金 x, y が一定積 k = x · y を満たすため、あなたの注文量 Δx は価格 p を非線形に動かします。攻撃者はこの不可逆な価格影響を利用して無リスクに近い裁定を構成します。特に流動性が浅いプール、許容スリッページが大きい注文、急騰・急落時に成立しやすくなります。
損失のラフな見積り式
プール深さを L、あなたのノーション(USD)を Q、許容スリッページを s(%)とすると、攻撃者に抜かれる上限コストの概算は、
Expected Loss ≈ min(s, α·Q/L) × Q
です。α はプール形状・ボラティリティ依存の係数(経験的に 0.5〜1.5 程度)。例えば流動性 10M USD のプールで 20k USD を 1.0% 許容で投げると、α=1
として min(1.0%, 0.2%)×20,000 ≈ 40 USD
規模の追加コストが発生し得ます。
防御戦略の優先順位(コスパ順)
1) メンプールを回避する送信経路
プライベート送信(保護付きRPCやバンドル送信)を使い、取引を公開メンプールに出さずにブロックビルダーへ届けます。覗かれないのでサンドイッチの主要因を断てます。確実性は高い一方、約定遅延や失敗時のリトライ設計が必要です。
2) バッチオークション/RFQ系ルート
オフチェーンで注文を集約し最良提案を競わせる仕組み(例:バッチオークション、RFQ)。価格発見をオフチェーン化することで、オンチェーンのフロントラン余地を減らします。大口ほど有利です。
3) リミット注文型DEXの活用
指定価格に板で待ち受ける方式は、スリッページ許容を広く取らないため攻撃余地が小さくなります。指値未約定リスクと引換えに、価格インパクトを抑制できます。
4) スリッページ許容の動的制御
固定の 1% などは危険です。ボラティリティ(短期ATR%)× 注文相対サイズ(Q/L)から都度計算し、最小限に抑えます。推奨の簡易式は次節を参照してください。
5) 注文の分割(TWAP)
大口は時間分散で価格影響を薄めます。1回で 20k USD を投げるより、2〜5分おきに 2〜4 回に分ける方が安全です。手数料と約定遅延のトレードオフに留意します。
6) 深いプール/手数料の低いプールを選ぶ
同一トークンでもプール深さと手数料ティアが異なります。ボラが高いときは手数料低め・流動性の深いルートを選択し、マイナーなプールは避けます。
発注前チェックと実務フロー
ステップA:送信経路の初期設定
ウォレットに保護付きのRPCエンドポイントを追加します。以後のスワップは原則この経路から送信します。保護経路が混雑・失敗する場合のみ、通常経路にフォールバックし、スリッページをさらに厳格化します。
ステップB:許容スリッページの算出
以下の簡易式を使って許容値を決めます。
Allowed Slippage (%) = clamp( 0.25 × ATR1m(%) × sqrt(Q/L), 0.05, 0.80 )
ここで ATR1m(%) は直近1分の平均真のレンジを価格で割った値(%)、Q/L は注文ノーションとプール深さの比、clamp(x, a, b)
は x を [a, b] に丸める関数です。最小 0.05%、最大 0.80% の枠内に収めます。
ステップC:見積り比較とルート固定
2つ以上のアグリゲータで見積もりを取り、受取最少量が良い方を採用します。約定直前に再見積もりし、著しく悪化していればキャンセルまたはTWAPに切替えます。
ステップD:ガス戦略
EIP-1559のmaxFeePerGasとmaxPriorityFeePerGasは、原則として「低め→自動リトライ」。攻撃者は高い優先料設定を見てエッジを取りに来ます。急ぎのときだけ優先度を引き上げます。
ケーススタディ:USDT→ETH 10,000ドル
プール深さ L=10M USD、ATR1m=0.6% と仮定します。式より Allowed Slippage ≈ 0.25×0.6×sqrt(10k/10M)=0.25×0.6×0.0316≈0.0047%
。実務では下限 0.05% に丸めるので、許容値は0.05%。この条件で保護RPCを使い、2,500 USD × 4 本のTWAPに分割。結果として受取量の悪化は見積もり比 +0.01% 程度に収まり、サンドイッチ痕跡(前後に自分を挟む2件の小口スワップ)は発生しませんでした。
約定後の検証
ブロックエクスプローラで自分のトランザクションの前後を確認します。自分のハッシュの直前に同じペアの買い、直後に売りがあれば典型的なサンドイッチです。発見したら次回はスリッページ許容を下げ、注文分割数を増やし、保護経路のみで再実行します。
よくある誤解と対策の落とし穴
「スリッページを0%にすれば安全」ではありません。約定失敗が多発し、結果として高値追い・タイミング喪失につながります。あくまで動的な最小許容が基本です。また、保護RPCでも全てのMEVを防げるわけではありません(提携先や取り回しに依存)。複数手段の併用が前提です。
実務チェックリスト(運用時に確認)
① 保護付き送信が有効か ② ATRとQ/Lから許容スリッページを算出したか ③ 見積りを複数比較したか ④ 大口はTWAPに分割したか ⑤ 約定後にブロック周辺を検証したか——この5点を毎回徹底するだけで、被害の大半は抑制できます。
まとめ
サンドイッチ攻撃は「見られる→動かされる→抜かれる」という単純な構図です。発注経路の非公開化、スリッページの動的最小化、注文分割と深い流動性の選好という3本柱をセット運用すれば、初心者でも継続的に被害を抑えられます。今日から発注フローを整備し、不要なコストを守りにいきましょう。
コメント