CSAMM曲线做市商深度解析:从AMM原理到链上部署实战
2026/9/24 22:03:38 网站建设 项目流程

先说个题外话:现在搜“AMM”这个词,出来的结果非常有意思,有讲内存管理模式(Automatic Memory Management)的,有附送民航维修手册(Aircraft Maintenance Manual)的,甚至还有游戏社区里的奇怪缩写。但我今天要聊的“AMM”是 Automated Market Maker,自动化做市商,具体到标题里的 CSAMM,全称是 Curve-Shaped Automated Market Maker,也就是“曲线形状的自动做市商”。这是 DeFi 底层最核心的算法之一,表面上只是换个函数式子,实际牵扯到滑点、无常损失、资金效率、价格预言机安全等一系列问题,值得把原理和落地细节掰开揉碎讲清楚。

CSAMM 并不是一个凭空想象的概念,它的核心思想来自 Curve Finance 那条著名的混合曲线,以及 Uniswap V3 对集中流动性的尝试。很多人把 CSAMM 简单理解为“画一条更好看的曲线”,这个理解过于表面。真正上手调过池子参数的人会知道,曲线形状决定了一笔交易会吃掉多少深度,决定了 LP 在什么价格区间能赚到手续费,也决定了极端行情下有没有人敢继续提供流动性。说它是做市商算法的灵魂并不夸张。

下面我从曲线模型的演变开始讲,然后把 CSAMM 的数学公式、模拟过程、链上部署、实盘参数调优这几个维度逐个展开,最后聊几句我在实际测试中的个人判断。全程会用 Python 做量化模拟,也会给出可复现的代码思路。

1. 为什么做市商曲线要“弯”:恒定乘积、恒定和与 CSAMM 所处的生态位

1.1 从订单簿撮合到链上资金池的范式转换

传统交易所的做市商逻辑是基于订单簿的。做市商挂买单和卖单,赚取买卖价差,同时承担库存风险。这套机制在中心化撮合环境下运行得非常好,因为撮合引擎可以精确匹配订单,做市商也可以随时撤单、加单、调整报价。但链上环境下,每一个挂单都是一笔状态写入,要消耗 Gas,还要考虑延迟。没有人能在以太坊上像做市商盯盘那样每秒更新几百次订单,除非使用 Layer2 或者专用基础设施。于是 AMM 应运而生,把“报价”这件事从人工行为变成了数学函数,任何人往池子里注入资产,算法自动给出买卖价格。

最早的 Uniswap V2 用的是恒定乘积公式:x * y = k。这个公式最大的优点是简单、无需外部价格输入,在任意价格区间都有流动性。但它有个致命的代价:滑点巨大。比如一个 ETH/USDC 池子,如果深度不够,大额买单会把价格推到非常离谱的位置。为了给 LP 提供更优的资本效率,Uniswap V3 改变了思路,允许 LP 在某个价格区间集中提供流动性,相当于把曲线切成一段段来管理,这就是著名的集中流动性模型。CSAMM 则选择了另一条路:不切区间,而是直接用一条可在不同价格区间改变曲率的连续曲线来覆盖整个价格空间。

从工程角度看,CSAMM 试图同时解决两个问题:一是保持链上状态简单,不需要像 V3 那样维护复杂的 tick 索引和位置授权;二是在波动资产和稳定资产之间找到一个可连续调节的中间点,让同一套核心函数能用在不同风险等级的池子上。

1.2 简单曲线家族的“性格差异”

