恒定函数做市商 (Constant Function Market Makers)

  • Jeiwan
  • 发布于 2025-10-01 19:13
  • 阅读 24

本章节复述了 Uniswap V2 的白皮书。理解这些数学原理对于构建类似 Uniswap 的 DEX 至关重要,但如果你在这个阶段没有完全理解,也没关系。

正如我在上一节中提到的,构建 AMM 有不同的方法。我们将专注于并构建一种特定类型的 AMM——恒定函数做市商 (Constant Function Market Maker)。不要被这个长名称吓到!它的核心是一个非常简单的数学公式:

$$x * y = k$$

就是这样,这就是 AMM。

$x$ 和 $y$ 是池合约的储备金——它当前持有的代币数量。k 只是它们的乘积,实际值并不重要。

为什么只有两个储备金,xy? 每个 Uniswap 池只能持有两种代币。我们使用 xy 来指代一个池的储备金,其中 x 是第一种代币的储备金,y 是另一种代币的储备金,顺序无关紧要。

恒定函数公式表示:每次交易后,k 必须保持不变。当交易者进行交易时,他们将一定数量的一种代币放入池中(他们想要出售的代币),并从池中移除一定数量的另一种代币(他们想要购买的代币)。这会改变池的储备金,并且恒定函数公式表示储备金的乘积不得改变。正如我们将在本书中多次看到的那样,这个简单的要求是 Uniswap 如何运作的核心算法。

交易函数 (The Trade Function)

现在我们知道了池是什么,让我们写出交易如何在池中发生的公式:

$$(x + r\Delta x)(y - \Delta y) = k$$

  1. 有一个池,其中包含一定数量的代币 0 ($x$) 和一定数量的代币 1 ($y$)
  2. 当我们用代币 0 购买代币 1 时,我们将一定数量的代币 0 提供给池($\Delta x$)。
  3. 池给我们一些代币 1 作为交换($\Delta y$)。
  4. 池还从我们提供的代币 0 的数量中收取少量费用 ($r = 1 - \text{swap fee}$)。
  5. 代币 0 的储备金发生变化 ($x + r \Delta x$),代币 1 的储备金也发生变化 ($y - \Delta y$)。
  6. 更新后的储备金的乘积必须仍然等于 $k$。

我们将使用代币 0 和代币 1 的符号来表示代币,因为这是它们在代码中被引用的方式。在这一点上,它们中的哪一个是 0,哪一个是 1 并不重要。

我们基本上是将一定数量的代币 0 提供给池,并获得一定数量的代币 1。池的工作是给我们一个以公平价格计算出的正确的代币 1 的数量。这导致我们得出以下结论:池决定交易价格

定价 (Pricing)

我们如何计算池中代币的价格?

由于 Uniswap 池是独立的智能合约池中的代币以彼此的价格定价。例如:在 ETH/USDC 池中,ETH 以USDC 的价格定价,USDC 以 ETH 的价格定价。如果 1 ETH 的成本是 1000 USDC,那么 1 USDC 的成本是 0.001 ETH。对于任何其他池也是如此,无论它是否是一个稳定币对 (例如 ETH/BTC)。

在现实世界中,一切都基于 供需规律 来定价。这也适用于 AMM。 我们暂时把需求部分放在一边,专注于供应。

池中代币的价格由代币的供应量决定,即由池持有的代币的储备金数量决定。 代币价格是储备金的简单关系:

$$P_x = \frac{y}{x}, \quad P_y=\frac{x}{y}$$

其中 $P_x$ 和 $P_y$ 是代币相对于另一种代币的价格。

这样的价格被称为 即时价格 (spot prices),它们只反映当前的市场价格。 然而,实际的交易价格是不同地计算出来的。 这就是我们需要把需求部分带回来的地方。

从供需规律得出结论,高需求会提高价格——这是我们在一个无需许可的系统中需要拥有的属性。当需求高时,我们希望价格高,并且我们可以使用池储备金来衡量需求:您想要从池中移除的代币越多(相对于池的储备金),需求的影响就越大。

让我们回到交易公式,更仔细地看看它:

$$(x + r\Delta x)(y - \Delta y) = xy$$

正如你所看到的,我们可以从中推导出 $\Delta_x$ 和 $\Delta y$,这意味着我们可以根据输入量来计算交易的输出量,反之亦然:

$$\Delta y = \frac{yr\Delta x}{x + r\Delta x}$$ $$\Delta x = \frac{x \Delta y}{r(y - \Delta y)}$$

