一、问题背景
在前面的学习当中,已经了解到Uniswap v1版本提出了AMM的基础模型,能够在此基础上完成去中心化的自动交易,同时也了解到v1版本中还存在着"价格操控"的问题juejin.cn/post/727082...
显然,Uniswap v1版本存在一些问题,v2版本的出现就是为了解决v1版本中存在的这些问题。
二、Uniswap v2新特性
-
Uniswap v1的不足
- 不能直接创建两种ERC20代币的流动性池
- 容易被操控价格
-
Uniswap v2的新特性
- 允许任意两个ERC20之间进行兑换
- 价格信息传输功能,每个区块都能基于按时间加权平均的定价方式为交易对刷新价格
- 闪电互换,或者说你可以从 Uniswap 流动性池中 "借出" 代币、用于与任意的外部服务交互、然后 还清 你的初始贷款,所有操作都要放在一笔交易内。
- 支持不标准的 ERC20 代币
目前Uniswap也推出了v3,v4版本,未来应该也会有更多的规划,新的功能和优化很多,本文聚焦的是Uniswap v2版本如何解决AMM的价格操控问题。
三、Uniswap V2中抗价格操控的措施
1. 查询市场价格
-
在每个区块的第一笔交易开始确认前,先对每个pair进行价格查询。这么做的好处是让操控价格的成本变得昂贵了,这个价格是由上一个区块的最后一笔交易决定的,如果要操控它,操纵者有两个选择:
- 一个是赶在上一个区块的最后做一笔背离市场价的交易(通常要拔高价格才能方便后面套利),这会让操纵者额外付出更大的代价。
- 另一个是办法就是在做完上面说的操控外,立刻做一笔回血操作以弥补前面拔高交易所支付的成本。这就需要掌握连续两次的出块权利,以便在第二个区块中收回前一个区块中付出的资金成本。
思考:通过增加每次查询市场价格的步骤,可以增加操纵者操控价格套利的成本,但如果可套利的空间比操控价格的成本要高的情况下,还是比较容易操控,因此从防操控手段上,还需要加强。
2.引入TWAP概念
- TWAP (Time-weighted average prices), 时间加权平均价格。
- 通过官方文档中的示意图,能很清晰地了解到TWAP的概念。
- 为了介绍TWAP,首先引入一个"累计价格"变量。以区块为单位来看,第一个区块的累计价格值为0,第一个区块末尾的价格为10.2,那么第二个区块开始的价格等于上一个区块结束时的价格,即也是10.2,那么第二个区块的累积价格就等于:上一个区块的累计价格+第二个区块开始时的价格*两个区块间隔时间, 在下面的示意图中,第二个区块的累计价格变量计算如下:
js
priceCumulative_1=priceCumulative_0+Price_1*timestamp_1 = 0+(10.2*7)=71.4
在清楚了"累计价格"概念后,TWAP的概念就容易理解了。TWAP的值就是观测时间范围内的累计价格的平均值。
js
TWAP= (priceCumulative_end - priceCumulative_start)/(timestamp_end - timestamp_start)
3.关于TWAP的几点说明
- 采样时间单位可以是几分钟,比如10分钟的TWAP就是每隔10分钟的采样值,也可以是一周的采样值
- 引入TWAP后,操纵价格的成本会随着资金池的LP流动性的变大而变大,同时也会随着TWAP的采样时间间隔增大而变大。
- 攻击的成本相对容易估计。以采用1小时的TWAP的参数为例,使得兑换价格上涨5%的成本大致等于每个区块交易价格上涨5%,持续一小时所带来资金和手续费的损失。
四、参考资料
- Uniswap官方文档:docs.uniswap.org/contracts/v...
- 《Uniswap V1/V2/V3 AMM做市全面解析》www.163.com/dy/article/...