UniswapV2重要内容分析

  • whalehat
  • 发布于 9小时前
  • 阅读 94

UniswapV2版本重要点的简要概述

<!--StartFragment-->

一、Uniswap V2 概述

Uniswap V2 是以太坊上去中心化交易协议的第二个主要版本,于 2020 年 5 月推出。它允许任意两个 ERC20 代币之间的自动交易(无需 ETH 作为中间媒介),并引入了时间加权平均价格(TWAP)、闪电贷、合约模块化等改进。


二、核心组件

1. Factory 合约

  • 用于部署新的交易对(Pair 合约)。
  • 每个交易对由两个代币决定,地址固定由 keccak256CREATE2 算法计算得出。
  • function createPair(address tokenA, address tokenB) 用于创建新的交易对。

2. Pair 合约

  • 每一个 Pair 是一个独立的交易对合约,维护两个代币的储备。
  • 提供核心的流动性添加、移除、代币兑换逻辑。
  • 实现了 AMM 模型 x * y = k 的逻辑。

3. Router 合约

  • 为用户提供易用接口来进行交易、添加/移除流动性。

  • 封装对 Pair 合约的底层调用逻辑。

  • 主要函数如:

    • addLiquidity
    • removeLiquidity
    • swapExactTokensForTokens
    • swapTokensForExactTokens

三、核心机制

1. 自动做市商(AMM)

Uniswap V2 使用的模型为常数乘积公式:

x⋅y=k

其中:

  • x 为 token0 的储备量,
  • y 为 token1 的储备量,
  • k 为常数,在添加/移除流动性除外,交易过程始终保持不变。

任一交易操作(swap)都必须使 x * y 增加或保持不变(考虑手续费后)。


2. 手续费机制

  • 每笔交易收取 0.30% 的手续费。
  • 其中 0.25% 归流动性提供者(LP),0.05% 可选归开发者地址(默认关闭)。

手续费以“留在池子中”的方式表现,即:

  • swap 后的代币会让池中 k 增加,LP 通过移除流动性分享这一增长部分。

3. 流动性提供

添加流动性

  • 用户需按当前池子价格比例存入两种代币。
  • 系统根据最小价值那一边计算本次提供的流动性,铸造对应的 LP Token。

移除流动性

  • 用户销毁 LP Token,按比例提取两种资产和对应的手续费收益。

四、LP Token 计算公式

uint public constant MINIMUM_LIQUIDITY = 10**3;

if (_totalSupply == 0) {
    //第一次添加流动性Token
    liquidity = Math.sqrt(amount0.mul(amount1)).sub(MINIMUM_LIQUIDITY);
    _mint(address(0), MINIMUM_LIQUIDITY); // permanently lock the first MINIMUM_LIQUIDITY tokens
} else {
    //>1 次添加流动性Token
    liquidity = Math.min(amount0.mul(_totalSupply) / _reserve0, amount1.mul(_totalSupply) / _reserve1);
}

初始添加流动性时: liquidity = (amount0 * amount1) ^ (1/2) - MINIMUM_LIQUIDITY;

非首次添加时: liquidity = min(amount0 totalSupply / _reserve0 , amountb totalSupply / _reserve1);

为什么要保留MINIMUM_LIQUIDITY: <!--StartFragment-->

  1. 防止初始流动性提供者抽走全部资金

    • 如果没有 MINIMUM_LIQUIDITY,第一位添加流动性的用户可以:
      1. 添加流动性
      2. 立即移除全部流动性
      3. 由于精度误差,池子可能会残留极小数额,导致后续交易异常 加上 MINIMUM_LIQUIDITY 后,即使提供者移除全部流动性,这部分是 永远无法移除的,能确保池子仍有小量残余资产,防止错误。
  2. 保持系统最小量精度稳定性

    • EVM 的整数运算精度有限,当总 LP token 为 0 或非常小时,乘除法中容易出现精度损失、结果为0、或 division by zero 的错误。

<!--EndFragment-->


五、价格与滑点计算

Uniswap V2 的价格由池中两种代币储备决定:

$Ptoken0 / token1 = reserve1 / reserve0$

交易中因 x*y=k 的保持,价格会随交易滑动,产生所谓“滑点”。

例如,要用 token0 换 token1,输入 Δx 后,得到:

$Δy = reserve1−(reserve0 reserve1) / ( reserve0 + 0.997Δx) $

注意:0.997 是手续费后的因子。


六、时间加权平均价格(TWAP)

每个区块更新一次 price0CumulativeLastprice1CumulativeLast 累加器:

$priceX+=currentPriceX⋅timeElapsed$

外部合约可根据两个时间点间的差值除以时间,得出该段时间的平均价格。主要用于喂价和防操纵。


七、闪电交换(Flash Swap)

允许用户“借出”池中资产,在同一笔交易中归还或回滚:

  • 使用 swap 函数时,设置 to 为一个合约地址,该地址实现 uniswapV2Call 回调。
  • 在回调中用户可执行任意逻辑(如套利),最后归还资产加手续费。

用途包括:

  • 套利
  • 抵押再融资
  • 抵押清算

八、合约安全细节

  • 重入攻击控制:使用 lock 修饰符。
  • 防止滑点和前置交易:建议设置 minAmountOut
  • ERC20 兼容性问题:V2 默认不支持 fee-on-transfer 代币,但 Router 有 supportingFeeOnTransfer 变种方法。

<!--EndFragment-->

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
whalehat
whalehat
0x34e6...BA9C
web3 builder