bZx 连遭攻击,Vitalik Buterin 发推称 Uniswap v2 能够抵御闪电贷攻击,真的如此吗?了解一下 Uniswap v2 价格预言机设计。

原文标题:《Vitalik:Uniswap v2 价格预言机能够抵御闪电贷攻击》(When is Uniswap a good oracle?)
撰文:Guillermo Angeris
编译:洒脱喜

近日,在 bZx 连遭攻击之后,关于「预言机」、「闪电贷」、「管理密钥」的讨论已变得越来越多,DeFi 生态正在经历一个短暂的痛苦期。

对此,以太坊联合创始人 Vitalik Buterin 也不得不站出来维稳局面了,他在今日转发了 Uniswap 创始人 Hayden Adams 的一条推文,并评论称:

Vitalik 称 Uniswap v2 能抵御闪电贷攻击,了解其价格预言机

「计划中的 Uniswap v2 价格预言机设计,能够抵御最近的闪电贷攻击。」

真的如此吗?

我们来看这条推文中推荐的文章《Uniswap 何时会成为一个好的预言机?》

文章作者是安全分析平台 Gauntlet 成员,斯坦福博士生 Guillermo Angeris。

以下是译文内容:


Uniswap 已成为了传统订单簿式交易所的一种非常流行的替代方案,并且它还成为了一种测量两种币之间相对价格的常用方法(通常被称为‘价格预言机’)。有点令人惊讶的是,尽管 Uniswap 的基本思想非常简单,但它的实际效果却是相当好的:在「现实世界」中,与规模大得多的交易所相比,Uniswap 似乎准确地估计了两种资产的相对价格。

Uniswap 的稳定性也是令人惊讶的,因为它似乎不受那些试操纵价格以谋取私利的不良行为者的影响。这些结果可能是 Uniswap 用户的直觉,因为他们已目睹了它在野外的表现。而对于怀疑者来说,我们的分析为「Uniswap 是一个好预言机」的条件创建了一个数学框架。在最近发表的论文(已被 Cryptoeconomic Systems 2020 接受)中,我们对 Uniswap 进行了一番分析,并希望在会议之前与更广泛的受众分享一些结果。

恒定乘积市场(Constant-product markets)

Uniswap 是恒定乘积自动做市商(通常简称为恒定乘积 AMM)的特殊例子。其思想如下:我们有一个合约(或交易所),它有一些代币「A」(包含 R 这样的代币)的储备以及一些代币 「B」(包含 R’ 这样的代币) 的储备。

一个想购买代币 「B」 Δ’ 币的代理人必须投入足够的代币「A」,以使储备乘积保持不变。换言之,如果代理人想从储备中购买代币 「B」 Δ’币,那么代理人必须将「A」代币的Δ币投入储备,以便新储备乘积与旧储备乘积相同:

Vitalik 称 Uniswap v2 能抵御闪电贷攻击,了解其价格预言机

方程(1)可以很容易地用来推导我们将要用到的量。例如,币「A」的 Uniswap 价格 mᵤ,相对于币「B」的定义,是用一定数量的币「B」购买币「A」的边际价格。

Vitalik 称 Uniswap v2 能抵御闪电贷攻击,了解其价格预言机

这相当于是用币「B」购买无限小数量币「A」的平均价格,我们可以将其绘制为价格在Δ = 0 时的斜率:

Vitalik 称 Uniswap v2 能抵御闪电贷攻击,了解其价格预言机

在下一节中,我们将把 Uniswap 的边际价格与真实市场价格联系起来(剧透:在不收费的情况下,且在一般假设下,它们是相等的)。

注:截至目前,恒定乘积公式(方程式(1))不包括任何交易费用。为了简单起见,我们将在文章的剩余部分假设这个案例是免费的,但我们在这里所做的大多数陈述与收费案例中的预期是基本一致的。

套利以及它告诉了我们什么

为了说明 Uniswap 的价格应相对于参考市场的价格,我们需要假设这些市场是如何相互作用的。

在金融数学中,一个非常常见和简单的方法,就是说不存在套利。换言之,我们会假设,不承担任何风险,只在这两个市场之间进行交易,是不可能免费赚到钱的。

因此,我们可以证明,如果 mᵤ≠m (其中 m 是参考市场价格),那么必然存在一笔足够小的交易,使得代理人可以获得正利润,这就意味着,在这个假设下 mᵤ = m。

为了证明这一点,我们假设 mᵤ > m, 然后,通过定义 mᵤ,存在一个足够小的币「A」输入,例如Δ,这样:

Vitalik 称 Uniswap v2 能抵御闪电贷攻击,了解其价格预言机

在给定币「A」的Δ的情况下,Δ’是币「B」的输出。

同样,对于市场来说,存在足够小的交易,使得 mΔ ≈ Δ’’,但是,由于Δ’’ < Δ’ (因为 mᵤ> m),我们可以很容易地通过在公开市场上以Δ'' 交易Δ来轻松获利,然后在 Uniswap 中以Δ交易Δ’,也就是说,我们的利润是正的(因为 Δ’’– Δ’ > 0)。注意,这个推导虽然不是完全严格的,但基本上遵循了数学证明。

