[UNISWAP 系列] 2. 理解 CPMM

  • Decipher
  • 发布于 2021-09-21 22:31
  • 阅读 12

本文围绕Uniswap的AMM模型CPMM,详细探讨了通过该模型进行代币交换时如何自动决定代币交换数量的过程。文章涵盖了CPMM的基本概念、公式推导及相关的动态变化,适合希望深入理解Uniswap交易机制的读者。

[UNISWAP SERIES]

  1. 理解Uniswap
  2. 理解CPMM
  3. 深入了解Uniswap V3
  4. 理解AMM

本文是[Uniswap Series]的第二篇文章,旨在通过公式理解Uniswap的加密货币价格决定方法。由于本文不涉及Uniswap服务的基本概念,因此建议你在阅读本文之前,先阅读上一篇文章《1. 理解Uniswap》。

引言

Uniswap是一个提供两种加密货币交换交易的去中心化交易所。交易所实现方式选择了AMM模式,而不是中心化交易所使用的订单簿形式。通过AMM方式进行的Uniswap代币交换过程如下所示。

  1. 创建一个ETH/DAI池,可以进行ETH和DAI的交换。

(假设:ETH当前价格 = \$100,DAI当前价格 = \$1)

  1. 流动性提供者以1:1的比例向池中存入1 ETH和100 DAI。
  2. 向池中存入1 ETH后,接收n个DAI。

第2步提到的1:1比例是根据价值而非数量来决定的。假设ETH的当前价值为\$100,DAI的当前价值为\$1,则流动性提供者在第2步中存入1 ETH时,也必须存入100 DAI。一些读者可能会因为上述示例而认为在第3步中用户会收到100个DAI。然而,使用n个的表达是因为在实际交换中接收到的DAI数量会少于100个。

这种最初预期的价格与实际交易价格之间的差异称为滑点(Slippage)。滑点会因池中的流动性不足和交易量大而增加,滑点越大,交易者最终以更高的价格进行代币交易。

在Uniswap中实现的AMM使得代币交换不可避免地会产生滑点。关于这种现象,我们可以考虑以下问题。

在Uniswap中,为什么会发生滑点?

如果更明确地提出这个问题

Uniswap通过AMM是如何决定代币交换量的,从而导致滑点的发生?

本文希望在与读者一起探索上述问题的同时寻找答案。为此,将需要更明确地写出要寻找的答案,形式如下:

我们来了解一下,当用户交换1 ETH时,能够收到多少个DAI的自动计算方式。

最终,从Uniswap的角度更准确地表述上述问题如下。

我们来了解一下,当用户向池中存入1 ETH时,池中应剩余多少个DAI。

一旦决定了交换后池中应剩余的代币数量,代币的价格也会自动确定。当前池中如果剩余1 ETH和100 DAI,则1 ETH的价格被确定为100 DAI。因此,AMM也被称为DEX的价格决定模型

接下来,我们将通过公式来探讨AMM如何确定DEX的交易方式,以回答上述问题。

本文不涉及帮助理解Uniswap的整体介绍。如果你希望了解Uniswap的概念、流动性提供者、滑点等内容,建议你在阅读本篇文章之前,先阅读第一篇内容。

在开始正式解释之前,我们先介绍Uniswap的AMM函数CPMM。

(1) CPMM

CPMM是Constant Product Market Makers的缩写,是Uniswap为了支持代币交易而首次定义的AMM函数。顾名思义,该函数要求变量x和y的乘积必须始终保持常量k值。接下来的文章将基于这个简单的CPMM函数详细探讨代币交换量是如何计算出来的。

在2021年5月5日,Uniswap发布了V3版本,重新制定了流动性提供方式。部分读者可能会好奇这些变化对现有CPMM逻辑产生了什么影响。为了回答这一疑问,我开始了这次研究。Uniswap V3将在下一篇文章中讨论,但为了满足与我有相同疑问的读者,这里简要提及:

Uniswap V3通过集中流动性(Concentrated liquidity)概念更新了CPMM函数,如下所示。

(2) Uniswap V3的集中流动性函数

Uniswap V3的一个突出特点是流动性提供者能够指定希望提供的价格区间,进行资金提供。这被称为位置设置,而定义该过程的函数正是公式(2)。

Uniswap V2和V3的关键区别在于流动性提供时的位置设置,而流动性提供后的逻辑,代币交换过程在V2和V3中是相同的。因此,我期待对于Uniswap V3的代币交换逻辑感兴趣的读者,也能在本文中解答一些疑问。有关修改后的CPMM函数的解释将在下一篇文章中讨论。