要理解 CSAMM 放在哪个位置上,可以把 AMM 里常见的几种不变式类比成不同性格的“报价员”:

  • 恒定乘积 x * y = k:报价员永远在线,价格范围无限宽,但问的人越多,他给出的价格波动越剧烈。对应的是通用型资产,比如 ETH/WETH 这种高波动组合。
  • 恒定和 x + y = k:报价员非常“固执”,无论池子里的资产比例怎么变,价格始终是 1:1 或某个固定比例。这对稳定币交易非常友好,比如 USDC/USDT 互换,但一旦锚定被打破,池子中的偏科资产会被清空,流动性直接崩溃。
  • 加权乘积 (x^a) * (y^b) = k:报价员虽然能设定初始价格比例,但中间价格的滑点曲线依然接近 x*y=k,没有本质区别。
  • Curve 混合不变式 / CSAMM:报价员会根据地池子失衡程度自动调整“固执程度”。池子接近均衡时,按恒定和走,滑点极低,适合大额稳定币互换;池子严重失衡时,按恒定乘积走,避免一侧资产被完全抽干,保证池子永远有流动性。

这个“性格”描述听起来很美,但实际实现时难点在于:如何判断“接近均衡”和“严重失衡”,如何平滑地在两种曲线形态之间切换,而不是在某个临界点发生跳变。CSAMM 的做法是用一个曲率参数“插值”不同类型的曲线,而不是生硬地做分段函数。

1.3 CSAMM 在“AMM 多元宇宙”里的特殊位置

不少人会把 CSAMM 和 Curve V1 划等号,这是不准确的。Curve V1 的混合公式最初针对的是同价位资产,比如稳定币与锚定资产,它在 1:1 附近提供了极低滑点,但一旦偏离锚定价格太远,深度会迅速衰减。CSAMM 的思路更接近 Curve V2:允许池子设定任意锚定价格,同时通过动态曲率参数来调整价格偏移后的反弹力度。

以我在测试网上的经验来看,CSAMM 的核心价值体现在三个方面:第一,同样的资金量,在价格不剧烈偏离锚定区间时,做市深度远好于恒定乘积池;第二,设置锚定价格后,只要外部真实价格没有发生趋势性变化,池子的报价会稳定在一个窄区间,非常有利于做市商计算预期收益;第三,因为状态参数比 Uniswap V3 的 tick 结构简单得多,Gas 消耗和合约复杂度都有优势。

看到这里你应该已经明白,CSAMM 不是一种“更好”的 AMM,而是一种更擅长在“锚定资产”和“低波动资产”场景里发挥资金效率的 AMM。它不适合所有资产,也不应该被当作万能公式。后面我会逐步拆解它的数学本质和工程边界。

2. CSAMM 的曲线方程拆解:从公示推导到参数直觉

2.1 从 Uniswap 公式到可调曲率的一般化形式

聊数学之前先建立一个直觉:任何 AMM 不变式,本质上都是给“价格”和“池子比例”之间建立某种约束。比如 xy=k,它的边际价格是 y/x,也就是池子里两种资产的数量之比。价格会随着交易量变化,变化速率取决于池子的深度,深度又取决于 k 的大小。所以那些想优化 AMM 的人,做的事情本质上都是:如何在保持 xy=k 这类基础约束的前提下,引入更复杂的关系,让价格变化曲线更符合某一类资产的期望。

CSAMM 的常见写法是对 Curve 混合不变式的推广。Curve V1 的核心公式是:

[ \chi D^{n-1} + \sum x_i = \chi D^{n-1} + \frac{D^n}{n^n \prod x_i} ]

这个式子看起来吓人,拆开看其实就两层含义。左侧的 (\sum x_i) 对应恒定和曲线的特征:池子总资产量固定。右侧的分母 (\prod x_i) 来自恒定乘积:资产量乘积固定。系数 (\chi) 决定这条曲线更偏向哪一边。(\chi) 越大,恒定和主导,曲线更“平”,滑点更低;(\chi) 越小,恒定乘积主导,曲线更“弯”,滑点更高但更抗抽干。

Curve V2 做了一点升级:(\chi) 不再是一个固定常数,而是和池内资产比例相关。当池内比例接近锚定比例时,(\chi) 自动变大;当比例失衡时,(\chi) 自动变小。这个动态切换正是“曲线形状”的核心意义。CSAMM 可以理解成把这种思路一般化:不限于稳定币,而是允许用户通过参数 A 来调节“多少比例失衡后开始弯曲”。

