本章节复述了 Uniswap V2 的白皮书。理解这些数学原理对于构建类似 Uniswap 的 DEX 至关重要,但如果你在这个阶段没有完全理解,也没关系。
正如我在上一节中提到的,构建 AMM 有不同的方法。我们将专注于并构建一种特定类型的 AMM——恒定函数做市商 (Constant Function Market Maker)。不要被这个长名称吓到!它的核心是一个非常简单的数学公式:
$$x * y = k$$
就是这样,这就是 AMM。
$x$ 和 $y$ 是池合约的储备金——它当前持有的代币数量。k 只是它们的乘积,实际值并不重要。
为什么只有两个储备金,x 和 y? 每个 Uniswap 池只能持有两种代币。我们使用 x 和 y 来指代一个池的储备金,其中 x 是第一种代币的储备金,y 是另一种代币的储备金,顺序无关紧要。
恒定函数公式表示:每次交易后,k 必须保持不变。当交易者进行交易时,他们将一定数量的一种代币放入池中(他们想要出售的代币),并从池中移除一定数量的另一种代币(他们想要购买的代币)。这会改变池的储备金,并且恒定函数公式表示储备金的乘积不得改变。正如我们将在本书中多次看到的那样,这个简单的要求是 Uniswap 如何运作的核心算法。
现在我们知道了池是什么,让我们写出交易如何在池中发生的公式:
$$(x + r\Delta x)(y - \Delta y) = k$$
我们将使用代币 0 和代币 1 的符号来表示代币,因为这是它们在代码中被引用的方式。在这一点上,它们中的哪一个是 0,哪一个是 1 并不重要。
我们基本上是将一定数量的代币 0 提供给池,并获得一定数量的代币 1。池的工作是给我们一个以公平价格计算出的正确的代币 1 的数量。这导致我们得出以下结论:池决定交易价格。
我们如何计算池中代币的价格?
由于 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)}$$
上述计算可能看起来太抽象和枯燥。让我们可视化恒定乘积函数,以更好地理解它是如何工作的。
当绘制时,恒定乘积函数是一个二次双曲线:

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

这个例子来自 Dan Robinson (Uniswap 的创造者之一) 制作的 Desmos 图表。为了更好地了解它是如何工作的,尝试编写不同的场景并在图表上绘制它们。尝试不同的储备金,并查看当 $\Delta x$ 相对于 $x$ 较小时,输出量如何变化。
传说 Uniswap 是在 Desmos 中发明的。
我猜你一定想知道为什么要使用这样的曲线。它可能看起来像是在惩罚你交易大额。这是真的,这是一个理想的性质!供需规律告诉我们,当需求高(并且供应恒定)时,价格也很高。当需求低时,价格也较低。这就是市场的运作方式。而且,神奇的是,恒定乘积函数实现了这种机制!需求由你想要购买的数量定义,供应是池的储备金。当你想要购买相对于池储备金的大量时,价格高于你想购买少量时。如此简单的公式保证了如此强大的机制!
即使 Uniswap 不计算交易价格,我们仍然可以在曲线上看到它们。令人惊讶的是,在进行交易时有多个价格:
这就是 Uniswap 的全部数学原理!呼!
好吧,这是 Uniswap V2 的数学原理,而我们正在学习 Uniswap V3。所以在下一部分中,我们将看到 Uniswap V3 的数学原理有何不同。