_本文中涉及的公式是基于Uniswap V3白皮书,为提升可读性,一些变量的表示与白皮书略有不同。_

Constant Product Market Makers (CPMM)

现在我们正式讨论基于Uniswap的CPMM函数如何决定代币交换量。该过程包含5个阶段。

  1. 定义池的储备数量
  2. 计算代币流动性和池的基准价格
  3. 定义可以决定各代币储备数量的公式
  4. 计算当兑换n个y代币时,池中应剩余的x代币的储备数量
  5. 向池中添加流动性

1. 定义池的储备数量

流动性提供者希望为代币x和y的交换创建一个x/y池。为此,假设流动性提供者存入了1,000个x代币和4,000个y代币以创建池。因此,池的常数K由每个代币的供应量决定,如下所示:

(3) 池的储备数量

  • X: x代币的储备数量
  • Y: y代币的储备数量
  • K: x/y池的储备数量

这里的储备数量指的是池中剩余的代币数量。即,X和Y代表池中剩余(或存入)的每种代币数量。池的储备数量是根据各代币的储备数量的乘积确定的常数值,也叫做池的流动性。

目前,池中由流动性提供者存入的1,000个x代币和4,000个y代币,则根据公式(3),常数K的值为以下计算:

关于上述函数的图形如下所示。

图1. CPMM

  • x轴: x代币的储备数量X
  • y轴: y代币的储备数量Y
  • 红色曲线: x/y池的储备数量K(池的流动性)

图1中,X与Y的乘积形成的矩形的面积即为常数K的值。流动性提供后,池中x代币和y代币的数量所决定的常数K在今后池中发生的所有交换交易中都是不变的固定值。 若新流动性提供者向池中额外存入代币,或现有提供者从池中取回流动性时,常数K的值会发生变化。对此我们将在最后阶段进行探讨。

2. 计算代币流动性和池的基准价格

现在我们将以池中每种代币的数量为基础来确定“交换量”。简单来说,我们将决定1个x代币可以交换为几个y代币,这个值将根据池的流动性来决定。

流动性的字面定义是将某特定商品或服务转化为其他价值的能力。将此属性应用到代币上,意味着x代币能够转化为另一价值y代币的能力。Uniswap将这种代币交换的基准称为代币流动性,定义如下:

(4) 代币流动性

我们来通过示例计算流动性的值。当前池中有1,000个x代币(X)和4,000个y代币(Y)。由此计算出的x/y池的代币流动性如下:

其中,计算出的代币流动性2,000将成为x代币与y代币之间的交换基准。我们可以基于这个交换基准定义池的基准价格。最终,‘代币交换量’将通过这一阶段决定得到的代币流动性池的基准价格进行计算。

未来发生的交换交易中,各代币的储备X和Y可能会发生变化,但x和y的代币流动性L将保持在2,000内。

通过公式(4)可以理解常数K的值和L²的值是相等的。

(5) 池的流动性

公式(5)中的L²表示为池的流动性,与公式(3)中定义的池储备K的值相同。公式(5)是Uniswap V3中被更名为contracted liquidity的公式,因此需要记住。

需要记住的是,L²和L表示的是不同的值。L²表示池的总储备K,代表整个池的流动性,而L则适用于池中每个代币的基准流动性

现在我们通过代币流动性L来决定各代币的流动性价值。代币的流动性价值可以理解为池中每种代币所占的价值。

在此后写到的流动性价值和代币价格的数目符号上,使用$符号以强调价格。然而,这并不意味着它具有法定货币的$(美元)价值。

若Px为x代币的价值($),则流动性价值Lx可计算如下。

(6) x代币的流动性价值($)

对于y代币的流动性价值Ly同样可以如此计算。

(7) y代币的流动性价值($)

假设Lv为池的基准代币流动性价值,定义如下。

(8) 池的代币流动性价值

公式(8)中的√P表示池的基准价格。前面引言中提到,流动性提供时为了保持相同的价值,应以1:1的比例存入x代币和y代币。在这一假设下,每个代币的流动性价值相同,最终形成如下公式。

(9) 所有代币的流动性价值相同

根据公式(9),Lv²可表示为Lx和Ly,如下所示。

(10)

根据公式(4)、(8)、(10),得出如下公式。

(11)

现在我们要正式决定池的基准价格√P的值。公式(11)可进一步表示为Px和Py,如下所示。

