月亮链 月亮链
Ctrl+D收藏月亮链

RICE:价格预言机的使用总结(二):UniswapV2篇_SWAP

作者:

时间:1900/1/1 0:00:00

该系列的前一篇文章介绍了 Chainlink 价格预言机的使用,其目前也被大部分 DeFi 应用所使用,但依然存在局限性。首先是所支持的 Token 的覆盖率还不全,尤其是长尾资产,大多还未支持,比如 SHIB,目前只在 BSC 主网有 SHIB/USD 的 Price Feed,而其它网络的都还没有,连 Ethereum 的都还没支持。其次,有些资产的偏差阈值较大,价格更新也比较慢,可能长达十几二十个小时才会更新价格,比如 BNT。

这时候就需要考虑其它价格预言机了,而 UniswapV2 和 UniswapV3 都是不错的选择。

本篇先来聊聊如何使用 UniswapV2 作为价格预言机。

UniswapV2 使用的价格预言机称为 TWAP(Time-Weighted Average Price),即时间加权平均价格。不同于链下聚合的 Chainlink 取自多个不同交易所的数据作为数据源,TWAP 的数据源来自于 Uniswap 自身的交易数据,价格的计算也都是在链上执行的,因此,TWAP 属于链上预言机。

TWAP 的原理比较简单,首先,在 UniswapV2Pair 合约中,会存储两个变量 price0CumulativeLast 和 price1CumulativeLast,在 _update() 函数中会更新这两个变量,其相关代码如下:

去中心化价格预言机 NEST Protocol v3.5已升级成功:1月19日消息,去中心化价格预言机NESTProtocol3.5版本已于今天16点在以太坊主网升级成功,此次升级意味着NESTProtocol正式进入通缩和PoS时代。[2021/1/19 16:31:28]

price0CumulativeLast 和 price1CumulativeLast 分别记录了 token0 和 token1 的累计价格。所谓累计价格,其代表的是整个合约历史中每一秒的 Uniswap 价格总和。且只会在每个区块第一笔交易时执行累加计算,累加的值不是当前区块的第一笔交易的价格,而是在这之前的最后一笔交易的价格,所以至少也是上个区块的价格。取自之前区块的价格,可以大大提高操控价格的成本,所以自然也提高了安全性。

如上图所示,合约的第一个区块为 Block 122,这时候,价格和时间差都为 0,所以累计价格也为 ?0。到了下一个区块 Block 123,这时候取自上个区块的最后一口价格 10.2,且经过的时间差为 7,因此就可以计算出累计价格 priceCumulative = 10.2 * 7 = 71.4。再到下个区块 Block 124,取自上一口价格 10.3,两个区块间的时间差为 8,那此时的累计价格就变成了 71.4 + (10.3 * 8) = 153.8。Block 125 的时候也同理,上口价格为 10.5,区块时间差为 5,所以最新的累计价格就变成了 153.8 + (10.5 * 5) = 206.3。

John McAfee三年前关于BTC的价格预测未能实现:三年前,加密货币倡导者、杀软件之父John McAfee在推特预测BTC将在三年内价值超过50万美元。不过这一预言未能实现,目前比特币交易价格仍低于1万美元,这是过去三个月来非常强劲的阻力位。或许人们可以质疑之前反弹的有效性,因为比特币现在比以往任何时候都更具流动性,越来越多的机构投资者蜂拥而入,需求稳步上升,而山寨币似乎也在做出积极反应。比特币在市场的主导地位正在被山寨币市场动摇,在预期的反弹之后,比特币可能会进一步下跌。

有一些潜在的基本面不利于比特币及其预期的下一波走势。首先,新冠病大流行给企业和人们的日常活动带来压力。因此,看到更多人投资高度波动的市场和被认为有风险的市场(如加密资产)的可能性非常小。其次,比特币是基于PoW机制开采,在监管机构推动清洁能源项目之际,比特币因高能耗而受到影响。另一个可能压制比特币价格的主要原因是交易成本高,以及交易活动大量涌入导致处理速度慢。

McAfee的案例表明,价格预测,尤其是加密行业的价格预测无法得到保证,因为没有人能单独控制市场。币安CEO评论称,“这就是为什么我不做价格预测。”(Zycrypto)[2020/7/18]

有了这个基础之后,就可以计算 TWAP 了。

动态 | Max Keiser将BTC价格预期提高至40万美元:华尔街金融分析师、比特币支持者Max Keiser近期在节目中表示,他“正式”将其对比特币的目标价格提高到40万美元:“这是八年来我第一次把它提高到40万美元。这是我的最新正式目标。”(U.Today)[2020/2/17]

