UniswapV1协议技术分析概述UniswapV1是首个成功实现自动化做市商(AMM)的去中心化交易所协议,于2018年上线。它通过恒定乘积公式彻底改变了DeFi交易模式,为后续所有AMM协议奠定了基础。白皮书https://hackmd.io/C-DvwDSfSxuh
Uniswap V1 是首个成功实现自动化做市商(AMM)的去中心化交易所协议,于 2018 年上线。它通过恒定乘积公式彻底改变了 DeFi 交易模式,为后续所有 AMM 协议奠定了基础。
https://hackmd.io/C-DvwDSfSxuh-Gd4WKE_ig
https://github.com/Uniswap/v1-contracts
Uniswap V1 的核心是恒定乘积公式:x × y = 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
设计优势:
每个 Exchange 合约承担双重角色:
交易方向 | 精确输入 | 精确输出 | 转账版本 |
---|---|---|---|
ETH → Token | ethToTokenSwapInput |
ethToTokenSwapOutput |
ethToTokenTransferInput |
Token → ETH | tokenToEthSwapInput |
tokenToEthSwapOutput |
tokenToEthTransferInput |
Token → Token | tokenToTokenSwapInput |
tokenToTokenSwapOutput |
tokenToTokenTransferInput |
由于 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)
# 实际参与交易的金额只有 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))
这些函数用于:
每个 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 代币可以:
当 Uniswap 价格偏离外部市场时,套利者会:
流动性提供者面临的主要风险:
Uniswap V1 以极简的设计实现了革命性的创新:
核心优势:
关键创新:
虽然 V1 存在明显局限,但它成功验证了 AMM 模式的可行性,为整个 DeFi 生态的爆发式增长奠定了基础。其简洁而强大的设计理念至今仍在影响着新一代 DeFi 协议的发展。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!