(12) 池的基准价格√P

我们现在返回到之前的例子来计算池的基准价格√P的值。

[池现状]

  • x代币储备: X = 1,000
  • y代币储备: Y = 4,000
  • 代币流动性: L = Lx = Ly: 2,000

通过公式(6)、(7)可计算出各代币的价格Px和Py,即基于代币流动性L,如下所示。

(13) 代币价格

在确定池的基准价格之前,应先选择作为基准的代币。 这里选择x作为池的基准代币,以便确定池的基准价格。

(14) 池的基准价格

通过公式(14)计算出的池的基准价格是√(4,000/1,000) = $2,与基准代币的价格Px的值相同。

3. 定义可以决定各代币的储备数量的函数

第三阶段,我们将基于第二阶段决定的代币流动性L和池的基准价格√P,定义一个能够计算交换后池中剩余的各代币的储备数量的函数。该函数基于公式(14)进行确定。

首先,在公式(14)的两边乘以*X 1/√P,以便定义关于X**的函数。

(15)

在公式(15)中,√(X*Y) = L,因此X的值可表示为:

(16) x代币储备

同样,Y的函数可以通过在公式(14)两边乘以*Y 1/√P**来构建。

(17) y代币储备

从公式(16)和(17)可以得出以下推论:

  • 代币流动性L是一个固定值。
  • √P增加时,y代币的储备量将增加。
  • √P增加时,x代币的数量(X)将减少。

池中一种代币数量少于另一种代币,意味着数量较少的代币其市场价格较高。换句话说,以下逻辑成立。

  • √P增加时,y代币的储备量增加,导致Py的价格下降。
  • √P增加时,x代币的储备量减少,导致Px的价格上升。

4. 计算用户兑换n个y代币时池中应剩余的x的储备数量

Uniswap AMM的最终目标是在用户将y代币兑换为x代币时,决定给用户提供多少个x代币。在最后的第4步中,将计算用户在兑换2,000个y代币时应提供多少个x代币的方法。

在第3阶段中,可以基于每个代币的价格√P进行计算,但也可以基于y代币的数量进行考虑。

  • 用户存入y代币以兑换x代币。
  • y代币的储备量增加,导致√P增加,从而Py价格降低。
  • y代币的储备量增加,导致√P增加,从而Px价格增加。

在记住这些逻辑后,绘制公式(17)的图形为如下。

图2. 池的基准价格和代币流动性对y代币的储备数量的影响

[交换前池现状]

  • y代币储备: Y = 4,000
  • 代币流动性: L = Lx = Ly: 2,000
  • 池的基准价格: √P = $ 2
  • x轴: 池的基准价格√P
  • y轴: 代币流动性L
  • 黑色矩形: y代币的储备数量Y

现在,假设用户存入2,000个y代币以交换x代币。在这种情况下,池现状和图2将如下变化。

图3. 交换后y代币储备数量图形

[交换后池现状]

  • y代币储备: 4,000 + 2,000 = 6,000
  • 代币流动性: L = Lx = Ly: 2,000
  • 池的基准价格: √P = Y/L = 6,000 / 2,000 = $3

图3中,ΔY是用户为了进行交换而进一步存入的y代币数量,该值为2,000。即,用户为交换而存入的y代币数量为ΔY,而y代币储备数量Y将增加到6,000。因此,基准价格√P将增加到$3。

同时,可以发现代币流动性L的值在交换过程中未发生变化。这里需要注意的是,在交换中,正在变化的值是√P和Y,而L的值只有在流动性增加或提取的情况下才会变化。

这里有必要重新审视y代币储备的定义。用户可以请求Y代币的兑换量从0到+∞,这将使基准价格√P也可以波动至从0到+∞。考虑到随着交换而变动的值,我们可以重新定义y储备如以下公式所示。

(18) 和代币交换相关的y储备

这里因为L是一个恒定的值,所以不附加变化值Δ。

通过将公式(18)调整为代币流动性L的定义,得出如下。

(19) 与代币交换相关的流动性L

在公式(19)中,恒定的L显示出Y和√P值应以一定比例共同波动。

当考虑到交换时波动的值,绘制的y储备代币图形如下。

图4. 我们非常熟悉的Uniswap的CPMM图形

现在,让我们回到之前的例子,利用用户存入的ΔY改变的池基准价格,从而决定用户应获得的x代币数量ΔX。

用户向池中存入1 ETH时,应剩余多少个DAI

