恒定乘积自动做市商 (CPAMM) 学习笔记

恒定乘积自动做市商 (CPAMM) 学习笔记

核心摘要 (Key Takeaways)

  • CPAMM 核心公式X×Y=KX \times Y = K 是恒定乘积自动做市商(Constant Product Automated Market Maker, CPAMM)的核心,它定义了去中心化交易所(DEX)中流动性池中两种资产数量的关系。
  • DEFI 基石:该公式是 2020-2021 年 DEFI 浪潮的起点,支撑了数百亿美元的 DEFI 市值发展,实现了无需中心化对手方的代币交换。
  • 交换中的 K 值恒定:在用户进行代币买卖(Swap)时,池子的总流动性 KK 保持不变,但池中两种代币的比例会根据交易量动态调整。
  • 滑点 (Slippage):交易量相对于池子总流动性的比例越大,交易产生的滑点就越大,导致实际成交价格偏离预期市场价格。用户在交易时可设置滑点容忍度
  • 流动性提供者 (LP):用户可以通过向池子提供两种代币,成为流动性提供者,获得 LP 凭证 (LPT) 并赚取交易手续费;添加和移除流动性会改变 KK 值。

1. 恒定乘积自动做市商 (CPAMM) 核心原理

1.1 定义与核心公式

  • 名称恒定乘积自动做市商 (Constant Product Automated Market Maker, CPAMM),简称 AMMCPMM
  • 核心公式X×Y=K X \times Y = K
    • X:池中 token0 的数量。
    • Y:池中 token1 的数量。
    • K:池子的总流动性 (Liquidity)。在用户进行代币交换(Swap)时,K 值保持恒定。
  • 数学图像:如果将公式表示为 Y=K/XY = K/X,其在坐标系中呈现为一条双曲线。在这条曲线上的任何点,X 和 Y 的乘积都等于 K。
  • 对比:与恒定乘积 AMM 相对,还有理论上的恒定和自动做市商 (Constant Sum AMM),其公式为 X+Y=KX + Y = K。但这种模型在实际中几乎不被使用,因为它无法在不耗尽其中一种资产的情况下支持无限交易。

1.2 DEFI 中的重要性

  • CPAMM 公式是 Uniswap 等去中心化交易所(DEX)的核心机制,直接推动了 DEFI 市场的爆发式增长,实现了无需传统订单簿的自动化做市。

1.3 交易机制

CPAMM 允许用户在没有中心化对手方的情况下进行代币交换。其基本逻辑是:当一种代币进入池子,另一种代币就会流出池子,以维持 X×Y=KX \times Y = K 的恒定乘积。

  • 用户卖出 token0 (买入 token1)
    • 用户将 ΔX\Delta X 数量的 token0 卖给池子。
    • 池中 token0 数量增加:XX+ΔXX \rightarrow X + \Delta X
    • 为了保持 KK 值不变,池中 token1 数量必须减少:YYΔYY \rightarrow Y - \Delta Y
    • 公式变为:(X+ΔX)×(YΔY)=K(X + \Delta X) \times (Y - \Delta Y) = K
  • 用户买入 token0 (卖出 token1)
    • 用户从池子中买入 ΔX\Delta X 数量的 token0。
    • 池中 token0 数量减少:XXΔXX \rightarrow X - \Delta X
    • 为了保持 KK 值不变,池中 token1 数量必须增加:YY+ΔYY \rightarrow Y + \Delta Y
    • 公式变为:(XΔX)×(Y+ΔY)=K(X - \Delta X) \times (Y + \Delta Y) = K

2. 案例展示与计算

以下案例均基于一个初始的 ETH/USDT 交易对池:

  • ETH (X) = 10 个
  • USDT (Y) = 20,000 个
  • 初始流动性 (K) = 10×20,000=200,00010 \times 20,000 = 200,000

2.1 场景一:用户卖出 5 ETH (买入 USDT)

  • 操作:用户向池子卖出 5 ETH。
  • 池子变化
    • ETH 数量变为:10+5=1510 + 5 = 15
    • USDT 数量变为:20,000ΔY20,000 - \Delta Y
  • 计算 ΔY\Delta Y(10+5)×(20,000ΔY)=200,000(10 + 5) \times (20,000 - \Delta Y) = 200,000 15×(20,000ΔY)=200,00015 \times (20,000 - \Delta Y) = 200,000 20,000ΔY=200,0001513333.3320,000 - \Delta Y = \frac{200,000}{15} \approx 13333.33 ΔY=20,00013333.33=6666.67\Delta Y = 20,000 - 13333.33 = 6666.67
  • 结果:用户卖出 5 ETH,可以获得 6666.67 USDT