计算 TWAP 的原理也是非常简单,如上图所示,这是计算时间间隔为 1 小时的 TWAP,取自开始和结束时的累计价格和两区块当时的时间戳,两者的累计价格相减,再除以两者之间的时间差,就算出这 1 小时内的 TWAP 价格了。

这是 TWAP 最简单的计算方式,也称为固定时间窗口的 TWAP。下面来讲讲具体如何实现。

Uniswap 官方也有提供了一个示例代码来计算固定时间窗口的 TWAP,其代码放在 v2-periphery 项目中:

https://github.com/Uniswap/v2-periphery/blob/master/contracts/examples/ExampleOracleSimple.sol

该示例代码也比较简单,我们直接贴上代码看看:

PERIOD 指定为了 24 小时,说明这个示例计算 TWAP 的固定时间窗口为 24 小时,即每隔 24 小时才更新一次价格。

动态 | 纳斯达克希望在内部来源报告中添加加密货币价格预测工具:9月11日消息,全球第二大证券交易所纳斯达克计划在其分析中心增加工具,帮助用户预测加密货币的价格走势。纳斯达克的分析中心在去年推出使用自然语言处理(NLP)和机器学习来分析社交媒体网站上的信息。与纳斯达克合作的消息人士表示,新的加密功能目前正处于测试阶段,或将于11月发布。[2018/9/11]

该示例也只保存一个交易对的价格,即 token0-token1 的价格。price0Average 和 price1Average 分别就是 token0 和 token1 的 TWAP 价格。比如,token0 为 WETH,token1 为 USDC,那 price0Average 就是 WETH 对 USDC 的价格,而 price1Average 则是 USDC 对 WETH 的价格。

update() 函数就是更新 TWAP 价格的函数,这一般需要链下程序的定时任务来触发,按照这个示例的话,就是链下的定时任务需要每隔 24 小时就定时触发调用 update() 函数。

update() 函数的实现逻辑也和上面所述的公式一致:

读取出当前最新的累计价格和当前的时间戳;

计算出当前时间和上一次更新价格时的时间差 timeElapsed,要求该时间差需要达 24 小时;

比特币价格预言大神 “Luka_Magnotta” :比特币价格在2021年达到100万美元:国外网友发现比特币价格预言大神,他们发现一名叫做“Luka_Magnotta”的人在2013年8月就登陆Reddit论坛发表了对比特币价格的精准预测,这位“Luka_Magnotta”称比特币会在2017年突破1万美元,2019年突破10万美元,2021年达到100万美元。有人估计这位“Luka_Magnotta”真身是诺贝尔奖得主,经济学家米尔顿·弗里德曼(Milton Friedman),他早在1999年就预言了数字货币现象。[2017/12/25]

根据公式 TWAP = (priceCumulative - priceCumulativeLast) / timeElapsed 计算得到最新的 TWAP,即 priceAverage;

更新 priceCumulativeLast 和 blockTimestampLast 为当前最新的累计价格和时间戳。

不过,有一点需要注意,因为 priceCumulative 本身计算存储时是做了左移 112 位的操作的,所以计算所得的 priceAverage 也是左移了 112 位的。

consult() 函数则可查询出用 TWAP 价格计算可兑换的数量。比如,token0 为 WETH,token1 为 USDC,假设 WETH 的价格为 3000 USDC,查询 consult() 时,若传入的参数 token 为 token0 的地址,amountIn 为 2,那输出的 amountOut 则为 3000 * 2 = 6000,可理解为若支付 2 WETH,就可根据价格换算成 6000 USDC。

固定时间窗口 TWAP 的原理和实现,比较简单,但其最大的不足就是价格变化不够平滑,时间窗口越长,价格变化就可能会越陡峭。因此,在实际应用中,更多其实是用滑动时间窗口的 TWAP。

所谓滑动时间窗口 TWAP,就是说,计算 TWAP 的时间窗口并非固定的,而是滑动的。这种算法的主要原理就是将时间窗口划分为多个时间片段,每过一个时间片段,时间窗口就会往右滑动一格,如下图所示:

上图所示的时间窗口为 1 小时,划分为了 6 个时间片段,每个时间片段则为 10 分钟。那每过 10 分钟,整个时间窗口就会往右滑动一格。而计算 TWAP 时的公式则没有变,依然还是取自时间窗口的起点和终点。如果时间窗口为 24 小时,按照固定时间窗口算法,每隔 24 小时 TWAP 价格才会更新,但使用滑动时间窗口算法后,假设时间片段为 1 小时,则 TWAP 价格是每隔 1 小时就会更新。

Uniswap 官方也同样提供了这种滑动时间窗口 TWAP 实现的示例代码,其 Github 地址为:

