三明治攻擊(Sandwich Attack)是 DEX 中一種典型的 MEV 攻擊方式:攻擊者先在你的交易前買入,再讓你的交易推高價格,最後在你的交易後賣出,從價格變化中獲利。你看到的交易可能正常完成,但最終收到的代幣數量會少於理想成交結果。
三明治攻擊本質上是「前置交易 + 用戶交易 + 後置交易」的組合。攻擊者透過觀察公開交易池(Mempool)中的待確認交易,判斷某筆 DEX Swap 是否具有足夠的價格影響和盈利空間,然後嘗試把自己的交易安排在用戶交易之前和之後。
以用戶用 USDT 買入某種 Token 為例:
用戶提交一筆較大的 USDT → Token 交易。
攻擊者發現這筆交易可能明顯推高 Token 價格。
攻擊者先買入 Token,即 Front-running。
用戶的 Swap 按原計劃執行,但由於池中價格已經被推高,用戶實際獲得的 Token 數量下降。
用戶交易完成後,攻擊者立即賣出此前買入的 Token,即 Back-running。
攻擊者利用兩次交易之間的價格差獲得收益。
這就是所謂的「夾心」:用戶交易被夾在攻擊者的買入和賣出之間。Uniswap 對三明治攻擊的說明也採用了這一基本過程,並指出價格滑動和區塊鏈交易透明性是這種攻擊能夠發生的重要條件。

核心原因不是 DEX 本身存在某個簡單的「漏洞」,而是 AMM 的定價機制、公開交易信息和區塊內交易排序結合後,為 MEV 搜索者創造了可利用的空間。
在 AMM 中,一筆較大的 Swap 本身就可能改變流動性池中的資產比例,從而影響後續交易價格。如果攻擊者能夠提前看到這筆交易,就可以估算它可能造成的價格變化,並判斷是否值得在交易前買入、交易後賣出。
以太坊官方文檔將這種透過調整區塊中交易的包含、排除和排序來提取價值的行為歸入 MEV。三明治交易就是其中較典型的一類,而且與套利不同,它會直接惡化普通用戶的成交結果。
因此,真正需要關注的是下面這條鏈路:
公開待確認交易 → 攻擊者識別大額 Swap → 前置買入 → 用戶成交 → 後置賣出 → 攻擊者獲利
如果你還不清楚 Slippage、Price Impact 和 MEV 分別意味著什麼,可以先了解滑點與 MEV:DEX 交易的隱藏成本,再來看三明治攻擊會更容易理解。
三明治攻擊的利潤主要來自用戶交易造成的價格變化。
假設一個流動性池當前 Token A 的價格為 100 USDT。用戶提交了一筆規模較大的買入訂單,正常情況下,這筆訂單執行後價格可能上漲到 105 USDT。
攻擊者如果能夠在用戶交易之前買入 Token A,那麼攻擊者買入時使用的是較低價格;等用戶的大額買單推動價格上漲後,再把 Token A 賣出,就可能獲得價差。
這裡需要特別注意:攻擊者並不是憑空「拿走」用戶的錢,而是利用用戶的大額交易對池子價格造成的影響進行交易。用戶承擔的主要損失通常表現為更差的成交價格、更高的價格影響以及額外的滑點損耗。
實際收益還必須扣除 Gas、交易競爭成本、價格變化以及交易失敗等因素。因此,並不是看到一筆大額 Swap 就意味著一定存在可盈利的三明治機會。
三明治攻擊尤其關注對流動性池價格影響較大的交易。
如果一個池子擁有非常深的流動性,一筆普通規模的交易通常不會明顯改變池內資產價格;攻擊者即使提前買入,也未必能夠獲得足夠利潤。
相反,如果交易金額相對於池子流動性較大,同樣數量的 Token 買入可能造成更明顯的價格變化。Uniswap 也明確建議用戶優先考慮流動性較大的池子,因為攻擊者更容易從低流動性池的大幅價格變化中尋找機會。
因此,判斷風險時不要只看「我要交易多少錢」,而應該看:
交易金額 ÷ 對應交易池的有效流動性
這個比例越高,一般意味著交易本身對價格的影響越明顯。
滑點容忍度(Slippage Tolerance)決定了你願意接受的最大成交價格偏離範圍。
例如,你準備買入某個 Token,報價顯示預計可以獲得 1,000 枚 Token。如果設置了較高的滑點容忍度,交易即使受到較明顯的價格變化,只要最終成交結果仍處於允許範圍內,交易就可能繼續執行。
這給攻擊者留下了更大的操作空間。
因此,高滑點並不等於一定會被三明治攻擊,但它可能擴大攻擊者可以利用的價格空間。反過來,如果滑點設置得過低,交易又可能因為市場價格變化而失敗。
真正合理的做法不是簡單地把滑點設置成「越低越好」,而是根據 Token 流動性、交易規模、網絡狀況和實際成交需求進行調整。
兩者都屬於 MEV 相關行為,但交易結構並不完全相同。
普通 Front-running 更接近「看到你的交易後,搶在你之前完成類似交易」,攻擊者的目標是獲得先手優勢。
三明治攻擊則需要前後兩筆交易形成完整結構:
攻擊者買入 → 用戶交易 → 攻擊者賣出
因此,三明治攻擊不僅需要預測用戶交易,還需要在用戶交易前後完成兩次交易,並承擔價格變化和交易失敗風險。
以太坊官方文檔也將 Sandwich Trading 單獨列為一種常見 MEV 提取方式,並指出它會導致被夾交易的用戶面臨更高的滑點和更差的執行結果。

