常数乘积自动化做市商:你需要了解的一切

本文深入探讨了常数乘积自动化做市商(AMM)的数学原理及其在去中心化金融(DeFi)中的应用,详细分析了流动性添加和删除过程中的公式推导和智能合约代码示例。通过分步讲解,读者可以理解常数乘积 AMM 的机制及其在交易中的影响。

自动化市场制造商 (AMM) 在去中心化金融 (DeFi) 领域中发挥着关键作用,促进流动性提供和交易。该领域的一个关键概念是 恒定乘积 AMM,它支撑着流行的去中心化交易所如 Uniswap 和 SushiSwap。

在本文中,我们将深入探讨恒定乘积自动化市场制造商,解密添加和移除流动性的数学原理。

什么是恒定乘积公式?

恒定乘积 AMM 是一种 AMM,其中代币的价格由以下方程决定:

XY = K

其中 X = AMM 中的 Token A 数量,Y = AMM 中的 Token B 数量。

恒定乘积 AMM 如何工作?

当我们在 AMM 上进行交易时,X 和 Y 代币的值会变化,但 K 的值将保持不变。

例如,我们将出售 Token A 并购买 Token B。因此我们可以写成:

dX = 输入的 Token A 数量

dY = 输出的 Token B 数量

在交易之前,我们有方程:XY = K

交易之后,我们将得到以下修改后的方程:

( X + dX )( Y - dY ) = K

X 是交易前 AMM 中的代币数量,因为我们在出售 Token A,因此我们增加了 dX。

同样地,Y 是交易前 AMM 中的代币数量,我们因为购买 Token B 而减少了 dY。

K 将始终保持不变。

这就是交易通过图形表示的样子。

可以看到,交易后我们需要将 Y 的值降低到 Y-dY,并将 X 增加到 X+dX,以确保 K 的值保持不变。

公式的工作原理

  • 当流动性首次添加到池中时,Token A ( x) 和 Token B ( y) 的初始数量设置为其乘积等于 k。所以,如果最初有 100 个 Token A 和 50 个 Token B,那么:k = 100 * 50 = 5000
  • 当发生交易时,比如某人想用 Token A 购买 Token B,他们会向池中添加一定数量的 Token A。这将增加池中 Token A 的数量 ( x 增加)。
  • 为了维持方程 x*y=k,池中 Token B 的数量 ( y) 必须减少。将重新计算 xy 的新值,以确保乘积仍然等于 k
  • y 相对于 x 增加的减少率决定了交易的有效汇率。
  • 假设池的初始状态是 x = 100 单位的 Token A 和 y = 50 单位的 Token B,所以 k = 5000
  • 用户想要购买 10 单位的 Token B。为了维持恒定的乘积,池计算出需要添加多少 Token A。
  • 假设池计算出需要增加 25 单位 Token A 以维持 k。池的新状态将是 x = 125 单位 Token A 和 y = 40 单位 Token B (因为 125 * 40 = 5000)。
  • 交易相较于池的大小越大,对价格的影响越显著。这是因为较大的交易需要在 xy 中做更大的改变,以保持 k 恒定。
  • 这种效应会导致价格滑点,特别是在流动性较小的池中。

恒定乘积 AMM 智能合约解释

1. 交换函数:如何计算 dY 以获取 dX?

  • 这个数学公式用于计算给定输入数量 ( dx) 对应的输出数量 ( dy)。
  • 恒定乘积公式为 xy=k。当用户交换 dX 数量的某个代币时,储备的变化和乘积必须仍然等于 k
  • 重新排列公式,我们找到 dY,即应给予用户的另一种代币的数量。
  • 最终公式 YdX / (X + dX) 考虑输入数量和当前储备给出输出数量。

对应代码

uint256 amountInWithFee = (_amountIn * 997) / 1000;
amountOut = (reserveOut * amountInWithFee) / (reserveIn + amountInWithFee);

2. 添加流动性函数:如何平衡 dX 和 dY?

添加流动性需要保持价格比例,表示为:

  • 此数学确保添加到池中的代币数量 ( dXdY) 的比例保持当前价格比例。
  • 目标是防止添加流动性影响代币的相对价格。
  • 最后部分 dY = Y / X * dX 给出为保持价格比例所需的 dY 的数量。

对应代码

if (reserve0 > 0 || reserve1 > 0) {
        require(reserve0 * _amount1 == reserve1 * _amount0, "x / y != dx / dy");

3. 添加流动性中的股份计算:铸造新股份

股份计算对公平分配至关重要:

f(X,Y) = 流动性的价值

我们将定义 f(X,Y) = **√**XY

L0 = f(X,Y)

L1 = f(X+dX,Y+dY)

T = 总股份

s = 要铸造的股份

总股份应与流动性的增加成正比

L1 / L0 = (T + s) / T

L1 * T = L0 * (T + s)

(L1 - L0) * T / L0 = s

  • 这个数学计算提供的流动性新股份的数量。
  • 流动性的价值被定义为储备乘积的平方根 (** √**XY).
  • 总股份的增加应与流动性的增加成正比。
  • 公式 (L1 - L0) * T / L0 = s 计算基于流动性变化要铸造的新股份。

对应代码

if (totalSupply == 0) {
    shares = _sqrt(_amount0 * _amount1);
} else {
    shares = _min(
        (_amount0 * totalSupply) / reserve0,
        (_amount1 * totalSupply) / reserve1
    );
}

4. 移除流动性函数:按比例分配

移除流动性涉及返回每种代币的按比例数量:

dX, dY = 要移除的流动性数量

dX = s / T * X

dY = s / T * Y

证明

让我们计算 dX, dY 使得

v / L = s / T

其中

v = f(dx, dy) = √dXdY,

L = 总流动性 = √XY

s = 股份

T = 总供应

√dXdY = s / T * √XY

移除的流动性金额必须不改变价格,因此 dX / dY = x / y

替换 dY = dX * Y/ X

√dXdY = √(dX * dX * Y / X) = dX * √(Y / X)

将方程的两边都除以 √(Y / X)

dX = s / T * √(XY) / √(Y / X)= s / T * √(X²) = s / T * X

同样,dY = s / T * Y

  • 这个数学用于计算移除流动性时每种代币的数量 ( dxdy)。
  • 目标是确保移除的流动量与放弃的股份数量 ( s) 成正比。
  • 最终公式 dx = s / T * xdy = s / T * y 根据用户的总供应股份给出返回的每种代币的数量。

对应代码

amount0 = (_shares * bal0) / totalSupply;
amount1 = (_shares * bal1) / totalSupply;

查看恒定乘积 AMM 的代码文件在 Github

结论

随着 DeFi 生态系统的不断发展,恒定乘积 AMM 证明了去中心化金融的创新精神。它提供了一个关于未来的窗口,未来金融服务将变得更加可获取、透明和公平。

理解和改进 AMM 的旅程仍在继续,这是一段将数学的严谨性与区块链技术的无限可能性相结合的旅程。

  • 原文链接: medium.com/@tomarpari90/...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
tomarpari90
tomarpari90
江湖只有他的大名,没有他的介绍。