2.2 场景二:用户持有 10,000 USDT 买入 ETH

  • 操作:用户向池子卖出 10,000 USDT,买入 ETH。
  • 池子变化
    • USDT 数量变为:20,000+10,000=30,00020,000 + 10,000 = 30,000
    • ETH 数量变为:10ΔX10 - \Delta X
  • 计算 ΔX\Delta X(10ΔX)×(20,000+10,000)=200,000(10 - \Delta X) \times (20,000 + 10,000) = 200,000 (10ΔX)×30,000=200,000(10 - \Delta X) \times 30,000 = 200,000 10ΔX=200,00030,0006.6710 - \Delta X = \frac{200,000}{30,000} \approx 6.67 ΔX=106.67=3.33\Delta X = 10 - 6.67 = 3.33
  • 结果:用户用 10,000 USDT,可以买入 3.33 ETH

2.3 场景三:极端情况 - 用户卖出 100,000 ETH

  • 操作:用户向池子卖出 100,000 ETH (远超池中 ETH 数量)。
  • 池子变化
    • ETH 数量变为:10+100,000=100,01010 + 100,000 = 100,010
    • USDT 数量变为:20,000ΔY20,000 - \Delta Y
  • 计算 ΔY\Delta Y(10+100,000)×(20,000ΔY)=200,000(10 + 100,000) \times (20,000 - \Delta Y) = 200,000 100,010×(20,000ΔY)=200,000100,010 \times (20,000 - \Delta Y) = 200,000 20,000ΔY=200,000100,0101.999820,000 - \Delta Y = \frac{200,000}{100,010} \approx 1.9998 ΔY=20,0001.9998=19998.0002\Delta Y = 20,000 - 1.9998 = 19998.0002
  • 结果:用户卖出 100,000 ETH,可以获得约 19998 USDT
  • 分析:即使交易量远超池中现有资产,CPAMM 理论上也能完成交易。池子中的 USDT 会被几乎掏空,但永远不会完全为零,会无限接近于零。这表明 CPAMM 曲线可以支撑代币在任何价格上的买卖。

2.4 场景四:小额交易 - 用户卖出 0.01 ETH

  • 操作:用户向池子卖出 0.01 ETH。
  • 池子变化
    • ETH 数量变为:10+0.01=10.0110 + 0.01 = 10.01
    • USDT 数量变为:20,000ΔY20,000 - \Delta Y
  • 计算 ΔY\Delta Y(10+0.01)×(20,000ΔY)=200,000(10 + 0.01) \times (20,000 - \Delta Y) = 200,000 10.01×(20,000ΔY)=200,00010.01 \times (20,000 - \Delta Y) = 200,000 20,000ΔY=200,00010.0119980.0199820,000 - \Delta Y = \frac{200,000}{10.01} \approx 19980.01998 ΔY=20,00019980.0199819.98\Delta Y = 20,000 - 19980.01998 \approx 19.98
  • 结果:用户卖出 0.01 ETH,可以获得约 19.98 USDT
  • 分析:小额交易对池子影响小,执行价格会非常接近市场价。

3. 价格与滑点 (Slippage)

3.1 价格决定机制

  • 市场供需:CPAMM 池中代币的价格由市场供需关系自动决定。
  • 套利机器人:如果池内价格与外部市场价格出现差异,套利机器人会迅速介入,通过在价格较低的池子买入并在价格较高的市场卖出,从而将池内价格“搬平”,使其与市场价保持一致。

3.2 即时价格 (Spot Price)

  • 定义:池中两种 token 数量的比值,代表当前池子的理论价格。
  • 公式
    • Ptoken0=Y/XP_{token0} = Y/X
    • Ptoken1=X/YP_{token1} = X/Y
  • 初始价格计算 (基于初始池子)PETH=20,000 USDT10 ETH=2000 USDT/ETHP_{ETH} = \frac{20,000 \text{ USDT}}{10 \text{ ETH}} = 2000 \text{ USDT/ETH} PUSDT=10 ETH20,000 USDT=0.0005 ETH/USDTP_{USDT} = \frac{10 \text{ ETH}}{20,000 \text{ USDT}} = 0.0005 \text{ ETH/USDT}