如果交易金額較大,可以考慮拆分交易,避免一次交易對流動性池價格造成過大的衝擊。
但拆單並不意味著絕對安全。如果拆分後的多筆交易仍然暴露在公開交易環境中,同樣可能存在 MEV 風險,因此需要結合實際流動性和執行環境判斷。
流動性越深,單筆交易造成的價格變化通常越小。
因此,在交易 Token 時,不要只比較顯示出來的報價,也應該關注實際使用的流動性來源以及交易規模對應的 Price Impact。
不要為了「保證交易成功」而把滑點容忍度設置得過高。
同時,也不要機械地設置極低滑點導致交易頻繁失敗。比較合理的原則是:在能夠接受的成交範圍內,將允許的價格偏離控制在較小水平。
部分錢包、交易工具和交易協議會透過私有交易通道、訂單意圖(Intent)或其他機制降低交易內容暴露給公開 Mempool 的程度。
例如,Flashbots 提供的 Protect 服務就是針對搶跑等 MEV 風險設計的交易保護機制。
1inch 的部分交易產品也採用 Intent-based 架構,並提供 MEV Protection;其 Wallet 的 Swap 功能目前也標註為支持 MEV protection。
需要注意的是,使用所謂「MEV 保護」並不意味著所有交易風險都會消失,具體保護範圍仍取決於所使用的錢包、網絡、交易模式和執行機制。
如果一個 Token 的流動性很低、交易規模卻很大,那麼除了三明治攻擊,還可能面臨嚴重的 Price Impact、滑點以及流動性不足問題。
因此,當你發現一個 Token 必須把滑點設置得非常高才能完成交易時,不應該只把問題理解為「怎麼設置參數」,而應該重新判斷這個交易池是否適合交易。
三明治攻擊不一定會出現一個明顯的「你被攻擊了」提示,通常需要結合鏈上交易記錄進行判斷。
可以重點觀察:
自己的交易前是否出現了同一 Token 的大額買入;
自己的交易後是否出現了同一地址的大額賣出;
你的交易前後 Token 價格是否出現異常變化;
實際成交價格是否明顯偏離提交交易時的報價;
交易所在池子的流動性是否較低;
攻擊者的兩筆交易是否與自己的交易處於同一區塊,並形成明顯的前後夾擊結構。
如果出現「攻擊者買入 → 我的 Swap → 攻擊者賣出」這樣的鏈上結構,並且攻擊者從價格變化中獲得了收益,就具有較明顯的三明治攻擊特徵。
不過,單憑交易順序不能百分之百確認攻擊行為,還需要結合交易金額、池子狀態、Gas、路由和實際價格變化進行分析。
很難透過某一個參數徹底消除三明治攻擊風險。
因為它涉及的是區塊鏈交易透明性、交易排序、AMM 定價機制以及 MEV 市場之間的綜合關係。以太坊生態目前也在持續探索包括 PBS、Builder API、私有交易通道等在內的 MEV 緩解方案。
對於普通 DEX 用戶來說,更現實的思路不是追求「絕對不會被夾」,而是降低自己成為高價值目標的概率,並減少一次攻擊能夠造成的損失。
可以把風險控制濃縮成一個簡單公式:
大額交易 ↓ + 深流動性池 ↑ + 合理滑點 ↓ + MEV 防護 ↑ = 三明治攻擊風險 ↓
三明治攻擊的核心,是攻擊者利用公開待確認交易和交易排序,在用戶 Swap 前後插入自己的交易,從用戶交易造成的價格變化中獲取利潤。
普通用戶最應該關注的並不是「有沒有一種設置可以保證不被攻擊」,而是交易規模、流動性、Price Impact、滑點容忍度以及交易是否經過 MEV 防護通道。
尤其是在交易低流動性 Token 或進行大額 Swap 時,不要只看交易界面顯示的報價。理解「報價 → Price Impact → Slippage → MEV → 最終成交」的完整鏈路,才能真正判斷一次 DEX 交易的實際成本和風險。
加密貨幣和 DeFi 交易具有較高風險,價格、流動性、智能合約及網絡狀況均可能發生快速變化。本文僅用於信息和教育目的,不構成投資建議。