介绍
在我的上一篇文章中,我介绍了三明治攻击的基本原理,攻击者在创建区块时可以通过构建一系列交易来从一个天真的代币交换中夺取价值。这个过程分为三步:1)在用户的交易前进行交易,改变流动性池状态,以任意降低报价相对于用户尝试出售的代币的价格;2)允许用户按降低的价格进行交易;3)在前两步之后对交易进行回溯,将流动性池恢复成相对正常的状态。演示表明整个过程在财务上与攻击者的有效窃取后紧接着对流动性池进行显著的交换费用调整是一样的。如果愿意的话,我在那里提出的公式包括OptimumSandwich
python类,是继续独立研究的有价值的基础。文章最后我向读者提出挑战,要为“不可三明治化”的交易提供数学描述。也就是说,要通过代数表明,在进行三明治攻击的所有状态变量和用户输入中,存在一组类似的状态变量,其中最多一个元素的修改会使三明治攻击变得不可能。本文的目的是描述“不可三明治化”的集合。
这里使用的约定和之前建立的一样;为了区分属于攻击者和用户的输入和输出,我将继续使用下标a和u。此外,x将一贯代表用户或攻击者发送到流动性池的代币,而y则一贯代表从流动性池转移到用户或攻击者的代币。小写的希腊字母δ代表交易费,而大写的Δ表示交易数量。假定x,y,δ,Δx,Δy都是正实数,并且Δx和Δy是从用户或攻击者的钱包中取出的代币数量,分别添加到或从流动性池中相应地平衡。代表攻击者从回溯交易中接收的代币数量与在前置交易中发送到流动性池的相同代币之间的差异用字母Q表示。
破解三明治自动贩卖机
在前一篇文章中最关键的信息是,攻击者的利润Q在一个准确的前处理交易数量Δxₐ上是最优的,这依赖于流动性池的代币储备x,其费率δ,以及用户试图交换的代币数量Δxᵤ。最优的前处理交易数量Δxₐ可以表达为四次多项式的根。前面的焦点是确定Δxₐ的值而 treating 其它变量为常数,而这里的目标是确定在攻击者的最佳前处理交易为零时,流动性池状态和用户输入的值。换句话说,是什么样的池状态和用户输入组合能够导致攻击者决定什么事也不做,把用户的交易放过?与本文之前的文章相比,这些解决方案更容易找到。取定义的四次式并将其不定数Δxₐ设为零。这使得除常数项以外的所有项都被消除了(eqn1)。
虽然x项仍然是四次的,但它的两个根是平凡的(参考下面的分解),另外两个是相对温和的二次方程的解。Δxᵤ和δ项都是立方的,但同样,一个根是平凡的,另一个可以通过使用二次方程公式推断出来。与之前一样,我只呈现了与上下文相关的根。也就是说,对于下确界δ:0 <δ< 1,上确界Δxᵤ:Δxᵤ > 0,和下确界x:x> 0,攻击者的最优前处理交易Δxₐ比0小或等于0(eqns 2-4)。为了让读者的大部分受众受益,这些表达式的含义如下:
假设有一个常产品流动性池,其中ETH的代币储备为x,用户已经提名要将Δxᵤ ETH交换为对应的代币,使得无论三明治攻击的最低交易费是infδ(eqn 2)。因此,任何δ≥ infδ也将使三明治攻击变得不可能(图1)。
在一个常产品流动性池中,ETH的代币储备为x,交换费率为δ,用户在暴露三明治攻击机会之前可以交换的最大ETH数量是sup Δxᵤ(eqn 3)。因此,任何Δxᵤ≤ sup Δxᵤ也会使三明治攻击变得不可能(图2)。
假设有一个交换费率为δ的常产品流动性池,用户已经提名要将Δxᵤ ETH交换为对应的代币,使得从流动性池中转出的ETH的最低储备是infx(eqn 4)。因此,任何x≥ infx也会使三明治攻击变得不可能(图3)。
图1: 关于x和Δxᵤ的inf δ分析。 在一个持有x ETH代币储备的常产品流动性池中,当用户选择交换Δxᵤ ETH来换取其对应的代币时,使得最低交换费使三明治攻击毫无价值的交换费由inf δ来代表(eqn 2)。大于或等于inf δ的交换费可防止三明治攻击的出现。这些可视化呈现为a)左侧的三维(3D)曲面图和b)右侧的相应热度图。
图2: 关于x和δ的sup Δxᵤ分析。 假设一个常产品流动性池持有x ETH的代币储备,交换费率为δ,用户能够交换的最大ETH数量而不会引发三明治攻击的ETH数量由sup Δxᵤ代表(eqn 3)。任何Δxᵤ小于或等于sup Δxᵤ都可以保证免疫三明治攻击。这些可视化呈现为a)左侧的三维(3D)曲面图和b)右侧的相应热度图。
图3: 关于δ和Δxᵤ的inf x分析。在一个交换费率为δ的常产品流动性池中,当用户选择交换Δxᵤ ETH来换取其对应的代币时,流动性池储备的最低ETH数量inf x使得没有三明治攻击的出现(eqn 4)。大于或等于inf x的储备都可以保证三明治攻击的不可能性。inf x轴使用log10刻度呈现。这些可视化呈现为a)左侧的三维(3D)曲面图和b)右侧的相应热度图。
r = x/ Δxᵤ。这是一种直观的简化;它不是用户交易的绝对大小,而是与流动性池的代币储备进行比较的相对大小(eqn 5)。
δ和inf r可以分别被定义(eqns 6 and 7)。
δ和r 的作图调查是对我的直觉的挑战(图4)。很明显,对于x,Δxᵤ ∈ ℝ+,当x → ∞时,r的极限为∞,当Δxᵤ → ∞时,r的极限为0,当Δxᵤ → x时,r的极限为1。从几何角度来看,r = 1是范围的“中间”,因为0和∞在某种意义上与Δxᵤ → x的极限等距。目前为止没有什么意外。inf δ的极限也是微不足道的;当r → ∞时,inf δ的极限为0,当r → 0时,inf δ的极限为1,自然的“中间”值是δ = ½。我预期这些中点会重合,但它们没有。对应于δ = ½的r值是r = 1/√3,对应于r = 1的δ值是δ = (9 — √33)/8。这个事实看起来没有什么有用的地方;我只是因为好奇而提出来的。然而,分析继续取得成果。定义inf δ的函数也表现出渐近极限行为。当r变得任意大时,inf δ函数渐近等价于1 — √r (eqn 8)。当r非常接近于但大于0时,它也渐近等于2/(2r + 3) (eqn 9)。我为读者提供了一个交互式作图,以便方便使用desmos。前一个(eqn 8)具有更实际的意义,因为我们很少指望用户尝试以超过流动性池整个储备的代币数量进行交换。
图4: 关于r的inf δ分析。在一个持有x ETH代币储备的常产品流动性池中,当用户选择交换Δxᵤ ETH来换取其对应的代币,而使用显然抗三明治攻击的流动性池费率inf δ进行交换费设置时,使得最低交换费使三明治攻击毫无价值的交换费由inf δ来代表(eqn 6)。大于或等于inf δ的交换费可以预防三明治攻击。这些可视化为r与inf δ之间的关系:a) 关键交点对应于函数定义域的启发式中点和b) 无穷大近似inf δ的直观图。
合成一块不能吃的三明治
最佳三明治:如何以任意精度利用区块链爱好者”。假设有一个流动性池,其ETH(x)和USDC(y)总价值约为2百万美元,可以推断ETH的市价约为2000美元。此外,假设标准情况下交换费率δ固定为0.003(即0.3%,或30个基点)。
minReturn,它可以提供相当聪明的解决方案来防范三明治攻击。我承诺将在即将到来的文章中更仔细地检查minReturn
标准。目前,这一部分的范围仅限于到目前为止讨论的概念。请让这一部分的重点集中在这一段时间所涵盖的概念上。请理解。
用户观察到流动性池中有500.000000个ETH代币