本系列文章将带您从零开始深入理解和构建 UniswapV2 去中心化交易所,通过实际编码实现来掌握自动做市商(AMM)机制的核心原理。
本系列文章将带您从零开始深入理解和构建 UniswapV2 去中心化交易所,通过实际编码实现来掌握自动做市商(AMM)机制的核心原理。
Uniswap 是运行在以太坊区块链上的去中心化交易所,具有完全自动化、无需托管、去中心化的特点。其发展经历了三个重要阶段:
本系列聚焦于 V2 版本的实现,相较于 V1 系列文章,我们将更注重架构设计和工程实践,而不会过多涉及常数乘积公式的数学推导。如果您需要了解相关数学原理,建议先阅读 V1 系列文章。
在本系列中,我们选择 Foundry 作为主要开发和测试框架,原因如下:
我们使用 OpenZeppelin 而不是 solmate 作为 ERC20 的基础实现:
// 使用 OpenZeppelin 的成熟实现
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
选择理由:
相比 2020 年的原始实现,我们的版本包含以下现代化特性:
UniswapV2 的架构基于流动性池化的核心思想:
用户资金 → 流动性池 → 去中心化交易 → 手续费分享
UniswapV2Core/
├── UniswapV2Factory.sol # 工厂合约,创建和管理交易对
├── UniswapV2Pair.sol # 交易对合约,实现核心交易逻辑
└── UniswapV2ERC20.sol # LP代币实现,支持EIP-2612
UniswapV2Factory
UniswapV2Pair
UniswapV2ERC20
UniswapV2Periphery/
├── UniswapV2Router.sol # 路由合约,用户交互的主要入口
├── UniswapV2Library.sol # 工具库,封装常用计算函数
└── WETH.sol # 以太坊包装合约
UniswapV2Router
UniswapV2Library
创建项目目录并初始化 Foundry 开发环境:
mkdir uniswapv2_tech && cd $_
forge init --no-git
安装所需的合约库:
# 安装 OpenZeppelin 合约库
forge install OpenZeppelin/openzeppelin-contracts
清理示例文件并建立标准项目结构:
# 移除默认示例文件
rm src/Counter.sol script/Counter.s.sol test/Counter.t.sol
# 创建标准目录结构
mkdir -p src/{core,periphery} test/{core,periphery} script docs
最终项目结构:
uniswapv2_tech/
├── .gitignore
├── README.md
├── foundry.toml # Foundry 配置文件
├── src/ # 合约源码目录
│ ├── core/ # 核心合约
│ └── periphery/ # 外围合约
├── test/ # 测试文件目录
│ ├── core/
│ └── periphery/
├── script/ # 部署脚本目录
├── docs/ # 技术文档目录
└── lib/ # 依赖库目录
├── openzeppelin-contracts/
└── forge-std/
编辑 foundry.toml
配置最新的 Solidity 版本和优化选项:
[profile.default]
src = "src"
out = "out"
libs = ["lib"]
solc-version = "0.8.30"
# 开启优化器以减少 Gas 消耗
optimizer = true
optimizer_runs = 200
# 测试配置
verbosity = 2
# 格式化配置
[fmt]
line_length = 100
tab_width = 4
bracket_spacing = true
使用以下命令验证环境搭建是否成功:
# 检查 Foundry 版本
forge --version
# 编译项目(此时应该无错误)
forge build
# 运行测试(此时会提示无测试文件)
forge test
UniswapV2Pair
addLiquidity
MINIMUM_LIQUIDITY
Transfer
https://github.com/RyanWeb31110/uniswapv2_tech
建议读者克隆项目代码,跟随教程进行实践学习,通过动手编写代码来深入理解 UniswapV2 的设计精髓。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!