3.3 滑点 (Slippage)

  • 定义:衡量实际成交价格与预期市场价格之间的差异。在 DEX 中,由于交易会改变池中代币的比例,大额交易会导致价格显著偏离即时价格。
  • 公式Slippage=Execution PriceExpected PriceExpected Price×100% Slippage = \frac{\text{Execution Price} - \text{Expected Price}}{\text{Expected Price}} \times 100\%
    • Execution Price (执行价格):实际成交的单价。
    • Expected Price (预期价格):交易发生前的即时价格 (Spot Price)。
  • 滑点容忍度 (Slippage Tolerance):用户在进行交易时可以设置的最大可接受滑点百分比。如果实际滑点超过此容忍度,交易将失败。
  • 案例滑点计算
    • 场景一 (卖出 5 ETH)
      • 预期价格:2000 USDT/ETH
      • 执行价格:6666.67 USDT5 ETH=1333.33 USDT/ETH\frac{6666.67 \text{ USDT}}{5 \text{ ETH}} = 1333.33 \text{ USDT/ETH}
      • 滑点:1333.3320002000×100%=33.33%\frac{1333.33 - 2000}{2000} \times 100\% = -33.33\% (用户实际卖出价格远低于预期)
    • 场景二 (买入 3.33 ETH)
      • 预期价格:2000 USDT/ETH
      • 执行价格:10000 USDT3.33 ETH=3003 USDT/ETH\frac{10000 \text{ USDT}}{3.33 \text{ ETH}} = 3003 \text{ USDT/ETH}
      • 滑点:300320002000×100%=50.15%\frac{3003 - 2000}{2000} \times 100\% = 50.15\% (用户实际买入价格远高于预期)
    • 场景三 (卖出 100,000 ETH)
      • 预期价格:2000 USDT/ETH
      • 执行价格:19998 USDT100000 ETH=0.2 USDT/ETH\frac{19998 \text{ USDT}}{100000 \text{ ETH}} = 0.2 \text{ USDT/ETH}
      • 滑点:0.220002000×100%99.99%\frac{0.2 - 2000}{2000} \times 100\% \approx -99.99\% (极端亏损)
    • 场景四 (卖出 0.01 ETH)
      • 预期价格:2000 USDT/ETH
      • 执行价格:19.98 USDT0.01 ETH=1998 USDT/ETH\frac{19.98 \text{ USDT}}{0.01 \text{ ETH}} = 1998 \text{ USDT/ETH}
      • 滑点:199820002000×100%=0.1%\frac{1998 - 2000}{2000} \times 100\% = -0.1\% (滑点很小,接近市场价)

3.4 滑点影响因素与池子深度

  • 交易量比例:交易量占池子总流动性的比例越大,产生的滑点越大。
  • 池子深度 (Liquidity Depth)
    • 定义:衡量池子中总流动性的大小。K 值(或 L 值)越大,池子越深。
    • 影响:池子越深,对于相同交易量的冲击(Price Impact)越小,交易产生的滑点也越小。
    • 大户交易:大额交易者需要寻找深度足够的流动性池,以确保交易以接近市场价的价格成交,减少磨损。

4. 流动性与提供者

4.1 流动性 (Liquidity)

  • K 值:直接表示 X×YX \times Y 的乘积,可以用来衡量流动性的大小。
  • L 值:在实际应用中,为了保持量纲一致性(例如,如果 X 和 Y 都是 token 数量,K 的量纲是 token 数量的平方),通常使用 L=X×YL = \sqrt{X \times Y} 来表示流动性。L 值与 K 值同样可以衡量池子的深浅。

4.2 流动性提供者 (Liquidity Provider, LP)

  • 定义:向交易池提供两种代币资产以增加流动性的用户。
  • 动机:通过提供流动性,LP 可以赚取该池子中所有交易产生的手续费。
  • 行业术语
    • “做 LP”:指提供流动性。
    • “LP 赚了很多钱”:指通过提供流动性赚取了手续费。

4.3 LP 凭证 (Liquidity Provider Token, LPT)

  • 定义:LP 提供流动性后,会收到一个代表其在池中份额的凭证代币。
  • 作用:LPT 证明了 LP 对池子的所有权,可以用来赎回其提供的流动性及赚取的手续费。
  • 协议标准
    • Uniswap V2:LPT 通常是 ERC-20 协议代币。
    • Uniswap V3:LPT 是 ERC-721 协议的 NFT,因为 V3 引入了集中流动性,每个 LP 头寸都是独特的。

5. 添加与移除流动性

5.1 添加流动性 (Add Liquidity)

  • 原则:LP 在添加流动性时,必须按照当前池中两种代币的市场价格比例(即 X:YX:Y 比例)进行添加。
    • 公式XnewYnew=XoldYold\frac{X_{new}}{Y_{new}} = \frac{X_{old}}{Y_{old}}X+ΔXY+ΔY=XY\frac{X + \Delta X}{Y + \Delta Y} = \frac{X}{Y}
    • 原因:如果 LP 不按比例添加,会直接改变池子的价格,并立即被套利机器人“搬平”,导致 LP 承担损失。
  • 初始流动性
    • 对于一个新发行的代币,项目方首次在 DEX 上线并提供流动性时,这被称为添加初始流动性
    • 初始流动性决定了该代币的初始发行价格(或开盘价)
  • K 值变化:添加流动性时,池中的 XXYY 都会增加,因此 K 值会增加 (Knew>KoldK_{new} > K_{old})。

