2. 恒定乘积公式:x·y = k 的数学原理

好,咱们直接进入正题。恒定乘积公式,说白了就是 Uniswap 这类 AMM 的数学心脏。公式本身极其简单:x · y = k。x 和 y 是池子里两种代币的数量,k 是一个常数。

但越简单的东西,往往水越深。我当年第一次看到这个公式时,心想:「就这?」结果在实际项目中踩了不少坑,才真正理解它的精妙之处。

2.1 为什么是双曲线?

咱们把公式变形一下:y = k / x。这不就是反比例函数吗?在坐标系里画出来,就是一条双曲线。

为什么会选择双曲线?我个人习惯从两个角度理解:

  • 价格自动调节:双曲线是凸的。当 x 变少(被买走),y 就会变多(被存入),价格自然上升。反过来也一样。这种机制不需要预言机,纯数学驱动。
  • 流动性永不枯竭:双曲线无限接近坐标轴,但永远不会相交。这意味着,无论价格多极端,池子里永远有币可换。你想想看,这在传统订单簿里是不可能的。

核心洞察:双曲线的凸性保证了「滑点」的存在。交易量越大,滑点越高。这其实是一种内置的防操纵机制。

2.2 公式的边界条件分析

边界条件,说白了就是「极端情况」。我在项目中遇到过几次因为忽略边界条件导致的资金损失,所以这块咱们重点拆解。

2.2.1 当 x → 0 或 y → 0

理论上,x 和 y 都不能为 0。因为一旦为 0,k 就变成 0,整个池子就废了。但实际中,有没有可能无限接近 0?

嗯,这里要注意:双曲线永远不会触达坐标轴。但现实中,如果某个代币被大量买入,它的数量会变得极小。这时候,另一个代币的价格会变得极高。

避坑指南:我曾经在测试网上部署过一个池子,为了演示效果,把初始流动性设得很低。结果一个交易就把 x 推到了接近 0 的位置,导致后续交易滑点高达 90% 以上。所以,初始流动性一定要充足,否则池子形同虚设。

2.2.2 当 k 值变化

k 是常数,但只在单次交易中不变。当有人添加或移除流动性时,k 会重新计算。

操作 对 k 的影响 对价格的影响
添加流动性 k 增大 价格不变(按比例添加)
移除流动性 k 减小 价格不变(按比例移除)
交易(Swap) k 不变 价格变化

这里有个容易忽略的点:添加流动性时,必须按当前比例添加。如果你只添加一种代币,实际上是在做交易,而不是提供流动性。这会导致无常损失。

2.2.3 价格极限

当 x 趋近于 0 时,y 的价格趋近于无穷大。反过来也一样。这意味着,理论上价格可以无限高,也可以无限低。

但实际中,价格不可能无限。因为当价格高到一定程度时,套利者会从其他交易所买入更便宜的代币,然后在这个池子里卖出,把价格拉回来。

我的经验:在实际项目中,我们通常会设置一个「价格范围」来限制流动性提供者的风险。比如 Uniswap V3 的集中流动性,就是基于这个思路。说白了,就是让 LP 在某个价格区间内提供流动性,超出范围就不参与。

2.3 公式的几何意义

咱们用 SVG 画一张图,把双曲线和交易过程可视化一下。

x (Token A) y (Token B) A (初始状态) B (买入后) 图例 初始点 交易后点 交易路径

这张图里,A 点是初始状态。当你买入 Token A 时,x 减少,y 增加,状态沿着双曲线移动到 B 点。注意看,从 A 到 B 的路径是曲线,不是直线。这意味着价格在变化。

为什么不是直线?因为如果是直线,价格就恒定了,那就不叫 AMM 了,叫固定价格兑换。双曲线的曲率决定了滑点的大小。

2.4 公式的数学推导

咱们来点硬核的。假设你要用 Δx 个 Token A 换取 Δy 个 Token B。交易后,池子里的数量变为:

x' = x + Δx
y' = y - Δy

根据恒定乘积公式:

(x + Δx) · (y - Δy) = x · y

展开后:

x·y - x·Δy + Δx·y - Δx·Δy = x·y

两边消去 x·y:

- x·Δy + Δx·y - Δx·Δy = 0

整理一下:

x·Δy = Δx·y - Δx·Δy
x·Δy + Δx·Δy = Δx·y
Δy · (x + Δx) = Δx · y

最终得到:

Δy = (Δx · y) / (x + Δx)

这个公式就是交易的核心。你投入 Δx,能换回多少 Δy,全由它决定。

关键点:注意分母是 (x + Δx),不是 x。这意味着,你投入的 Δx 越大,分母越大,能换回的 Δy 就越少。这就是滑点的数学本质。

2.5 实际应用中的注意事项

公式本身很简单,但实际用起来有几个坑:

  • 精度问题:在 Solidity 中,整数除法会截断。所以实际实现时,要先乘后除,避免精度损失。
  • 手续费:实际池子会收 0.3% 的手续费。这部分费用会重新注入池子,导致 k 缓慢增大。长期来看,LP 的收益就来自这里。
  • 闪电贷攻击:攻击者可以利用大额交易操纵价格,然后通过其他合约获利。这就是为什么很多池子要加「价格预言机」保护。

我的建议:如果你要自己实现一个 AMM,一定要先跑一遍完整的测试用例。包括极端价格、大额交易、闪电贷模拟。我曾经因为少测了一个边界条件,上线第一天就被机器人薅了羊毛。

好了,恒定乘积公式的数学原理就拆解到这里。记住,双曲线不是随便选的,它完美平衡了「价格发现」和「流动性」两个需求。下一节咱们会深入无常损失,到时候你会发现,所有的问题根源都在这个公式里。


公众号:蓝海资料掘金营,微信deep3321