相比于v1版本,v2的新特性中中最重要的一个特性是可以支持任意ERC20代币的交易对,而不是v1只支持ERC20与ETH的交易对。此外,v2提供了价格预言机功能,其原理是在每个区块开始时累计两种代币的相对价格。这将允许其他以太坊合约可以获取任意时间段内两种代币的时间加权平均价格;最后,v2还提供“闪电贷”功能,这将允许用户在链上自由借出并使用代币,只需在该交易的最后归还这些代币并支付一定手续费即可。
虽然v2的合约也是不可升级的,但是它支持在工厂合约中修改一个变量,以便允许Uniswap协议针对每笔交易收取0.05%的手续费(即0.3%的1/6)。该手续费默认关闭,但是可以在未来被打开,在打开后流动性提供者将只能获取0.25%手续费,而非0.3%。
1.参与公司联盟链的设计和开发工作
2.参与公司toB业务的智能合约和后端开发
3.参与公司公链上的dAPP项目设计与开发
$$ p_t = \frac {r^a_t}{r^b_t} \tag{1} $$
Uniswap v2通过在每个区块第一笔交易前记录累计价格实现预言机。每个价格会以时间权重记录(基于当前区块与上一次更新价格的区块的时间差)。这意味着在任意时间点,该累计价格将是此合约历史上每秒的现货价格之和。
$$ a_t = \sum_{i=1}^t p_i \tag{2} $$
为了防止攻击者在计算最新的累积价格前,通过向合约直接转账的方式来影响价格,core合约在每次交互后缓存了两种代币余额,并且使用缓存余额(而非实时余额)更新预言机价格。
为了估算在$t1$到$t2$时间段内的时间加权平均价格(TWAP),外部调用者可以分别记录t1和t2的累计价格,将t2价格减去t1价格,并除以t2-t1的时间差(需注意,合约本身不存储历史的累计价格,因此需要调用者在区间开始时调用合约,读取并保存当前的价格)。
$$ p_{t_1,t_2} = \frac{\sum_{i=t_1}^{t_2} p_i}{t_2 - t_1} = \frac{\sum_{i=1}^{t_2} p_i - \sum_{i=1}^{t_1} p_i}{t_2 - t_1} = \frac {a_{t_2} - a_{t_1}}{t_2 - t_1} \tag{3} $$
算术平均数是最常见的一种平均数,其优点是计算简单,缺点是容易受到极端数据的影响,导致均值误差;几何平均数相比算术平均数,更适用于在金融市场场景,因为金融市场价格本身是一种布朗运动