3、Curve核心公式:StableSwap不变式的数学推导

从线性组合到非线性组合的演变

说实话,我第一次看到Curve的StableSwap公式时,第一反应是——这玩意儿怎么来的?

当时我在做一个稳定币兑换池的原型,用的还是传统的Uniswap V2公式。结果呢?稳定币之间兑换,滑点大得离谱。1万U换DAI,中间能亏掉几十刀。这显然不合理——稳定币之间价格应该接近1:1才对。

后来我仔细研究了Curve的白皮书,才明白它的核心思路:在恒定和与恒定积之间找一个平衡点

先从最简单的说起:恒定和公式

假设池子里有USDC和DAI两种稳定币,数量分别是x和y。

最理想的情况是什么?

你想想看,如果两者价格永远是1:1,那兑换就应该按1:1进行。数学上就是:

x + y = K

这就是恒定和公式。它的好处是滑点为零——你存100 USDC,就能取出100 DAI,一分不多一分不少。

但问题来了:如果池子里只有恒定和,那流动性提供者怎么赚钱?没人愿意无偿提供流动性。更致命的是,如果外部市场价格偏离了1:1,套利者会瞬间把池子掏空。

嗯,这里要注意:恒定和公式在现实中根本跑不通。

再来看恒定积公式:Uniswap的解法

Uniswap用的是恒定积公式:

x * y = K

这个公式的好处是:无论价格怎么变,池子永远不会枯竭。价格会随着供需自动调整,套利者会把价格拉回市场价。

但代价是什么?滑点。

我举个例子:假设池子里有100万USDC和100万DAI,K=10^12。你想用10万USDC换DAI:

  • 新x = 110万
  • 新y = 10^12 / 110万 ≈ 90.9万
  • 你得到的DAI = 100万 - 90.9万 = 9.1万

你看,10万U只换到9.1万DAI,滑点接近10%。对于稳定币来说,这完全不能接受。

核心矛盾:恒定和滑点低但不安全,恒定积安全但滑点高。Curve要做的,就是把两者结合起来。

StableSwap的核心思想:加权组合

Curve的做法很巧妙——它引入了一个参数χ(chi),用来控制恒定和与恒定积的权重:

χ * (x + y) + x * y = χ * K + K²/4

等等,这个公式看起来有点复杂。我来拆解一下:

  • 当χ很大时,χ*(x+y)占主导,公式趋近于恒定和
  • 当χ很小时,x*y占主导,公式趋近于恒定积
  • K是常数,K²/4是为了让公式在x=y时成立

我当初看到这个公式时,第一反应是:χ怎么取?

答案是:χ取决于池子的深度和稳定币的数量。Curve把χ定义为一个动态值:

χ = A * x * y / (x + y)²

这里A是一个常数,由协议设定。你看,当x≈y时,x*y/(x+y)² ≈ 1/4,χ ≈ A/4。当价格偏离时,χ会变小,公式向恒定积偏移。

说白了,这就是一个自适应机制:价格越接近1:1,滑点越低;价格偏离越大,滑点越高,防止池子被掏空。

完整的StableSwap公式

把χ代入,经过一番代数变换(我建议你自己推一遍,很有意思),得到最终的StableSwap不变式:

A * K * (x + y) + x * y = A * K² + K²/4

或者写成更通用的形式(n种稳定币):

A * n^n * K + D = A * n^n * K + (D / n)^n

其中D是总流动性,n是币种数量。

这个公式的美妙之处在于:

  • 在平衡点附近(x≈y),行为接近恒定和,滑点极低
  • 在极端情况下(某个币快被掏空),行为接近恒定积,保护池子
  • 参数A控制过渡的平滑程度
个人经验:我在实际部署时,A的取值一般在100-1000之间。太小了滑点高,太大了容易被操纵。建议先用模拟器跑一遍历史数据。

可视化理解:从线性到非线性的演变

下面这张图展示了三种公式的对比:

三种不变式曲线对比 x (USDC) y (DAI) 0 K/2 K 0 K/2 K 恒定和 (x+y=K) 恒定积 (x*y=K²/4) StableSwap (A=100) 平衡点 (K/2, K/2) 注:K为总流动性,A为放大系数

从图上可以清楚看到:

  • 红色虚线(恒定和):直线,滑点为零,但池子不安全
  • 蓝色虚线(恒定积):双曲线,安全但滑点大
  • 绿色实线(StableSwap):在平衡点附近贴近直线,远离时贴近双曲线

这就是我说的非线性组合——它不是简单的加权平均,而是根据当前状态动态调整。

实际部署中的坑

我曾经踩过的坑:第一次部署时,我把A设成了5000,觉得越大越好。结果池子刚上线,一个巨鲸用1000万U来回刷了几笔,因为滑点太低,他几乎零成本套利,我亏了不少手续费。后来我把A调到了200,加了滑点保护,才稳住。

所以我的建议是:

  1. A值不要贪大,100-500之间比较安全
  2. 一定要加滑点限制,比如单笔交易不能超过池子总量的5%
  3. 模拟极端情况,比如某个币被大量买入/卖出时,公式是否还能保护池子

小结

StableSwap的核心思想,说白了就是一句话:在稳定币这个特定场景下,用数学公式把恒定和的低滑点和恒定积的安全性结合起来

这个思路后来被很多协议借鉴,比如Uniswap V3的集中流动性、Balancer的加权池,本质上都是在做类似的事——针对特定资产类型,设计更优的做市曲线。

我个人觉得,Curve最厉害的地方不是公式本身,而是它精准地找到了稳定币这个场景的数学最优解。有时候,最好的设计不是最复杂的,而是最贴合场景的。


专注资料整理