2.2 曲率参数 A 和 D 的实际含义

在 CSAMM 的构造函数里,你会经常看到两个参数:A 和 D。A 是放大系数,决定曲线在锚定区的“平坦程度”。D 是池子总流动性尺度,可以理解为池子的“天平刻度”。

我用一个二维双币池来举例,方便理解。假设池子为 x 和 y 两种资产,锚定价格为 p,那么 A 的作用是:当 x/y = p 时,边际价格对交易大小非常不敏感,一个相当大的订单只会造成很小的滑点;当交易把 x/y 推到 p 的偏离范围之外后,曲线会迅速向恒定乘积退化,价格开始剧烈变化,阻止交易者继续把池子推向单边。

A 的取值不是越大越好。A 太大,池子会呈现出严重的单位根行为,意思是价格在锚定范围内极度“粘滞”,一旦外部真实价格发生趋势性变化,套利者需要非常大的交易量才能把池内价格拽到真实价格,这段时间内其他用户会以严重偏离市场的价格成交。A 太小,又失去了低滑点的优势,变成和 Uniswap V2 差不多的东西。所以 A 更像是一个“信任阈值”,背后隐含了“这个资产的真实价格波动不会超过某个范围”的假设。

D 则是做市策略里最重要的状态变量。每一次交易或流动性注入,D 都会重新迭代计算。可以把它理解成“池子当前总流动性对应的不变值”,它决定了同样的交易量在池子里引起的价格变化幅度。D 越大,滑点越小;D 越小,滑点越大。当有人增加流动性时,D 增加;当有人撤走流动性时,D 减少。整体机制和恒定乘积里的 k 很相似,但计算方式复杂得多,因为需要在公式两侧对 x、y 同时做牛顿迭代求解。

2.3 动态曲率时,预言机扮演什么角色

CSAMM 里有一个常被忽略的细节:如果 A 是固定常量,池子的锚定价格就完全取决于初始注入的 x 和 y 比例。一旦外部真实价格偏离初始比例,套利者会反复和池子博弈,直到池内比例被推到新的平衡点,但此时池子的价格参考意义已经不大了。

更成熟的 CSAMM 实现会引入链上价格预言机,比如 Uniswap V2 的时间加权平均价格 TWAP,或者 Chainlink 的喂价。预言机的作用是动态调整锚定价格,让池子始终追踪“真实市场价格”。这样一来,A 不需要盲目设置很大,因为即使价格发生趋势性变化,锚定价格也会跟随预言机更新,池子不会在一个错误的价格上死守。

但预言机本身也是攻击面。如果直接读取某个单一来源的现货价格,攻击者可以先用一笔大额交易操纵现货价格,再立刻在 AMM 池子里完成套利,这就是典型的价格预言机闪电贷攻击。CSAMM 的合约设计里,通常会用“指数移动平均 EMA”对价格做平滑处理,避免短期内价格突变影响锚定值。更激进的设计甚至会把内部价格反馈和外部预言机价格做加权平均,防止任何单一来源被操纵。

3. 用 Python 模拟 CSAMM:滑点、深度与无常损失的量化对比

讲完公式,我们要做点动手实践。只看数学公式很难体会 CSAMM 和传统曲线的差别,我建议你用 Python 搭一个极简模型,模拟几组交易,量化对比恒定乘积、Curve 风格混合曲线在滑点和无常损失上的表现。下面的代码只是教学演示,不是生产级实现,但足以帮你建立数值直觉。

3.1 搭建一个极简的双币 CSAMM 模拟器

为了实现方便,我采用二维池子,并用简化版的混合不变式代替完整 Curve 公式。核心函数有三个:计算池内边际价格、执行交易并返回成交数量、根据新比例更新状态变量。

