Uniswap协议
Uniswap协议
Uniswap 是建⽴在以太坊区块链上,⼀套不受监管的⾃动做市协议。Uniswap 和 Aave 一样有4个版本,在这篇帖子中我也只会精读并解释v2和v3的白皮书。Uniswap v1 是在以太坊区块链上的智能合约的链上系统,基于不变产品公式实现了⾃动流动性协议。
每个 Uniswap v1 配对都存储两个资产的合并储备,并为这两个资产提供流动性,从⽽保持了储备产品不能减少的不变性。交易者为交易⽀付 30 个基点的费⽤(手续费0.3%),当流动性提供者提取流动性时,他们会按照自己的流动性份额获得这些累积的费用。合约不可升级。
Uniswap v2
相比于v1,它主要有以下更新:
⽀持创建任意 ERC20/ERC20 交易对,⽽不是仅⽀持 ERC20 和 ETH 之间的配对(这个好理解,下边不解释);
提供了⼀个标准化的价格预⾔机,该价格预⾔在每个块的开头累加两种资产的相对价格;
启⽤了 " 快速交换 " 功能,⽤⼾可以⾃由接收资产并在链上的其他地⽅使⽤它们,⽽仅在交易结束时⽀付或返还这些资产(闪电贷,这里也不多解释)。
价格预言
在 v1 中,价格预言靠 资产A储备量 / 资产B储备量 计算(不考虑手续费)。如果 Uniswap 的价格偏离市场价格,套利者会进行交易,使其回归市场价格。因此,Uniswap 的价格通常可以反映市场的相对价格,这使得它可以近似用作价格预言机。但是这种方式不能安全地用作链上价格预言机,因为它极易在短时间内被大幅操纵。
v2通过在每个区块的开始记录价格来降低价格操纵的风险,具体做法是记录每个区块第一笔交易发生之前的价格,下一次的基准价格仍然是区块开始时的价格。注意,这里并不意味着下个区块开始时价格会被重置。如果攻击者在区块快结束时操控价格,下个区块开始时仍然会受到影响。
而且,v2 通过累加历史价格的时间加权和来计算更可靠的价格:在每个有交易发生的区块开头,会记录当前价格并累加,每个价格值都会乘以该价格持续的时间。累积总和反映了整个合约历史上的价格变化,可以算出时间加权均价。这样一来,攻击者很难瞬间影响整个累加器的值,因为他们的操纵只会影响极短时间的价格,而历史累加器包含长期价格信息,短时间的剧烈波动不会显著影响平均价格。
这里可能比较难理解,如果开盘价与历史均价完全无关,那算这个值有什么用?看一个具体例子:假设一个攻击者在区块最后10秒把ETH的价格从2000USD拉到4000USD,并保持到了下个区块开头,此时的开盘价是4000USD。
按照剧本,此时会有套利者迅速发现机会并交易,让ETH的价格落回2000USD。但是有个问题,套利者很难快速判断这些价格波动是市场反应,还是受到操纵。如果是正常波动,一般人也不会想着去套,这就给了攻击者更多的操控时间。所以uniswap得想办法让套利者知道这种价格是被操控了。所以就有了 TWAP,套利者一看历史均价就知道这是被操控了,价格很快会回落,就会抓紧机会交易,快速稳定价格。
Uniswap v3
在v3中,主要更新有:
加入了一种新的AMM算法;一些架构的更改;更加准确的预言机。
AMM的新特性
聚焦流动性
在早期版本中,AMM的原则是固定乘积:
它会在

在价格超出区间后,流动性提供者池中的某种资产已经被完全消耗,另一种资产则变得过剩。此时,流动性池无法再进行交易,提供的流动性“休眠”,流动性提供者也无法赚取交易手续费。当价格重新回到流动性提供者设定的价格区间内时,流动性池中的X和Y资产再次平衡,流动性提供者的流动性重新激活。
上图显示的是经典曲线,体现了反比关系。按上述描述,创建一定数量的头寸,并让某种代币短缺时让池子进入休眠:

限价订单
如果把价格区间设置较小的头⼨,表现得类似限价订单,即如果超出价格区间,头寸从完全由⼀种资产组成,转变为完全由另⼀种资产组成 (加上累积的⼿续费)。
这⾥的限价订单和传统限价订单有两点差异:价格区间的狭窄度是有限的。当价格处于该价格区间内时,限价订单会被部分执⾏。 当超出头寸的价格区间时,它需要被提取出去。否则,当价格重新落回或回穿区间,头寸又会被交易回去,资产类别将再次被逆转。

可以看出,在这种模式下,在不同的区间提供的流动性是不一样的。也很好理解,如果一笔订单不会太多地影响到池子里两种代币的平衡,就可以多交易,否则就不行,以免池子被击穿。
架构修改
v3 做了很多架构更改,其中⼀些是为了包含聚焦流动性必需的,其中⼀些是独立的改进。
一个交易对多个流动性池
在v2中每个交易对对应单⼀⼀个流动池,所有的交易都统⼀收 0.3%
的⼿续费。 v3 为每个代币交易对引入了多个流动池,每个流动池有不同的⼿续费率。所有的流动池都是由同⼀个工厂合约创建的。
无法互换的流动性
在早期版本中,赚取的⼿续费是作为流动性存在流动池中的。这意味着,即便没有追加投资,池内的流动性也会随着时间推移⽽不断增加,⼿续费是复利收益。在 v3 中,由于头寸的不可替代性(每个流动性提供者的头寸是唯一的,且与其他流动性提供者的头寸不可交换),上述方法已经不再可能,取⽽代之的,⼿续费收益是以⽀付⼿续费的代币⽅式被单独存放。这意味着每个流动性提供者需要定期提取和管理他们的手续费收益,而不会自动累积到池中的总资产中。
其实就是区分了每个流动性提供者的收益,而不是统一计算收益后再分配。
预言机升级
刚才说过了 v2 中的TWAP(时间加权平均价格预言机),v3 做了三处升级:V3 把累加器记录放在核⼼合约中,从⽽允许外部合约⽆需记录累加器的值,直接在链上计算最近⼀段时间的加权平均价格。
另外,v2 累计价格的和,但 v3 跟踪的是价格的对数 (价格的对数值) 和,从⽽允许⽤户计算时间加权价格的几何平均。
最后,在价格累加器之外,Uniswap V3 增加了⼀个流动性累加器。流动性累加器可以被其它合约使⽤,⽤于确定某个交易对的哪⼀个流动池有最可靠的时间加权平均价格。
关于几何平均
这部分涉及一些数学,过段时间更新。