当前位置: 首页 > news >正文

Ethereum: 像Uniswap V3贡献者一样开发,克隆、编译与测试v3-core

学习以太坊智能合约开发,最好的参照莫过于Uniswap,直接克隆Uniswap/v3-core仓库并尝试运行其自带的流程,是深入其骨髓的正确姿势。这不仅可行,而且是Uniswap团队推荐的标准开发流程。
让我们一起看看,一个核心贡献者在修改代码前,会如何验证整个系统的稳定性的。在这里插入图片描述

第一步:克隆仓库与环境准备

首先,我们需要将v3-core的代码库完整地复制到本地。

  1. 克隆仓库:打开我们的终端,执行以下命令。

    git clone https://github.com/Uniswap/v3-core.git
    cd v3-core
    
  2. 安装依赖:进入项目目录后,我们会看到一个package.json文件,它定义了项目所需的所有依赖和脚本。v3-core项目使用yarn作为包管理工具(当然,使用npm通常也可以,但遵循官方习惯更佳)。

    yarn install
    

    这个命令会下载Hardhat、Ethers.js、Waffle(一个测试框架)以及其他所有开发和测试所必需的库。

第二步:编译合约

在运行任何操作之前,我们需要先将Solidity合约(.sol文件)编译成以太坊虚拟机(EVM)可以理解的字节码(Bytecode)和应用二进制接口(ABI)。

package.json中,已经为我们定义好了编译脚本。

yarn compile

执行后,Hardhat会启动,并根据hardhat.config.ts中的设置(比如Solidity编译器版本0.7.6),将contracts/目录下的所有合约编译,并将结果输出到artifacts/目录下。如果一切顺利,我们不会看到任何报错信息。

第三步:运行核心测试(关键步骤)

这才是本次探索的核心!v3-core仓库的精髓在于其严谨、全面的测试套件。这些测试不仅验证了代码的正确性,其本身就是一份“活的文档”,精确地描述了每个函数应该如何工作。

要运行测试,只需执行:

yarn test

当我们敲下回车后,背后会发生一系列自动化操作,这正是Hardhat框架的强大之处:

  1. 启动本地网络:Hardhat会在内存中瞬间启动一个临时的、全新的以太坊测试网络。这个网络是纯净的,只为我们这次测试服务,测试结束后即销毁。
  2. 部署合约:测试脚本(位于test/目录下)会自动执行,将编译好的UniswapV3Factory以及测试所需的其他辅助合约部署到这个临时的本地网络上。
  3. 执行测试用例:脚本会逐一调用合约的各种函数,比如创建流动性池(createPool)、模拟价格变动、计算手续费等,并用断言(expect)来检查返回结果是否与预期完全一致。

v3-core的测试主要聚焦于协议的数学正确性和核心逻辑,例如:

  • TickMath库:验证价格与tick索引转换的精度。
  • SwapMath库:确保兑换逻辑和滑点计算的准确性。
  • 流动性管理:测试添加/移除流动性时,代币数量计算的正确性。

下面是yarn test命令的执行流程示意图:
在这里插入图片描述

从上图可以看出,合约的部署是作为测试流程的一部分自动完成的。我们不需要手动编写部署脚本来运行测试。

实用建议:从“核心”走向“外围”

当我们成功在本地跑通v3-core的测试后,你可能会有一个疑问:SwapRouter(路由合约)和NonfungiblePositionManager(NFT仓位管理器)在哪里?为什么这里没有提供流动性和交易的脚本?

这是一个非常关键的问题!答案是:它们不在v3-core

  • v3-core:只包含最基础、最核心的合约,即工厂(UniswapV3Factory)和池子(UniswapV3Pool)以及相关的数学库。它追求的是极致的安全、精简和低Gas。
  • v3-periphery:包含了所有与用户交互的“外围”合约,如SwapRouterNonfungiblePositionManager等。这些合约负责处理用户输入的参数、打包交易、管理NFT等。

因此,我们的下一步,就是以同样的方式去探索v3-periphery仓库:https://github.com/Uniswap/v3-periphery.git。它的测试用例会更贴近用户的实际操作,比如“用1个ETH兑换尽可能多的DAI”。

结论

我们完全可以像贡献者一样,通过克隆v3-core仓库并运行其自带的yarn test命令来部署和测试现有代码。这个过程不仅能验证我们本地环境的正确性,更是深入理解Uniswap V3底层数学和核心逻辑的最佳途径。

记住,v3-core是引擎,而v3-periphery是驾驶舱。探索完核心之后,再去探索外围,我们将对整个Uniswap V3协议有一个完整而深刻的认识。

http://www.lryc.cn/news/613617.html

相关文章:

  • 【Unity Plugins】使用Magica Cloth 2 实现头发和服饰的效果模拟
  • 职责链模式应用场景与C++实现
  • 前端开发工具大全
  • 大疆前端笔试题目详解
  • PostgreSQL 强制索引:当重复数据让优化器“失明”时的解决方案
  • 实验室课程|基于SprinBoot+vue的实验室课程管理系统(源码+数据库+文档)
  • vue3 el-select 加载内容后 触发事件
  • Mysql自定义顺序查询
  • Mysql 单行函数 聚合函数
  • 六类注定烂尾的甲方软件外包必看!这类甲方不要理-优雅草卓伊凡
  • sigprocmask 函数深度解析
  • 【指南版】网络与信息安全岗位系列(三):安全运维工程师
  • Redis 分布式Session
  • Redis面试精讲 Day 16:Redis性能监控与分析工具
  • 锡膏种类多,不同的锡膏有什么区别,该如何正确选择?
  • 深入理解 ReentrantLock和AQS底层源码
  • Day09 Tlisa登录认证
  • 计算机英语详细总结
  • 类和对象(中):类的默认成员函数、构造函数、析构函数
  • MinHash算法:为什么选择Min而不是Max
  • DM数据库集群操作顺序规范
  • Linux线程学习
  • 分布式面经
  • Redis面试精讲 Day 14:Redis分片策略与一致性Hash
  • Debain12 api方式部署redis服务
  • 51c大模型~合集165
  • Tiger任务管理系统-10
  • Java 中 Object 类的解析:知识点与注意事项
  • 每日五个pyecharts可视化图表-bars(6)
  • [激光原理与应用-170]:测量仪器 - 能量型 - 光功率计的工作原理与内部功能模块组成