三明治攻擊是怎麼運作的,為什麼能成功?
三明治攻擊利用兩個關鍵機制:(1) mempool 的公開透明性,和 (2) Gas 出價決定交易順序。
攻擊流程: ① 受害者送出一筆「在 Uniswap 用 10,000 USDC 買 ETH」的交易到 mempool,滑價容忍度設為 1% ② 攻擊者的機器人瞬間看到這筆交易,評估有足夠利潤空間 ③ 攻擊者送出「買入 ETH」的交易,並設定比受害者更高的 Gas,確保被礦工/驗證者優先打包——這叫 frontrun ④ 攻擊者的買單提高了 ETH 在池子裡的價格 ⑤ 受害者的買單成交,但此時 ETH 價格已被推高,受害者用更多 USDC 買到更少 ETH(在容忍範圍內) ⑥ 攻擊者立刻送出賣出 ETH 的交易(backrun),在受害者的交易推升後的價格賣出,鎖定利潤
整個過程中攻擊者的利潤 = 受害者多付的溢價,減去 Gas 費。
哪些情況最容易成為三明治攻擊的目標?
三個因素決定了你是否是個吸引人的目標:
(1) 交易規模大:小額交易(如 $50)的可榨取空間小,Gas 費可能超過獲利,攻擊者不願出手;大額交易(數千美元以上)的利潤空間足夠覆蓋 Gas 費,是主要目標。
(2) 滑價容忍度寬:如果你設了 3% 的容忍度,攻擊者就知道有最多 3% 的空間可以榨取。設 0.1% 的嚴格容忍度會讓攻擊風險大幅降低(攻擊者空間太小)。
(3) 流動性淺的交易對:流動性淺的池子滑價本來就大,小幅推高更容易讓受害者的交易仍能成交(在容忍度內),同時攻擊者獲利也更高。
熱門穩定幣對(USDC/USDT)幾乎不受三明治攻擊,因為價格幾乎不動,攻擊空間極小。
用戶可以採取哪些措施來保護自己不被三明治攻擊?
(1) 嚴格的滑價設定:把滑價容忍度設到 0.1–0.5%,攻擊者能操作的空間大幅縮小;代價是交易在高波動時期可能失敗。
(2) 使用私有交易池(Private Mempool):Flashbots Protect、MEV Blocker 等服務讓你的交易不在公開 mempool 出現,攻擊者根本看不到,是目前最有效的防禦手段之一。
(3) 拆分大單:把一筆大額交易拆成多筆小額分批執行,降低每筆交易的規模,減少攻擊利潤空間。
(4) 選擇深池交易:深流動性池的單筆交易影響較小,攻擊者能榨取的利潤也較少。
(5) 使用 CoW Protocol 等 DEX:一些設計上減少 MEV 的 DEX(如 CoW Protocol 的批次拍賣機制)讓用戶交易不被搶跑。
三明治攻擊和一般的搶跑(Front-running)有什麼不同?
搶跑(Front-running)是一個更廣義的概念:攻擊者在目標交易之前插入自己的交易以獲利。
三明治攻擊是搶跑的一種特定模式,它的關鍵特徵是「同時有前置交易和後置交易」——攻擊者在目標交易前後都插一筆,把受害者「夾」在中間。
其他形式的搶跑: (1) 純搶跑(Pure Front-run):只在受害者交易前插入,搶先完成交易,讓受害者失去機會(如搶 NFT mint、搶套利機會) (2) 背跑(Back-run):只在受害者交易後插入,利用受害者交易帶來的價格移動(如清算後的套利)
三明治攻擊 = Front-run + Back-run 組合,是最複雜但也最能從普通用戶身上持續榨取的模式。
根據 EigenPhi 鏈上分析資料,2022年10月至2024年9月間以太坊每日平均發生逾 4,400 次三明治攻擊。記錄最完整的操作者是機器人 jaredfromsubway.eth:自2023年3月起透過三明治攻擊累計獲利逾2,200萬美元,可在 EigenPhi Dune Dashboard 公開查核。一起具體可驗證的案例:2025年3月12日,一名用戶在 Uniswap v3 USDC-USDT 池送出 $220,764 USDC,遭三明治攻擊後僅收回 $5,271 USDT,損失逾 $215,000。(交易雜湊 0xee9fcd2b9996e96b642cb4cda47fc140f98fdaf07ee02657743d4bfcc4670106 可在 Etherscan 查驗)
私有 mempool 解決了三明治攻擊問題,但引入了新的信任假設——你必須信任 Flashbots 等服務不會自己利用你的交易信息。嚴格的滑價設定可以防禦但導致交易失敗率上升。目前沒有完美的解決方案,MEV 是公開區塊鏈結構的固有特性,三明治攻擊只是其中最顯眼的負面表現。