import math class CSAMMSimulator: def __init__(self, x, y, A, anchor_price): self.x = x self.y = y self.A = A self.anchor_price = anchor_price self.d = self.calculate_D(x, y) def calculate_D(self, x, y): # 简化迭代法求D d = x + y for _ in range(256): d_prev = d # Curve混合不变式的二维简化形式 # K = A * D + (x + y) - A * D^2 / (4*x*y) - D / 2 # 这里直接采用牛顿迭代逼近 k = self.A * d + (x + y) - self.A * d * d / (4 * x * y) - d / 2 d = d_prev - (d_prev - k) / 2 return d def price(self): # 边际价格是x对y的导数 pass def swap_x_to_y(self, dx): pass

实际生产合约里,D 的迭代通常用 Newton-Raphson 方法,合约里会写死迭代次数和收敛阈值。上面的代码只体现了骨架,真正的实现还要考虑浮点误差、整型放大等问题。我建议你把它扩充成完整函数,然后对比不同 A 值下的价格影响。

3.2 同样的交易量,CSAMM 的滑点表现差多少

有了模拟器,我们能做一个直观的实验:假设池子初始各有 100 万 USDC 和 100 万 USDT,锚定价格为 1。分别用恒定乘积公式和 CSAMM 公式执行一笔 20 万 USDC 的买单,看最终成交价与初始价的偏差。

恒定乘积的滑点公式很好算:买入 20 万 USDC,池内 USDC 减少,USDT 增加,价格从 1 被推到约 1.44,成交均价约为 1.2 左右。也就是说,滑点超过 20%。

如果 CSAMM 的 A 设置得当,在池子还比较均衡时,同样买 20 万 USDC,成交均价可能只有 1.03-1.06,滑点控制在 3%-6% 之间。原因在于曲线在锚定区范围内非常平坦,一次不太极端的交易不会让边际价格大幅偏移。这个数值差异,对稳定币互换场景来说是决定性的:用户宁可多花 10 个基点的手续费,也不愿意承受 20% 的滑点。

3.3 无常损失对比曲线:曲率越平,IL 越高?

滑点低听起来全是优点,但任何做市策略都不能只看滑点。CSAMM 的曲线越平坦,意味着当外部真实价格真的偏离锚定价格时,池内两种资产的比例变化会更大,从而给 LP 带来更高的无常损失。

我用数值模拟来说明:假设初始价格 1,之后外部价格真的涨到 1.2。恒定乘积池的 LP 面对的无常损失大约在 0.5%-0.6%。Curve 风格池如果 A 很大,在价格从 1 涨到 1.2 的过程中,池子会像一个“超卖”的恒定和曲线,USDT 被大量买走,LP 持仓比例严重失衡,无常损失可能达到 2%-3% 甚至更高。

这意味着 CSAMM 的 A 参数本质上是在“滑点”和“无常损失”之间做权衡。你不可能两者兼得。做稳定币池子,因为真实价格确实稳定在 1 附近,A 可以拉满;做 ETH 这类波动资产池子,如果也把 A 拉满,很容易在震荡行情里亏掉 LP 的本金。

所以我在测试 CSAMM 时,一般不会只盯着某个池子的 TVL 和手续费收入,而是会单独跑一段回测,统计不同波动率下 LP 的净收益,这部分逻辑我在后面第 5 章会展开。

4. 链上部署 CSAMM 时绕不开的工程细节

模拟器和链上实现之间隔着巨大的鸿沟。下面这些细节是文档里常被一笔带过、但实际部署时一定会踩坑的地方。

4.1 池结构设计与初始参数设定

CSAMM 的合约状态并不复杂,核心变量包括两种资产的余额、锚定价格、A 参数、D 迭代的精度值和累计手续费。相比 Uniswap V3 那套高复杂度的 tick 索引,CSAMM 的状态结构更适合在 Gas 敏感的公链上运行。

