0215 分钟
SANDWICH · SLIPPAGE · USER PROTECTION

夹子交易赚走的是什么?

让搜索者在用户前后各做一笔交易,比较用户保护线、池内价格和搜索者提取的差额。

本章目标学完后,你应该能:
  • 解释前置交易如何改变用户得到的数量
  • 用最小得到数量理解滑点保护
  • 区分搜索者利润、池子手续费和用户损失
章节位置第 2 / 4 章
  1. 上一章交易提交后,谁能先看见它?
  2. 本章夹子交易赚走的是什么?

    让搜索者在用户前后各做一笔交易,比较用户保护线、池内价格和搜索者提取的差额。

  3. 下一章用户制造的价格差,谁来回跑?
阅读前

先想一想这几个问题

展开答案前,可以先在心里做个判断。与预期不同的内容可以加入复习列表。

Q01用户交易明明成功了,为什么仍可能被夹子伤害?
简要回答

成功只表示没有触发回滚,不表示成交公平。攻击者先改变池价,用户在仍可接受的最差价格成交,再由攻击者反向交易;损失藏在更差输出里。

和原先判断相比:

夹子交易不是“池子被黑了”这么简单。它利用公开用户意图和 AMM 的曲线:搜索者先买入改变储备,用户在更差的状态里成交,搜索者再卖出,把一部分价格冲击变成自己的收益。

把三笔交易放在同一条排序里

在普通公开场景中,区块可能只执行用户交换;在夹子场景中,搜索者提出:

  1. 前置买入:先消耗一部分 TOKEN 深度;
  2. 用户交换:在新的储备上执行;
  3. 后置卖出:把前置买到的 TOKEN 卖回池子。
ORDERING SIMULATION虚拟池 · 不连接真实网络
SECURITY 001 · MEMPOOL / ORDERING / MEV

谁决定交易的顺序?

把一笔交换放进确定性池子,再观察可见性、排序、滑点保护和价值提取如何改变结果。

当前场景夹子交易阶段:待提交
池内现货价120.00积分 / TOKEN
用户预估输出90TOKEN
用户实际输出0TOKEN
搜索者盈亏0积分,已计排序小费
搜索者可见0 条交易池记录
FOCUS EXPERIMENT · SANDWICH保护线能挡住夹子交易吗?

用宽松和严格两条最小得到数量保护线,执行同一条公开排序。

初始预估 90 TOKEN最小得到 84 TOKEN夹子提取 0 TOKEN
从意图到共享状态夹子交易
  1. 01
    交易池意图是否可见
  2. 02
    区块排序谁先执行
  3. 03
    共享状态节点共同重放
交易池
还没有提交交易
区块最终排序
观察交易池后构建区块

交易池记录不是成交,区块排序也不是赔付。只有执行才会真正移动余额和池子储备。

BALANCE LEDGER · NO VALUE FROM NOWHERE谁获利、谁支付,哪些资产真的移动了?

搜索者利润、提议者小费、池子手续费和用户输出都放在同一张账上。

池子120,000 积分 · 1,000 TOKEN
用户30,000 积分 · 200 TOKEN
搜索者20,000 积分 · 200 TOKEN
提议者0 积分 · 0 TOKEN
观察提示

先提交一笔用户交换。关键问题不是交易是否合法,而是谁能在它成为共享状态前看见并排序它。

排序事件1 EVENTS
  1. 01

    公开池创建:120,000 积分 + 1,000 TOKEN,任何公开交易都可能改变下一笔报价。

操作记录实验时间轴
1 个状态快照

拖动滑块可以回到此前的步骤。从那里继续操作时,后续记录会替换为新的操作序列。

初始状态
查看实验记录 →

观察用户的“预估输出”和“实际输出”。如果最小得到数量设得太宽,用户会接受更差的成交;如果保护线设得足够紧,用户交易会回滚,搜索者不能把这笔失败当作已成交。

展开:这一步如何实现
front = swap(searcher, X → Y)
victim = quote(pool_after_front, X → Y)
if victim.amountOut < victim.minOut:
    revert(victim)
else:
    execute(victim)
back = swap(searcher, Y → X)

真实协议还要处理原子性、gas 竞价、私有 bundle、路由器最小输出和多池路径。实验室只保留能看见资产流向的最小状态机。

理解检查

最小得到数量在夹子交易中真正保护了什么?

读懂一笔提取

夹子提取应当放在同一张账上:用户少得到的 TOKEN、搜索者的积分变化、池子收取的手续费,以及提议者可能拿到的排序小费。只有这样,才能避免把每一个负的价格冲击都误读成同一种攻击。

本章小结完成练习和理解检查后,可以保存本章