UniswapV2算法概述

解锁 DeFi 世界的钥匙:深入剖析 Uniswap v2 算法

近年来,去中心化金融 (DeFi) 的浪潮席卷全球,而在这场变革中,去中心化交易所 (DEX) 无疑扮演着至关重要的角色。Uniswap,作为最受欢迎的 DEX 之一,其背后的算法是理解 DeFi 运作方式的关键。

背景:中心化交易所的局限与 DEX 的崛起

在 DeFi 出现之前,我们进行加密货币交易主要依赖中心化交易所 (CEX),如币安、Coinbase 等。这些平台虽然交易体验良好,但也存在一些固有的局限性:

  • 托管风险: 用户的资产需要存放在交易所的钱包中,存在被黑客攻击或交易所跑路的风险。
  • 审查风险: 交易所可以根据自身政策或监管要求限制用户的交易。
  • 单点故障: 交易所的服务器一旦出现故障,整个交易系统都会瘫痪。

为了解决这些问题,去中心化交易所 (DEX) 应运而生。DEX 的核心特点在于:

  • 非托管: 用户始终掌控自己的私钥和资产。
  • 无需许可: 任何人都可以参与交易和提供流动性。
  • 透明公开: 交易记录和智能合约代码通常是公开可查的。

Uniswap 就是这样一款具有代表性的 DEX。

Uniswap 的作用:连接加密资产的桥梁

Uniswap 的核心作用是实现不同加密资产之间的无需许可的兑换。它通过一种称为自动做市商 (Automated Market Maker, AMM) 的机制,允许用户在没有传统订单簿的情况下进行交易。

你可以将 Uniswap 想象成一个自动化的货币兑换点,你不需要找到一个想用另一种货币和你交易的人,只需要按照预先设定的规则(也就是算法)进行兑换即可。

Uniswap v2 的原理:恒定乘积做市商

Uniswap v2 的核心原理是恒定乘积公式。对于任何一个交易对(例如 ETH/USDT),Uniswap v2 维护着一个流动性池 (Liquidity Pool),这个池子里存放着等值的两种资产。

假设一个流动性池中包含 xx 数量的代币 A 和 yy 数量的代币 B,Uniswap v2 的核心思想是维持池中两种代币数量的乘积为一个常数 kk

x×y=k\qquad x \times y = k

这里的 kk 在没有新的流动性加入或移除,且忽略交易手续费的情况下,是保持不变的。

交易过程:

当你想要用一定数量的代币 A 兑换代币 B 时,你会将你的代币 A 加入到流动性池中,并从池中取出相应数量的代币 B。由于池中的代币 A 数量增加,为了维持 x×y=kx \times y = k 不变,池中的代币 B 数量必须减少。

价格的决定:

交易的实际兑换比例(即价格)是由交易前后流动性池中两种代币的比例决定的。如果你投入更多的代币 A,你会相对获得较少的代币 B,这反映了代币 A 相对于代币 B 的价格上涨。

Uniswap v2 的核心算法

现在,我们来更具体地看一下交易的算法:

假设流动性池中有 xx 个代币 A 和 yy 个代币 B。你想要用 Δx\Delta x 个代币 A 来兑换代币 B。

  1. 加入代币 A: 流动性池中代币 A 的数量变为 x+Δxx + \Delta x

  2. 计算可获得的代币 B: 为了维持 kk 值(在扣除手续费之前),新的代币 B 数量 yy' 应该满足:
    (x+Δx)×y=k=x×y\qquad (x + \Delta x) \times y' = k = x \times y
    因此,理论上你可以获得的代币 B 的数量是:
    y=x×yx+Δx\qquad y' = \frac{x \times y}{x + \Delta x}
    那么,你将获得的代币 B 的数量 Δy\Delta y 是:
    Δy=yy=yx×yx+Δx=y(1xx+Δx)=yΔxx+Δx\qquad \Delta y = y - y' = y - \frac{x \times y}{x + \Delta x} = y \left( 1 - \frac{x}{x + \Delta x} \right) = y \frac{\Delta x}{x + \Delta x}

  3. 交易手续费: Uniswap v2 对每笔交易收取 0.3%0.3\% 的手续费,这部分手续费会按比例分配给流动性提供者。因此,实际加入到池中的代币 A 数量是 Δx×(10.003)\Delta x \times (1 - 0.003)

    所以,实际获得的代币 B 的数量 Δyactual\Delta y_{actual} 是:
    Δyactual=yx×yx+Δx×0.997\qquad \Delta y_{actual} = y - \frac{x \times y}{x + \Delta x \times 0.997}

总结一下交易过程:

当你用 Δx\Delta x 个代币 A 交易代币 B 时,实际支付给流动性池的是 Δx×0.997\Delta x \times 0.997 个代币 A。根据恒定乘积公式,系统会计算出你应该收到的代币 B 的数量 Δyactual\Delta y_{actual},使得交易后池中两种代币数量的乘积依然(近似)等于 kk

举例说明:ETH/USDT 交易

假设 Uniswap v2 的 ETH/USDT 流动性池中有 100 ETH 和 300,000 USDT。那么,k=100×300,000=30,000,000k = 100 \times 300,000 = 30,000,000。当前的 ETH 价格隐含在池子的比例中,即 300,000/100=3000300,000 / 100 = 3000 USDT/ETH。

现在,你想用 1 ETH 来兑换 USDT。

  1. 你实际加入到池中的 ETH 数量是 1×0.997=0.9971 \times 0.997 = 0.997 ETH。
  2. 池中 ETH 的总数变为 100+0.997=100.997100 + 0.997 = 100.997 ETH。
  3. 为了维持乘积 kk,新的 USDT 数量 yy' 应该是:
    100.997×y=30,000,000\qquad 100.997 \times y' = 30,000,000
    y=30,000,000100.997297037.83\qquad y' = \frac{30,000,000}{100.997} \approx 297037.83 USDT
  4. 因此,你将获得的 USDT 数量是:
    Δyactual=300,000297037.832962.17\qquad \Delta y_{actual} = 300,000 - 297037.83 \approx 2962.17 USDT

可以看到,你用 1 ETH 换得了大约 2962.17 USDT。实际的兑换价格是 2962.17/12962.172962.17 / 1 \approx 2962.17 USDT/ETH,略低于池子当前的隐含价格 3000 USDT/ETH。这就是滑点 (Slippage) 的体现,当你交易的规模相对于流动性池的大小越大时,滑点会越明显。

总结

Uniswap v2 通过简单的恒定乘积公式 x×y=kx \times y = k 实现了无需许可的加密资产兑换。其核心算法涉及到根据交易量和流动性池的规模动态调整价格,并通过收取交易手续费来激励流动性提供者。