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%。对于稳定币来说,这完全不能接受。
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控制过渡的平滑程度
可视化理解:从线性到非线性的演变
下面这张图展示了三种公式的对比:
从图上可以清楚看到:
- 红色虚线(恒定和):直线,滑点为零,但池子不安全
- 蓝色虚线(恒定积):双曲线,安全但滑点大
- 绿色实线(StableSwap):在平衡点附近贴近直线,远离时贴近双曲线
这就是我说的非线性组合——它不是简单的加权平均,而是根据当前状态动态调整。
实际部署中的坑
所以我的建议是:
- A值不要贪大,100-500之间比较安全
- 一定要加滑点限制,比如单笔交易不能超过池子总量的5%
- 模拟极端情况,比如某个币被大量买入/卖出时,公式是否还能保护池子
小结
StableSwap的核心思想,说白了就是一句话:在稳定币这个特定场景下,用数学公式把恒定和的低滑点和恒定积的安全性结合起来。
这个思路后来被很多协议借鉴,比如Uniswap V3的集中流动性、Balancer的加权池,本质上都是在做类似的事——针对特定资产类型,设计更优的做市曲线。
我个人觉得,Curve最厉害的地方不是公式本身,而是它精准地找到了稳定币这个场景的数学最优解。有时候,最好的设计不是最复杂的,而是最贴合场景的。