但初始化时有几个坑需要特别注意。第一,锚定价格不能简单用“初始注入金额比”,比如你注入 100 万 USDC 和 100 万 USDT,锚定价格自然初始化为 1。但如果资产本身当前市场价格就是 1.02,你的锚定价格设置就偏离了。建议在创建池子时从外部预言机读取一次价格,或者允许管理员在短时间内修正锚定值。

第二,A 参数的初始值最好经过离线模拟。我的经验是先用历史价格数据回测,计算不同 A 值下 LP 的日均收益和最大回撤,再决定初始值。上线后 A 参数一般允许通过治理投票缓慢调整,但“缓慢”这个事在极端行情里会成为劣势。Curve 的做法是给 A 设置上下限,避免治理攻击一次性把 A 拉得过高,导致 LP 资产被套利者抽干。

4.2 整型精度、除零与溢出:这类合约最常见的漏洞

写 DeFi 合约和写普通业务系统最大的不同,是必须时刻保持“全量证据意识”。链上不允许用浮点数,所有计算都要用定点数表示,通常会把 1 放大到 1e18 或 1e12 来保留精度。CSAMM 的迭代公式里涉及乘方、除法、开方,任何一个中间结果溢出或者下溢,都可能导致价格计算错误,进而被攻击者用一笔交易掏空池子。

我在审计类项目里看到过很多次类似问题:牛顿迭代 D 时,某次迭代d * d直接溢出 uint256,导致 D 变成极小值,池内价格失真。解决办法也很机械但必须做:所有可能的乘法都用“先除后乘”或者mulDiv类库处理,所有迭代都要判断收敛状态,不能盲目循环固定次数。另外,池子余额为 0 的情况必须单独处理,比如取款时有人把某种代币余额全部提走,后续交易的除零异常就会暴露。

预算充足的项目,强烈建议做至少两轮独立审计,尤其是把 CSAMM 内核的数学审计和业务逻辑审计分开。数学审计负责验证公式在极端参数下是否收敛,业务审计负责验证权限、手续费、预言机读取等流程是否存在漏洞。

4.3 手续费设计:固定费率、动态费率与安全熔断

CSAMM 的手续费设计比 Uniswap V2 复杂,因为它的价格对池内比例极度敏感,手续费的累积也会影响锚定价格的计算。最简单的做法是沿用 V2:每次交易收取固定比例手续费,归入池子余额,变相让 D 缓慢增长。但这会带来一个问题:手续费收益应该分给 LP,正确做法是记录每个 LP 的份额比例,而不是直接把手续费保留在池子里。

更精细的设计是动态费率:当池内比例偏离锚定区间较近时,费率可以低至 0.01%-0.05%,鼓励大量小额互换;当池内比例严重失衡时,费率自动升高,抑制套利者的过度交易,也补偿 LP 的无常损失。这个逻辑很像传统交易所里的波动率调节器,但在链上实现时要注意“费率更新”不能被用户抢跑。如果费率更新需要交易状态改变后异步触发,攻击者可以趁费率还没更新时完成大额交易,影响收益分配。

我的建议是在合约里实现一个“熔断机制”:当池内比例偏离锚定值超过某个阈值时,暂停大额交易,只允许小额交易和 LP 提款。这样即使外部预言机失灵或者市场瞬间剧烈波动,池子也不会被套利者通过几笔大额交易掏空。

5. 实际使用 CSAMM 做流动性策略时,我更倾向这样取舍

最后聊聊策略层面。很多人拿到 CSAMM 的第一反应是“把 Uniswap V3 的策略迁移过来”,实际上两者差别很大,不能直接照搬。

5.1 CSAMM、Uniswap V3 与 V2 的对比:该用哪个