https://github.com/Uniswap/v2-periphery/blob/master/contracts/examples/ExampleSlidingWindowOracle.sol

我们也贴上代码看看:

要实现滑动时间窗口算法,就需要将时间分段,还需要保存每个时间段的 priceCumulative。在这实现的示例代码中,定义了结构体 Observation,用来保存每个时间片段的数据,包括两个 token 的 priceCumulative 和记录的时间点 timestamp。还定义了 pairObservations 用来存储每个 pair 的 Observation 数组,而数组实际的长度取决于将整个时间窗口划分为多少个时间片段。

windowSize 表示时间窗口大小,比如 24 小时,granularity 是划分的时间片段数量,比如 24 段,periodSize 则是每时间片段的大小,比如 1 小时,是由 windowSize / granularity 计算所得。这几个值都在构造函数中进行了初始化。

触发 update() 函数则更新存储最新时间片段的 observation,如时间片段大小为 1 小时,即每隔 1 小时就要触发 update() 函数一次。因为这个示例中是支持多个 pair 的,所以 update() 时需要指定所要更新的两个 token。

而查询当前 TWAP 价格的计算就在 consult() 函数里实现了。首先,先获取到当前时间窗口里的第一个时间片段的 observation,也算出当前时间与第一个 observation 时间的时间差,且读取出当前最新的 priceCumulative,之后就在 computeAmountOut() 函数里计算得到最新的 TWAP 价格 priceAverage,且根据 amountIn 算出了 amountOut 并返回。

本文我们主要介绍了被广泛使用的一种链上预言机 TWAP(时间加权平均价格),且介绍了固定时间窗口和滑点时间窗口两种算法的 TWAP。虽然,TWAP 是由 Uniswap 推出的,但因为很多其他 DEX 也采用了和 Uniswap 一样的底层实现,如 SushiSwap、PancakeSwap 等,所以这些 DEX 也可以用同样的算法计算出对应的 TWAP。

但使用 UniswapV2 的 TWAP,其主要缺陷就是需要链下程序定时触发 update() 函数,存在维护成本。UniswapV3 的 TWAP 则解决了这个问题,下一篇会来聊聊其具体是如何实现的。

文章首发于「Keegan小钢」公众号:

https://mp.weixin.qq.com/s?__biz=MzA5OTI1NDE0Mw==&mid=2652494441&idx=1&sn=57a97690390b93770c5a906dce4157c8&chksm=8b685079bc1fd96f9ab60cc1b41b8642abf807a13a37c12f05a280be2e03f3a9288a047b5739&token=1584634265&lang=zh_CN#rd

标签:RICEPRIICESWAPgoldricetokenPrime-XIIceBreak-RAdaSwap

芝麻开门交易所下载热门资讯
WEB:Web3辩论:好VS坏 中心化VS去中心化_IPWeb

来源公号:老雅痞在过去的几周里,一场辩论已经成为网络话语的一部分。Web3辩论。 Web3辩论也许从2008年中本聪发表白皮书的那一天起,就有支持和反对加密货币的人.

1900/1/1 0:00:00
CRV:iZUMi Research:万字报告带你读懂 DeFi 流动性现状以及展望未来(3)_CUR

03?DEX 对流动性效率的提升——底层交易的流动性资本效率在最基础 Uniswap V2 的 x*y=K 恒定乘积 AMM 机制的基础之上,衍生出了众多升级版本的 AMM 机制.

1900/1/1 0:00:00
NFT:晚间必读5篇 | 腾讯、阿里、字节 你想去谁的元宇宙?_元宇宙

1.学习区块链、DeFi、NFT的资源合辑本文收集了一些加深对区块链、DeFi、NFT、DAO 和其他区块链原生主题的理解的资源和见解.

1900/1/1 0:00:00
NFT:NFT平台如何落实作品权利审查机制?_Shibarium DAO

2022年4月20日,原告奇策公司与被告某科技公司侵害作品信息网络传播权纠纷一案依法公开审理,并当庭宣判,判决被告立即删除涉案平台上发布的“胖虎打疫苗” NFT作品.

1900/1/1 0:00:00
区块链:肖风:元宇宙最后究竟会长成什么样?_WEB3币

不要错过区块链,不要旁观元宇宙 肖风 | 万向区块链董事长从最基础的网络技术发展趋势的角度来看,互联网确实是不断向着去中心化去演变的.

1900/1/1 0:00:00
区块链:金色早报 | 数字人民币跨境支付会注重零售:不是轻易当武器来用_OIN

头条▌周小川:数字人民币跨境支付会注重零售,不是轻易当武器来用4月16日消息,中国金融学会会长,中国人民银行原行长周小川在2022清华五道口全球金融论坛表示,数字货币.

1900/1/1 0:00:00