为此,我们使用公式(16)。

(20)

公式(20)得出的结果是要从池中取出并提供给用户的x代币数量。通过ΔX值,我们也可以计算池中应剩余的x代币数量X值。

(21) 交换后x代币储备数量

通过基准价格√P的变化也能计算出x代币的储备数量,得出相同的结果。

通过这些步骤,一个用户在交换2,000个y代币后将获得333个x代币,池中则将剩余666个x代币。

现在,我们将查看交换后的CPMM图形如何变化。

图5. 交换后的AMM图形

[交换后池现状]

  • x代币储备: X = 666
  • y代币储备: Y = 6,000
  • 代币流动性: L = 2,000
  • 池的基准价格: √P = $3

从图中可以看出,交换后变化的值是x代币储备和y代币储备的数量。然而,表示池的储备的红色曲线K的值并未发生变化。

通过CPMM确定储备数量的过程简要总结如下。

  1. 用户存入2,000个y代币至池中
  2. y代币的储备增加导致池的基准价格由2增加到3
  3. 池的基准价格上升导致x代币储备从1,000减少到666
  4. 取出的333个x代币支付给用户

5. 向池中添加流动性

通过1至4阶段的过程,我们观察了代币交换进行后池的现状和CPMM图形的变化。现在,我们将研究当池中增加或减少流动性时,这些值将如何变化。

[池现状]

  • x代币储备数量 (X): 666个
  • y代币储备数量 (Y): 6,000个
  • x代币价格 (Px): $3
  • y代币价格 (Py): $0.33
  • 池的常数 (K): 3,996,000
  • 池的代币流动性 (L): 2,000
  • 池的基准价格 (√P): $3

现在,假设另一个流动性提供者打算向池中提供1,000个x代币作为流动性。为此,他还需同时提供价值为1:1的y代币。因此,该流动性提供者需存入价值为1,000个x代币 (总额$3,330) 对应的10,090个y代币。此供款将使池的状态如下变化。

[流动性供款后池现状]

  • x代币的储备数量 (X): 1,666个
  • y代币的储备数量 (Y): 16,090个
  • x代币价格 (Px): $3
  • y代币价格 (Py): $0.33
  • 池的常数 (K): 26,805,940
  • 池的代币流动性 (L): 5,177
  • 池的基准价格 (√P): $3

通过这些值可以看出,当池流动性发生波动时,变化的值是X、Y、K及流动性L。

图6. 流动性供款后的CPMM图形

在图6中,红色虚线表示流动性供款前池的储备,而紫色曲线表示流动性供款后池的储备。流动性供款后,各代币的储备数量以相同的比例增加,池的储备量也与此相同比例增加。

图7. 流动性供款后的y代币储备

图7中y代币储备数量的增加导致代币流动性L增加,同时基准价格√P保持在$3。

结论

本文详细描述了Uniswap的AMM模型CPMM如何自动决定代币交换量。通过这个过程,当希望在x/y池中将y代币兑换为x代币时,应给用户支付多少个x代币,能够自动确定的逻辑得以清晰呈现。本文中至关重要的有以下两点需牢记。

[通过CPMM决定储备数量的方法]

  1. 用户存入2,000个y代币至池中
  2. y代币的储备数量增加导致池的基准价格由2增加到3
  3. 池的基准价格增加导致x代币储备从1,000减少到666
  4. 池中取出的333个x代币支付给用户

[因交换或流动性波动而变动的值]

交换与流动性波动并非同时发生的事件。

  1. 由于交换而变的值
  • x代币的储备数量 (X)
  • y代币的储备数量 (Y)
  • x代币价格 (Px)
  • y代币价格 (Py)
  • 池的基准价格 (√P)
  1. 由于流动性波动而变动的值
  • x代币的储备数量 (X)
  • y代币的储备数量 (Y)
  • 池的常数 (K)
  • 池的代币流动性 (L)

在下一篇文章中,我们将讨论Uniswap在更新为V3后引入的新概念集中流动性(CONCENTRATED LIQUIDITY)。具体内容包括修改后的CPMM公式、懒惰流动性(lazy liquidity)问题解决方案以及Uniswap V3的池现状等。

[UNISWAP SERIES]

  1. 理解Uniswap
  2. 理解CPMM
  3. 深入了解Uniswap V3
  4. 理解AMM
  • 原文链接: hyun-jeong.medium.com/un...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
Decipher
Decipher
https://medium.com/decipher-media