UniswapV1 协议分析
Uniswap V1 协议技术分析
概述
Uniswap V1 是首个成功实现自动化做市商(AMM)的去中心化交易所协议,于 2018 年上线。它通过恒定乘积公式彻底改变了 DeFi 交易模式,为后续所有 AMM 协议奠定了基础。
白皮书
https://hackmd.io/C-DvwDSfSxuh-Gd4WKE_ig
源码
https://github.com/Uniswap/v1-contracts
核心机制
恒定乘积公式
Uniswap V1 的核心是恒定乘积公式:x × y = k
- x:ETH 储备量
- y:Token 储备量
- k:恒定常数
# 价格计算函数
def getInputPrice(input_amount: uint256, input_reserve: uint256, output_reserve: uint256) -> uint256:
input_amount_with_fee: uint256 = input_amount * 997 # 扣除 0.3% 手续费
numerator: uint256 = input_amount_with_fee * output_reserve
denominator: uint256 = (input_reserve * 1000) + input_amount_with_fee
return numerator / denominator
价格发现机制
- 自动定价:价格由储备比例决定,无需人工报价
- 滑点机制:交易量越大,价格变化越大
- 套利校正:价格偏差通过套利者自动修正
架构设计
工厂模式
# Factory 合约
contract Factory():
exchangeTemplate: public(address) # 交易所模板
token_to_exchange: address[address] # 代币到交易所映射
def createExchange(token: address) -> address:
exchange = create_with_code_of(self.exchangeTemplate)
Exchange(exchange).setup(token)
return exchange
设计优势:
- 统一标准:所有交易所使用相同模板
- 节省成本:通过克隆减少 95% 部署费用
- 防重复:每个代币只能创建一个交易所
合约结构
每个 Exchange 合约承担双重角色:
- 交易所:执行 ETH ↔ Token 交易
- ERC20 代币:发行流动性代币(UNI-V1)
交易机制
支持的交易类型
交易方向 | 精确输入 | 精确输出 | 转账版本 |
---|---|---|---|
ETH → Token | ethToTokenSwapInput |
ethToTokenSwapOutput |
ethToTokenTransferInput |
Token → ETH | tokenToEthSwapInput |
tokenToEthSwapOutput |
tokenToEthTransferInput |
Token → Token | tokenToTokenSwapInput |
tokenToTokenSwapOutput |
tokenToTokenTransferInput |
Token ↔ Token 交易
由于 V1 只支持 ETH 作为基础货币,Token ↔ Token 交易需要两步完成:
Token A → ETH → Token B
def tokenToTokenInput(...):
# 第一步:Token A → ETH
eth_bought = self.getInputPrice(tokens_sold, token_reserve, eth_reserve)
# 第二步:ETH → Token B
tokens_bought = Exchange(target_exchange).ethToTokenTransferInput(
min_tokens, deadline, recipient, value=eth_bought
)
流动性机制
添加流动性
def addLiquidity(min_liquidity: uint256, max_tokens: uint256, deadline: timestamp) -> uint256:
if total_liquidity > 0:
# 后续添加:必须保持比例
token_amount = msg.value * token_reserve / eth_reserve + 1
liquidity_minted = msg.value * total_liquidity / eth_reserve
else:
# 首次添加:用户决定初始价格
token_amount = max_tokens
liquidity_minted = as_unitless_number(self.balance)
移除流动性
def removeLiquidity(amount: uint256, min_eth: uint256, min_tokens: uint256, deadline: timestamp):
# 按比例赎回
eth_amount = amount * self.balance / total_liquidity
token_amount = amount * token_reserve / total_liquidity
# 销毁 LP 代币,返还资产
self.totalSupply -= amount
send(msg.sender, eth_amount)
self.token.transfer(msg.sender, token_amount)
流动性挖矿机制
- 手续费累积:每笔交易的 0.3% 手续费直接留在池中
- 价值增长:LP 代币总量不变,但池中资产增加
- 复利效应:手续费成为下次交易的基础,产生复利
手续费设计
费率结构
- 交易手续费:0.3%
- 分配方式:100% 奖励给流动性提供者
- 累积方式:手续费直接增加池中储备,无需显式分发
实现机制
# 实际参与交易的金额只有 99.7%
input_amount_with_fee = input_amount * 997 # 997/1000 = 99.7%
# 0.3% 的手续费自动留在池中
# LP 代币持有者在赎回时自动获得增值部分
安全机制
滑点保护
min_tokens
:保证最小输出max_tokens
:限制最大输入deadline
:防止延迟执行
精度保护
# 防止除法精度损失
token_amount = msg.value * token_reserve / eth_reserve + 1
地址验证
assert recipient != self and recipient != ZERO_ADDRESS
价格查询功能
只读函数
@constant
def getEthToTokenInputPrice(eth_sold: uint256) -> uint256:
return self.getInputPrice(eth_sold, as_unitless_number(self.balance), token_reserve)
@constant
def getTokenToEthInputPrice(tokens_sold: uint256) -> uint256:
return self.getInputPrice(tokens_sold, token_reserve, as_unitless_number(self.balance))
这些函数用于:
- 前端界面显示预估价格
- 智能合约集成
- 套利机器人计算
ERC20 兼容性
每个 Exchange 合约完全实现 ERC20 标准:
# 标准 ERC20 函数
def transfer(_to: address, _value: uint256) -> bool
def transferFrom(_from: address, _to: address, _value: uint256) -> bool
def approve(_spender: address, _value: uint256) -> bool
def balanceOf(_owner: address) -> uint256
def allowance(_owner: address, _spender: address) -> uint256
这使得 LP 代币可以:
- 在二级市场交易
- 作为其他协议的抵押品
- 集成到各种 DeFi 应用中
经济模型
套利机制
当 Uniswap 价格偏离外部市场时,套利者会:
- 在价格较低的平台买入
- 在价格较高的平台卖出
- 获取价差收益
- 推动价格回归均衡
无常损失
流动性提供者面临的主要风险:
- 当资产价格比例变化时,LP 价值可能低于直接持有
- 可通过交易手续费收入部分抵消
- 价格波动越大,无常损失越明显
V1 的局限性
技术限制
- ETH 中心化:所有交易对必须包含 ETH
- 双重滑点:Token ↔ Token 交易效率低
- 资本效率低:大部分流动性处于休眠状态
- 无原生稳定币对:稳定币交易也需要通过 ETH
扩展性问题
- 无法支持多资产池
- 缺乏集中流动性机制
- 无法自定义手续费率
历史意义与影响
技术创新
- 首次实现可行的 AMM 机制
- 证明了算法做市的可行性
- 开创了"可编程流动性"概念
生态影响
- 催生了整个 AMM 生态系统
- 为 V2、V3 的发展奠定基础
- 影响了 Sushiswap、Balancer 等协议设计
市场表现
- 峰值 TVL 超过 10 亿美元
- 日交易量最高达数亿美元
- 成功运行超过 5 年无重大安全事故
总结
Uniswap V1 以极简的设计实现了革命性的创新:
核心优势:
- 恒定乘积公式的数学优雅性
- 无需许可的流动性提供
- 自动化的价格发现机制
- 完整的 ERC20 兼容性
关键创新:
- 将复杂的做市商功能算法化
- 通过经济激励实现去中心化
- 创造了"流动性即代币"的模式
虽然 V1 存在明显局限,但它成功验证了 AMM 模式的可行性,为整个 DeFi 生态的爆发式增长奠定了基础。其简洁而强大的设计理念至今仍在影响着新一代 DeFi 协议的发展。
版权声明
本文仅代表作者观点,不代表区块链技术网立场。
本文系作者授权本站发表,未经许可,不得转载。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。