Solidity Uniswap V2 价格预言机

2024-03-10 02:44

本文主要是介绍Solidity Uniswap V2 价格预言机,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        预言机是连接区块链与链下服务的桥梁,这样就可以从智能合约中查询现实世界的数据。Chainlink 是最大的oracle网络之一,创建于 2017 年,如今已成为许多 DeFi 应用的重要组成部分。https://github.com/XuHugo/solidityproject

        Uniswap 虽然是链上应用,但也可以充当oracle。交易者经常使用的每个 Uniswap pair合约也吸引着套利者,他们通过尽量缩小交易所之间的价格差异来赚钱。套利者使 Uniswap 的价格尽可能接近中心化交易所的价格,这也可以看作是将中心化交易所的价格反馈到区块链上。为什么不利用这一事实将pair合约变成价格oracle呢?Uniswap V2 就是这么做的。

        在 Uniswap V2 中,价格oracle提供的价格被称为时间加权平均价格(TWAP)。它基本上可以获得两个时间点之间的平均价格。为了做到这一点,合约存储了累计价格:在每次交换之前,它都会计算当前的边际价格(不包括费用),然后乘以上次交换后的秒数,再把这个数字加到前一个数字上。

我在上一段提到了边际价格,这只是两个reserve的关系:

        对于价格oracle功能,Uniswap V2 使用边际价格,它不包括滑点和交换费,也不取决于交换量。

        由于 Solidity 不支持浮点除法,计算这种价格可能比较麻烦:例如,如果两个reserve的比率是 2/3, 那么价格是0;在计算边际价格时,我们需要提高精确度,Unsiwap V2 为此使用了 UQ112.112 数字。

        UQ112.112 本质上是一个小数部分使用 112 位,整数部分使用 112 位的数字。选择 112 位是为了使储备状态变量的存储更优化,这也是变量使用 uint112 类型的原因。另一方面,reserve存储为 UQ112.112 数字的整数部分,这就是为什么在计算价格前要乘以 2**112 的原因。详情请查看 UQ112x112.sol,非常简单。

        让我们来实现价格累积。我们只需要添加一个状态变量:

uint32 private blockTimestampLast;

        它将存储最后一次交换的时间戳。然后我们需要修改储备更新函数:

function _update(uint256 balance0,uint256 balance1,uint112 reserve0_,uint112 reserve1_) private {...unchecked {uint32 timeElapsed = uint32(block.timestamp) - blockTimestampLast;if (timeElapsed > 0 && reserve0_ > 0 && reserve1_ > 0) {price0CumulativeLast +=uint256(UQ112x112.encode(reserve1_).uqdiv(reserve0_)) *timeElapsed;price1CumulativeLast +=uint256(UQ112x112.encode(reserve0_).uqdiv(reserve1_)) *timeElapsed;}}reserve0 = uint112(balance0);reserve1 = uint112(balance1);blockTimestampLast = uint32(block.timestamp);...}

UQ112x112.encode 将 uint112 值乘以 2**112,使其成为 uint224 值。然后,将其除以其他reserve,再乘以 timeElapsed。结果会与当前存储的值相加,这就是累积值。

这篇关于Solidity Uniswap V2 价格预言机的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/792767

相关文章

野火霸天虎V2学习记录

文章目录 嵌入式开发常识汇总1、嵌入式Linux和stm32之间的区别和联系2、stm32程序下载方式3、Keil5安装芯片包4、芯片封装种类5、STM32命名6、数据手册和参考手册7、什么是寄存器、寄存器映射和内存映射8、芯片引脚顺序9、stm32芯片里有什么10、存储器空间的划分11、如何理解寄存器说明12、如何操作寄存器的某一位 STM32F407芯片学习1、stm32单片机启动流程s

翻译Houdini官方对UE4新版插件的介绍:Houdini Engine for Unreal - V2

原视频:Houdini For Unreal - YouTube 目录 介绍0. 总览1. 简介HoudiniEngine2. UE4的HoudiniEngine - 第二版为什么要做“第二版” ?What's new? - 核心What's new? - 输出(1)What's new? - 输出(2)What's new? - 输入What's new? - 参数What's new?

Jaxb - com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 8 counts of IllegalAnnotationExcepti

一、异常 com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 8 counts of IllegalAnnotationExceptions类的两个属性具有相同名称 "orderName"his problem is related to the following location:at public java.lang.Stri

MapReduce V2---Yarn的架构及其执行原理

1. MRv1的局限性    1):扩展性差            MRv1中,Jobracker同事兼备了资源管理和作业控制(job的生命周期管理(task调度,跟踪task过程状态,task处理容错)两个功能。     单个的jobtracker无论在内存还是其他资源方面总存在瓶颈,在伸缩性、资源利用率、运行除mapreduce的其他任务等方面都会有限制。 MRv2 Y

品牌线上价格监测的创新之路

在当今竞争激烈的电商时代,品牌的价格监测至关重要。而力维网络以其独特的创新之举,为品牌控价开辟了新的天地。 传统的价格监测往往只关注页面价,却忽略了真正影响消费者购买决策的到手价。力维网络深刻认识到这一问题,凭借自身研究的数据监测系统,开启了一场创新变革。 首先,在数据采集方面,力维网络确保到手价的准确性。不同平台的优惠信息各异,采集字段也存在差异。但力维网络迎难而上,力求采集的促销信息全

golang中使用aws-sdk-go-v2

1.aws-sdk-go-v2常用api 1.引入所需包     import ("context""fmt""log""os""path/filepath""sync""time""github.com/aws/aws-sdk-go-v2/aws""github.com/aws/aws-sdk-go-v2/config""github.com/aws/aws-sdk-go-v2/crede

AttributeError: module ‘tensorflow_core._api.v2.config’ has no attribute ‘experimental_list_devices’

找到 tensorflow_backend.py 源文件的第506行 _LOCAL_DEVICES = tf.config.experimental_list_devices() 改成 devices = tf.config.list_logical_devices()_LOCAL_DEVICES = [x.name for x in devices]

18、Gemini-Pentest-v2

难度 中 目标 root权限 一个flag 靶机启动环境为VMware kali 192.168.152.56 靶机 192.168.152.63 信息收集 web测试 访问80端口 上面介绍了一下这个系统是一个内部系统,让员工查看他们的个人资料还可以导出为PDF 页面还有一个链接是UserList可以访问但是页面什么都没有显示,怀疑可能是没有权限或者需要什么参

使用deekpseek v2开发中国象棋游戏

使用AI可以完成简单程序(如:五子棋),甚至都不要调试即可以运行,但逻辑规则复杂的程序就需要反复的调整,修改运行BUG,优化运行性能。(如:中国象棋,支持提示目标落子位置,并要求使用AI算法自动对弈)。 下面是经过反复调整后(N多次),得到的中国象棋游戏的js代码。 <!DOCTYPE html><html lang="en"><head><meta charset="

以太坊区块链 Solidity solc是什么

Solidity与Java类似。代码写好后,都需要通过编译器将代码转换成二进制。 在Java中,编译器是Javac,对于Solidity,是solc。 生成后的二进制代码,会放到虚拟机里执行。 Java代码在Java虚拟机(JVM)中执行,在Solidity中,是一个区块链上的虚拟机EVM。