5.2 移除流动性 (Remove Liquidity)

  • 原则:LP 在移除流动性时,也是按照移除时池子的当前比例进行移除。
    • 公式XremovedYremoved=XcurrentYcurrent\frac{X_{removed}}{Y_{removed}} = \frac{X_{current}}{Y_{current}}
  • 重要性:由于市场交易可能导致池中 X:YX:Y 的比例发生变化,LP 移除流动性时获得的两种代币数量,很可能与最初添加时的数量不一致
    • 例子:如果 LP 在 ETH 价格为 2000 USDT/ETH 时添加了 5 ETH 和 10,000 USDT,但之后 ETH 价格上涨,池中 ETH 变少,USDT 变多,LP 移除时可能会获得少于 5 ETH 但多于 10,000 USDT 的资产。
  • 撤底池 (Rug Pull)
    • 定义:项目方将所有初始提供的流动性全部移除。
    • 含义:通常意味着项目方“跑路”,导致代币失去流动性,价格暴跌。
  • K 值变化:移除流动性时,池中的 XXYY 都会减少,因此 K 值会减少 (Knew<KoldK_{new} < K_{old})。

6. AMM 交易流程 (Mermaid Diagram)

graph TD
    A[用户发起交易请求] --> B{选择交易对和数量};
    B --> C{计算预期价格和滑点};
    C --> D{用户确认交易};
    D -- (X * Y = K) --> E[更新池子中Token数量];
    E --> F[计算实际成交价格];
    F --> G{用户收到Token};
    G --> H[套利机器人监测价格差异];
    H -- (若存在套利机会) --> I[套利机器人执行交易];
    I --> E;
graph TD
    A[用户发起交易请求] --> B{选择交易对和数量};
    B --> C{计算预期价格和滑点};
    C --> D{用户确认交易};
    D -- (X * Y = K) --> E[更新池子中Token数量];
    E --> F[计算实际成交价格];
    F --> G{用户收到Token};
    G --> H[套利机器人监测价格差异];
    H -- (若存在套利机会) --> I[套利机器人执行交易];
    I --> E;
graph TD
    A[用户发起交易请求] --> B{选择交易对和数量};
    B --> C{计算预期价格和滑点};
    C --> D{用户确认交易};
    D -- (X * Y = K) --> E[更新池子中Token数量];
    E --> F[计算实际成交价格];
    F --> G{用户收到Token};
    G --> H[套利机器人监测价格差异];
    H -- (若存在套利机会) --> I[套利机器人执行交易];
    I --> E;

流程解释

  1. 用户发起交易请求:用户决定要交换的代币对(例如 ETH/USDT)和数量。
  2. 计算预期价格和滑点:AMM 根据当前池中代币的比例计算理论上的预期价格,并预估此次交易可能产生的滑点。用户在此阶段会看到预估的滑点,并可以设置滑点容忍度
  3. 用户确认交易:用户审查预期价格和滑点后,决定是否执行交易。
  4. 更新池子中 Token 数量:一旦交易确认,AMM 会根据核心公式 X×Y=KX \times Y = K 来调整池中两种代币的数量。例如,用户卖出 ETH,池中 ETH 增加,USDT 减少。
  5. 计算实际成交价格:根据更新后的池子状态,确定最终的成交价格。
  6. 用户收到 Token:用户收到其购买的代币。
  7. 套利机器人监测价格差异:在整个过程中,套利机器人持续监控 AMM 池内的价格与外部市场价格。
  8. 套利机器人执行交易:如果 AMM 价格与外部市场价格存在差异,套利机器人会立即执行交易,在价格较低的地方买入,在价格较高的地方卖出,从而赚取利润。
  9. 更新池子中 Token 数量 (通过套利):套利交易也会导致池中代币数量更新,这有助于将 AMM 池的价格重新校准到与外部市场一致。

7. 总结

  • CPAMM 核心X×Y=KX \times Y = K 是其基石,实现了去中心化环境下的自动化做市。
  • K 值动态
    • 代币交换 (Swap) 过程中,K 值保持恒定。
    • 添加流动性移除流动性时,K 值会发生变化(增加或减少)。
  • 滑点关键:交易量占池子总流动性的比例是影响滑点大小的关键因素。交易量越大,池子越浅,滑点越大。用户可以通过设置滑点容忍度来控制交易风险。
  • 流动性提供者:LP 通过提供流动性来赚取手续费,但需注意无常损失和移除流动性时资产比例可能变化的问题。