维度Uniswap V2Uniswap V3CSAMM
资金效率低,全部资金在无限区间均摊高,LP 可主动选择价格区间中高,取决于 A 参数的设定
滑点表现区间内低,区间外无流动性锚定区间内平缓,偏离后快速升高
无常损失区间内可控,极端波动下放大平滑放大,但边界清晰
实现复杂度高,tick 索引复杂中等,D 迭代是核心
适用资产任意高波动资产主动做市资产稳定币、锚定资产、低波动资产

我的个人判断是:如果你的目标是“在 ETH/USDC 这类高波动资产上主动做市赚手续费”,Uniswap V3 的区间流动性仍然是最灵活的选择。CSAMM 更适合那些“真实价格波动有限,但需要大量链上互换”的场景,比如稳定币、合成资产、stETH/wstETH 这类衍生品。

5.2 调参经验:A 值、锚定偏差阈值与手续费率

我跑过一段时间稳定币池和 ETH 流动性池模拟,几个经验值得记录:

  • 稳定币池的 A 值可以设置在 100-500 之间,锚定偏差阈值设置为 ±0.5%。这样在正常行情下,池子几乎没有滑点,手续费收入稳定。
  • 对于 stETH/ETH 这种存在一定底层波动但长期趋向固定比例的资产,A 值建议控制在 20-80,锚定偏差阈值放款到 ±2%,否则很容易被 stETH 折价波动打穿深度。
  • 手续费率不是越高越好。CSAMM 的魅力在于低滑点,如果费率设成 0.3%,交易成本会被滑点优势完全抵消,用户宁愿去 V2 池。稳定币池我见过最低费率到 0.01%,核心优势就是做大额互换的量。

这里有个很反直觉的结论:CSAMM 池的 TVL 高并不代表做市收入高。由于曲线平坦,同样的交易量在 CSAMM 里引起的滑点很小,这意味着 LP 能够捕捉到的价格趋势收益更少,手续费成了主要收入来源。如果你的池子交易量不够大,TVL 再高也只是空架子,LP 净收益非常有限。

5.3 回测框架与监控指标:上线前先跑满一个完整周期

在把 CSAMM 部署到主网之前,我会建议至少跑通三件事。第一,用历史真实价格数据模拟 30-90 天的 LP 收益,统计最大回撤和手续费覆盖无常损失的情况。第二,做极端事件压力测试,比如模拟锚定价格瞬间偏离 10% 时的池内比例变化,确认流动性不会被抽干。第三,监控链上交易撮合的实时价格差异,如果 CSAMM 池的报价和 DEX 聚合器实时价格经常偏离超过一定百分比,说明 A 值设置过紧或预言机更新不及时。

监控面板上我比较关注三个指标:池内资产比例、锚定价格与外部价格的偏差、近 24 小时大额交易占比。一旦发现某个池子的大额交易占比过高,我会优先检查是不是 A 值偏大导致套利空间过大,或者是预言机反馈链条有延迟。在实盘中,这类调整我基本都交给时间锁合约执行,避免被市场短时波动误导。

6. 回到最根本的问题:CSAMM 会不会取代现有 AMM

不会取代,但会占据一个非常牢固的细分市场。稳定币和低波动资产之间的大额互换需求长期存在,CSAMM 在这个场景下资金效率极高,滑点极低,是 Uniswap V2/V3 很难比拟的。但它不适合高波动资产,也不适合需要对价格区间进行精细控制的主动做市策略。

从我过去这段测试经验看,玩 CSAMM 最容易犯的错误就是盲目照搬别人的参数。A 值、锚定偏差阈值、手续费率这几个参数高度耦合,必须针对每个池子的真实交易场景做回测。没有一套参数可以通吃所有资产类别。

最后分享一个我在调参时很喜欢用的套路:先用较小的 A 值上线,观察池子正常行情下的滑点和手续费收入,再逐步调大,直到滑点收益出现边际递减为止。这样做的好处是即便判断失误,损失也相对可控。CSAMM 的精髓不在于知道公式怎么算,而在于知道一条曲线在什么资产、什么行情下应该长成什么样。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询