事实上,这些公式使我们无需计算价格!我们总是可以使用 $\Delta y$ 公式找到输出量(当我们想要出售已知数量的代币时),并且我们总是可以使用 $\Delta x$ 公式找到输入量(当我们想要购买已知数量的代币时)。请注意,这些公式中的每一个都是储备金的关系 ($x/y$ 或 $y/x$),并且它们也考虑了交易量(前者中的 $\Delta x$ 和后者中的 $\Delta y$)。这些是尊重供需的定价函数。我们甚至不需要计算价格!

以下是你如何从交易函数中推导出上述公式的方法: $$(x + r\Delta x)(y - \Delta y) = xy$$ $$y - \Delta y = \frac{xy}{x + r\Delta x}$$ $$-\Delta y = \frac{xy}{x + r\Delta x} - y$$ $$-\Delta y = \frac{xy - y({x + r\Delta x})}{x + r\Delta x}$$ $$-\Delta y = \frac{xy - xy - y r \Delta x}{x + r\Delta x}$$ $$-\Delta y = \frac{- y r \Delta x}{x + r\Delta x}$$ $$\Delta y = \frac{y r \Delta x}{x + r\Delta x}$$ 以及: $$(x + r\Delta x)(y - \Delta y) = xy$$ $$x + r\Delta x = \frac{xy}{y - \Delta y}$$ $$r\Delta x = \frac{xy}{y - \Delta y} - x$$ $$r\Delta x = \frac{xy - x(y - \Delta y)}{y - \Delta y}$$ $$r\Delta x = \frac{xy - xy + x \Delta y}{y - \Delta y}$$ $$r\Delta x = \frac{x \Delta y}{y - \Delta y}$$ $$\Delta x = \frac{x \Delta y}{r(y - \Delta y)}$$

曲线 (The Curve)

上述计算可能看起来太抽象和枯燥。让我们可视化恒定乘积函数,以更好地理解它是如何工作的。

当绘制时,恒定乘积函数是一个二次双曲线:

恒定乘积公式曲线的形状

其中轴是池的储备金。每笔交易都从曲线上对应于当前储备金比率的点开始。要计算输出量,我们需要在曲线上找到一个新点,该点的 $x$ 坐标为 $x+\Delta x$,即代币 0 的当前储备金 + 我们正在出售的数量。$y$ 的变化是我们将获得的代币 1 的数量。

让我们看一个具体的例子:

Desmos 图表示例

  1. 紫色线是曲线,轴是池的储备金(注意它们以起始价格相等)。
  2. 起始价格是 1。
  3. 我们正在出售 200 个代币 0。如果我们只使用起始价格,我们预计会获得 200 个代币 1。
  4. 然而,执行价格是 0.666,所以我们只获得 133.333 个代币 1!

这个例子来自 Dan Robinson (Uniswap 的创造者之一) 制作的 Desmos 图表。为了更好地了解它是如何工作的,尝试编写不同的场景并在图表上绘制它们。尝试不同的储备金,并查看当 $\Delta x$ 相对于 $x$ 较小时,输出量如何变化。

传说 Uniswap 是在 Desmos 中发明的。

我猜你一定想知道为什么要使用这样的曲线。它可能看起来像是在惩罚你交易大额。这是真的,这是一个理想的性质!供需规律告诉我们,当需求高(并且供应恒定)时,价格也很高。当需求低时,价格也较低。这就是市场的运作方式。而且,神奇的是,恒定乘积函数实现了这种机制!需求由你想要购买的数量定义,供应是池的储备金。当你想要购买相对于池储备金的大量时,价格高于你想购买少量时。如此简单的公式保证了如此强大的机制!

即使 Uniswap 不计算交易价格,我们仍然可以在曲线上看到它们。令人惊讶的是,在进行交易时有多个价格:

  1. 在交易之前,有一个 即时价格 (spot price)。它等于储备金的关系,$\frac{y}{x}$ 或 $\frac{x}{y}$,具体取决于交易的方向。这个价格也是 切线的斜率 在起始点。
  2. 交易后,有一个新的即时价格,在曲线上不同的点。它是这个新点处切线的斜率。
  3. 实际的交易价格是连接这两个点的线的斜率!

这就是 Uniswap 的全部数学原理!呼!

好吧,这是 Uniswap V2 的数学原理,而我们正在学习 Uniswap V3。所以在下一部分中,我们将看到 Uniswap V3 的数学原理有何不同。

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

0 条评论

请先 登录 后评论