先看工厂如何排序代币、创建交易对和维护双向映射,再理解 Pair 合约是从哪里来的。
本文由个人备赛旧笔记整理,整理日期为 2026-11-03。命令、输出和测试记录属于当时的实验环境;本文未重新搭建整套环境验证。
阅读前先确认
本文包含学习时摘录的上游代码,来源为 Uniswap v2-core。复用时请查看上游许可;相关接口、库和 Pair 合约需从同一版本取得。
Uniswap V2 工厂合约
工厂合约代码及其分析
1 | pragma solidity =0.5.16; |
1. 合约基础结构
状态变量:
1 | address public feeTo; // 协议费用接收地址 |
2. 核心功能:createPair
输入验证
1 | require(tokenA != tokenB, 'UniswapV2: IDENTICAL_ADDRESSES'); |
关键设计:
- 代币地址标准化排序(token0 < token1)
- 防止重复创建相同交易对
- 零地址检查
CREATE2 确定性部署
1 | bytes memory bytecode = type(UniswapV2Pair).creationCode; |
CREATE2 的优势:
- 相同代币对总是部署到相同地址
- 便于前端预测交易对地址
- 节省 Gas(避免重复部署)
初始化交易对
1 | IUniswapV2Pair(pair).initialize(token0, token1); |
更新状态
1 | getPair[token0][token1] = pair; |
3. 费用管理机制
设置协议费用接收地址
1 | function setFeeTo(address _feeTo) external { |
转移权限管理
1 | function setFeeToSetter(address _feeToSetter) external { |
权限模型:
- 只有
feeToSetter可以设置feeTo feeToSetter可以将权限转移给其他地址
4. 查询功能
获取交易对数量
1 | function allPairsLength() external view returns (uint) { |
通过代币地址查询交易对
1 | // 通过 public mapping 自动生成查询函数 |
5. 核心设计特点
确定性地址计算
1 | // 交易对地址计算公式: |
双向映射支持
1 | getPair[token0][token1] = pair; |
最小权限原则
- 只有工厂合约可以创建交易对
- 只有
feeToSetter可以修改费用设置
6. 与交易对合约的交互
当交易对合约需要查询费用设置时:
1 | // 在 UniswapV2Pair 的 _mintFee 函数中 |
7. 安全性考虑
重放攻击防护:通过映射检查确保每个交易对只创建一次
1 | require(getPair[token0][token1] == address(0), 'UniswapV2: PAIR_EXISTS'); |
权限控制:严格的权限验证防止未授权操作
输入验证:全面的参数检查确保合约状态一致性
这个工厂合约是 Uniswap V2 生态系统的核心枢纽,负责管理所有交易对的创建和协议级别的费用设置。其简洁而强大的设计为整个 DEX 提供了可靠的基础设施。
复现时的自查
- 记录自己实际使用的版本、配置和缺失依赖。
- 对照本篇关键步骤,保存命令或调用结果,并解释结果代表什么。
- 对失败或与原记录不一致的情况保留错误信息,不把历史输出当成自己的验证结果。
本文作者 Allureluoli
文字版权归作者所有,转载请注明出处;商业用途请先联系二月。
CC BY-NC-ND 4.0
原文链接 ↗
查看评论 · 基于 GitHub Issues