
先说个题外话现在搜“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*yk没有本质区别。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 不变式本质上都是给“价格”和“池子比例”之间建立某种约束。比如 xyk它的边际价格是 y/x也就是池子里两种资产的数量之比。价格会随着交易量变化变化速率取决于池子的深度深度又取决于 k 的大小。所以那些想优化 AMM 的人做的事情本质上都是如何在保持 xyk 这类基础约束的前提下引入更复杂的关系让价格变化曲线更符合某一类资产的期望。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 的精髓不在于知道公式怎么算而在于知道一条曲线在什么资产、什么行情下应该长成什么样。