Solidity Uniswap V2 价格预言机

news2024/10/2 20:37:59

        预言机是连接区块链与链下服务的桥梁,这样就可以从智能合约中查询现实世界的数据。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。结果会与当前存储的值相加,这就是累积值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1505179.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

matlab双目相机标定-需要什么参数、怎么获得

相机标定目的:获得相机内参、外参、畸变系数,摄像头的内参(f,1/dx,1/dy,cx,cy)、畸变参数(k1,k2,k3,p1,p1)和外参(R,t),用于接下来的双目校正和深度图生成从而实现二维到三维的转换。 相机标定方法:opencv 双目相机标定以及立体…

Objects类 --java学习笔记

Objects类 Objects是一个工具类,提供了很多操作对象的静态方法给我们使用 Objects类常用的三个方法 Objects.equals 比直接equals更安全,因为Objects.equals里面做了非空校验 Objects.isNull(A) 等价于 A null Objects.non…

docker部署在线聊天室平台Fiora

Fiora 是一款开源免费的在线聊天系统 https://github.com/yinxin630/fiora 部署 创建docker网络 docker network create fiora-networkdocker-compose部署 vim docker-compose.yml version: 3 services:fiora_redis:image: rediscontainer_name: fiora_redisrestart: alway…

Springboot+vue的医院药品管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频: Springbootvue的医院药品管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。 项目介绍: 采用M(model)V(view)C(controller&#xff09…

AWS的CISO:GenAI只是一个工具,不是万能钥匙

根据CrowdStrike的年度全球威胁报告,尽管研究人员预计人工智能将放大对防御者和攻击者的影响,但威胁参与者在其行动中使用人工智能的程度有限。该公司上个月在报告中表示:“在整个2023年,很少观察到GenAI支持恶意计算机网络运营的开发和/或执行。” 对于GenAI在网络安全中的…

关于天线综合3(傅里叶变换法)

傅里叶变换法 如果令fd(w)为期望方向图,那么对应的电流分布id(s)为 但是,通常它的范围是无穷大的,所以我们通过近似解来截断id(s)如下 根据傅里叶变化,电流就会产生一个近似方向图f(w)。扩展至整个s域的电流id(s)产生准确的方向图…

CentOS 7.6安装部署Seafile服务器

今天飞飞和你们分享CentOS 7.6上安装基于MySQL/MariaDB的Seafile服务器的方法,包括下载和安装7.0.5版本、配置数据库、启动服务器等步骤。安装成功后,需要通过nginx反向代理才能访问seafile服务。 通过预编译好的安装包来安装并运行基于 MySQL/MariaDB …

【网站项目】109网上手机商城

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

【NR 定位】3GPP NR Positioning 5G定位标准解读(七)- GNSS定位方法

前言 3GPP NR Positioning 5G定位标准:3GPP TS 38.305 V18 3GPP 标准网址:Directory Listing /ftp/ 【NR 定位】3GPP NR Positioning 5G定位标准解读(一)-CSDN博客 【NR 定位】3GPP NR Positioning 5G定位标准解读(…

L2-2 老板的作息表(Python)

作者 陈越 单位 浙江大学 新浪微博上有人发了某老板的作息时间表,表示其每天 4:30 就起床了。但立刻有眼尖的网友问:这时间表不完整啊,早上九点到下午一点干啥了? 本题就请你编写程序,检查任意一张时间表&#xff0c…

excel中去除公式,仅保留值

1.单个单元格去除公式 双击单元格,按F9. 2.批量去除公式 选中列然后复制,选择性粘贴,选值粘贴

边缘计算平台EdgeGallery前端源码分析03-应用测试认证平台

1 首页 &#xff08;1&#xff09;Nav导航栏 代码路径 atp\atp-fe\src\components\layout\Nav.vue &#xff08;2&#xff09;Banner图片区域 代码路径 atp\atp-fe\src\pages\home\Home.vue 点击详情跳转到 测试用例管理 页面&#xff08;后面分析&#xff09; <div cl…

交易平台开发:构建安全/高效/用户友好的在线交易生态圈

在数字化浪潮的推动下&#xff0c;农产品现货大宗商品撮合交易平台已成为连接全球买家与卖家的核心枢纽。随着电子商务的飞速发展&#xff0c;一个安全、高效、用户友好的交易平台对于促进交易、提升用户体验和增加用户黏性至关重要。本文将深入探讨交易平台开发的关键要素&…

ARM中多寄存内存访问概念和栈的种类和应用

多寄存器内存访问指令 多寄存器内存访问指令 MOV R1,#1 MOV R2,#2 MOV R3,#3 MOV R4,#4 MOV R11,#0x40000020 STM R11,{R1-R4} 将R1-R4寄存器中的数据存储到内存以R11为起始地址的内存中 LDM R11,{R6-R9} 将内存中以R11为起始地址的数据读取到R6-R9寄存器中 当寄存器…

一劳永逸的方法解决:LNK1168无法打开 xxx.exe 进行写入 报错问题

这种错误的产生原因&#xff1a; 运行程序退出不是按正常流退出&#xff0c;是按窗口右上角的 “X” 来关闭程序&#xff0c;但是后台的xxx.exe控制台程序还在运行&#xff1b;修改程序的代码后再运行&#xff0c;就会报LNK1168的错误&#xff1b; 报错示例&#xff1a; 解决方…

第十七章垃圾回收器

第十七章垃圾回收器 文章目录 第十七章垃圾回收器1. GC分类与性能指标1.1 垃圾回收器概述1.2 垃圾回收器分类1.3 评估GC的性能指标吞吐量暂停时间吞吐量VS暂停时间 2. 不同的垃圾回收器概述七种经典垃圾回收器七种经典收集器与垃圾分代之间的关系垃圾收集器的组合关系如何查看默…

详细讲解Xilinx DDR3 的MIG IP生成步骤及参数含义

前几篇文章讲解了SDRAM到DDR3各自的变化&#xff0c;本文讲解如何使用DDR3&#xff0c;在Altera的Cyclone IV开发板上一般会使用SDRAM作为存储数据的芯片&#xff0c;而Xilinx的S6和7000系列一般使用DDR3作为存储数据的芯片。 从SDRAM芯片内部结构分析其原理&#xff0c;从内部…

【大模型系列】图文对齐(CLIP/TinyCLIP/GLIP)

文章目录 1 CLIP(ICML2021&#xff0c;OpenAI)1.1 预训练阶段1.2 推理阶段1.3 CLIP的下游应用1.3.1 ViLD&#xff1a;zero-shot目标检测(2022, Google)1.3.2 图像检索Image Retrival1.3.3 HairCLIP&#xff1a;图像编辑Image Editing(2022&#xff0c;中科大) 2 TinyCLIP(2023,…

【AI视野·今日Robot 机器人论文速览 第八十三期】Wed, 6 Mar 2024

AI视野今日CS.Robotics 机器人学论文速览 Wed, 6 Mar 2024 Totally 30 papers &#x1f449;上期速览✈更多精彩请移步主页 Interesting: &#x1f4da;SpaceHopper,外星探索多功能三足机器人 (from Robotic Systems Lab, ETH Zurich) Daily Robotics Papers A Safety-Criti…

RAG综述 《Retrieval-Augmented Generation for Large Language Models: A Survey》笔记

文章目录 概述RAG 的定义RAG的框架Naive RAGAdvanced RAGpre-retrieval processRetrievalpost-retrieval process Modular RAG RetrievalEnhancing Semantic Representationschunk 优化 微调向量模型Aligning Queries and DocumentsAligning Retriever and LLM GenerationAugme…