由于我们可以在 mᵤ<m 时提出类似的声明,因此我们得出结论,在无套利条件下,mᵤ = m。 这就意味着,如果我们假设没有套利和交易费用,那么 Uniswap 的市场价格一定是等于真实的市场价格!当然,无套利假设仅在实践中大致成立,因此 Uniswap 可能会偏离真实市场价格,特别是在一个区块或少量区块内。 更为详细的分析表明,在许多市场模型下,真实的市场价格将非常接近 Uniswap 价格,基于代理的模拟验证了这一点。有关详细信息,请参见论文第 2 节。 注:类似(但较弱)的声明适用于有交易费用的情况: γm ≤ mᵤ ≤ γ⁻¹m, 其中(1-γ)是交易费的百分比。如前所述,有关详细信息,请参见论文第 2 节。

Uniswap 的优良特性

Uniswap 还有一些很好的特性,这增强了我们的信念,即它在实践当中很可能是一个好的预言机。

更具体地说: (a) 不可能仅仅通过在市场内交易币来耗尽 Uniswap 的储备; (b)向市场增加流动性是正确的做法,因为它降低了特定币的交易成本,同时增加了操纵预言机的成本。

储备金的边界

要证明没有交易能耗尽 Uniswap 的币,这是不难的。 由于 k = R’R,那么,通过 AM-GM 不等式(均值不等式)我们得到:

Vitalik 称 Uniswap v2 能抵御闪电贷攻击,了解其价格预言机

这立即意味着,可能储备金的总和,是以积 k 的平方根为界的。根据定义,每次交易后 k 总是常数,那么储量的总和总是离 0 较远的。

增加流动性降低交易成本

有几种方法可以证明这一事实,但最简单的一点是,给定币「A」的输入Δ,我们得到:

Vitalik 称 Uniswap v2 能抵御闪电贷攻击,了解其价格预言机

利用无套利情况下 R =mᵤR’的事实,则币 B 的输出等于:

Vitalik 称 Uniswap v2 能抵御闪电贷攻击,了解其价格预言机

对于固定边际价格 mᵤ,它在 R' 中增加(注意分母随着 R' 的增加而减少)。因此,可用储量越高,给定输入量的输出量就越大。这对于很多使用 Uniswap 协议的用户来说是很直观的,在更多流动性池的情况下,他们看到的滑动是较小的。

价格操纵是昂贵的(当进行大的变动时)

事实上,将 Uniswap 价格操纵到任何固定金额的成本,都与储备量与区块数量成线性关系,这在很多实际情况下可能是昂贵的,尽管我们注意到,对价格非常小或短期的扰动,会是相对便宜的。 现在,假设攻击者希望将 Uniswap mᵤ的价格操纵到一定的量 p > m (其中 m 是市场价格),那么这个单一操作(例如,对于单个区块)的成本至少是:

Vitalik 称 Uniswap v2 能抵御闪电贷攻击,了解其价格预言机

(关于推导,见论文附录 E 部分),如果我们假设 p ≥ (1+ε)m 且ε>0,那么由于 C(p) 在 p 中(p>m)是增加的,我们得到的成本至少是:

Vitalik 称 Uniswap v2 能抵御闪电贷攻击,了解其价格预言机

据我们所知

Vitalik 称 Uniswap v2 能抵御闪电贷攻击,了解其价格预言机

以及

Vitalik 称 Uniswap v2 能抵御闪电贷攻击,了解其价格预言机

其中 K 至少为 1/(32√2)。找到 C (ε)的这一下界有点棘手,相关论据在论文附录 E 中可见。如前所述,这一下界与一个常数因子相关,但这里给出的常数 K 是一个非常弱的下界(因此,这个特殊的选择应该只是作为经验法则,而不是作为一个确切数)。

事实上,成本与储备量 R 是成线性关系的,这一事实正说明了大型流动性池对稳健的重要性。另一方面,由于当ε很小时,成本是平方标度的,攻击者有可能在很长一段时间内对 Uniswap 中报告的价格进行轻微操纵,而无需花费太多费用。

例如,如果储备池的 R=1000 ETH,攻击者可通过ε=1% 操纵价格,大约为每个区块 C(.01) ≈ 0.025 ETH (这里的下界相当弱,给出 C (.01)≥ 0.002 ETH)。

请注意,这种操纵在实践中是可能存在的,因此,我们将警告说,任何协议都不应依赖这些预言机(oracle)所报告价格非常细微的变化,也不应该依赖在非常短的时间内报告的价格。

换而言之,在试图对价格进行重大调整时,操纵很快就会变得昂贵,这也是我们目前没有观察到对 Uniswap 市场进行大规模操纵的原因之一。

结论

Uniswap 虽然相对简单,但它似乎具有很好的理论性质,这表明,在实践中,它作为一个去中心化市场和价格预言机可以拥有稳定性。此外,上面的声明确实强调了在 Uniswap 中拥有大型储备池的重要性,因为所有结果都以某种方式依赖于此。

如前所述,以上只是完整论文中陈述的一小部分,对细节和证明感兴趣的读者都应该看看论文!

附录

2020 年 2 月 15 日发生 bZx 攻击时,攻击者利用 bZx 智能合约逻辑中的一个漏洞来消耗合约资金,我们要重申上述结论条件的重要性。

据我们所知,这次攻击并不依赖于预言机(oracle)操作,而是涉及到在单个区块中执行的多个事务。

特别是,如果攻击可以在一个区块中执行,那么操纵的代价就是非常小的(代价基本上只是交易费用),因此在大多数情况下是相当可行的,因为上面给出的界限并不适用。

这就强调了我们在「操纵成本高昂」部分内容所作警告的重要性:

(a) 合约依赖于 Uniswap 价格的微小变化可能是不明智的(这次攻击证明了,成本是相当便宜的); (b)合约不应在很短的一段时间内基于 Uniswap 报告的价格;

来源链接:medium.com