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 画一张图,把双曲线和交易过程可视化一下。
这张图里,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