Solana 生态 AMM 调研
2025-06-23 18:52
ZAN
2025-06-23 18:52
订阅此专栏
收藏此文章
本文将分别介绍 Solana 生态中的几个重要的 AMM 实现。


撰文:ZAN


在 Web3 行业的现状中,与 DeFi 有关的产品占据了绝对的市场。而在这其中,AMM(Automated Market Maker,自动做市商)作为关键的一环,是 Web3 金融方面变化的有力推动者。本文将分别介绍 Solana 生态中的几个重要的 AMM 实现,希望能够对 LP(Liquidity Provider,流动性提供者)如何选择自己的投资策略提供一些帮助。


CPMM


CPMM (Constant Product Market Maker) 作为最基本的 AMM 实现,在许多产品中有实现。这里用 Raydium 推出的基于恒定乘积的 AMM 来举例。恒定乘积即池子中两种代币的供应量具有固定乘积:X * Y = k。


对于流动性提供者来说,当任何人往池子中添加流动性(添加资产)时,CPMM 会自动给钱包地址创建关联账户并发放 LP Token(每个代币对都有属于自己的 LP Token Mint),此 LP Token 用于证明该钱包地址持有某个池子的份额,并且将会在流动性提供者提款时销毁相应的 Token。


CPMM 的链上程序使用 Anchor 开发,程序代码在 https://github.com/raydium-io/raydium-cp-swap 能够找到。下面我们来简单确认下它是如何实现恒定乘积的。


首先,用户在使用 Raydium 的 CPMM 交换代币时,将会触发 swap 相关指令。


举例来说(仅为了说明情况,本文不对任何 Token 负责):当用户想使用 USDC 交换 TRUMP 时,可以通过 TRUMP-USDC 这个池子进行交换。


例如我们查看这个交易,简单起见,让我们忽略交易中的其他指令,只查看 Raydium 部分。找到 Raydium CPMM: swapBaseInput:



在 Input Accounts 中,我们能看到输入代币为 USDC,输出代币为 TRUMP。在 Solana 生态的 AMM 中,LP Pair 可以简单的通过 Token Account 来表示,而不需要创建一个新的合约程序并部署(例如以太坊中常用的工厂合约)。在交易发生时,直接与 Raydium 的 CPMM Program 来交互,Solana 程序将通过传入的池子地址、代币地址等来修改相应的 Token Account 的状态,来进行 swap 操作。


例如上述的 swapBaseInput 指令,代码在这里能够找到。经过一系列前置检查后,具体能够换到多少目标代币,通过 ConstantProductCurve.swap_base_input_without_fees 中进行了计算:



其中用到的公式为:



即 TokenX 和 TokenY 在总量各自变化后,其乘积应保持不便。公式左边为变化后的乘积,右边为变化前的乘积。



上述算式通过数学转换后,能得到 Δy(即我们能够换到的 y 代币的数量)的转换公式:



也就是代码中的 delta_y = (delta_x * y) / (x + delta_x) 部分。注意这里的计算并不包含手续费,其已经在 swap_base_input 的前置逻辑中扣除过了。


CLMM


CLMM (Concentrated Liquidity Market Maker) 同样是 Raydium 推出的 AMM,它类似于 Uniswap V3,每个代币对同样有多个费用层级,能够分别创建一个对应层级的池子。


由于 CLMM 的实现参考了 Uniswap V3,所以在学习它时,很多概念和实现方式都可以参考 Uniswap 的实现。它也继承了 Uniswap 的概念例如 tick、多费率层级、集中流动性等。更多内容可以在 ZAN 推出的 DEX 开发课程中找到:DEX Development Practice - Uniswap Code Analysis - How Uniswap works - ZAN


但是需要注意,与 CPMM 类似的,由于 Solana 链的特性,Raydium CLMM 不需要对每个池子单独部署一个合约,所以也没有工厂合约的概念。这一点不同于 Uniswap。


CLMM 允许流动性提供者在注入资金时选定一个价格范围,资金将仅在所选范围内分布:



对于集中流动性池来说,代币分别分别存在于当前价格的两侧,上图所选的价格范围包含了当前价格,所以会将资金分别分配给池子中的两种代币。


我们也可以只注入某一种代币,来提供所谓的单边流动性(如下图)。这有些类似于传统金融模式中的限价单,LP 的资金只有在代币价格达到某种范围时才会被利用,不过这种模式要考虑的风险点也更多。



一般来说,对于价格波动小的池子,LP 倾向于选择小一点的范围;反之对于那些价格波动非常剧烈的池子,则倾向于选择大一点的范围。这样的目的是为了尽量不让当前价格脱离自己所选择的价格范围,造成太多无常损失。


需要注意,集中流动性虽然可以让 LP 的资金利用率更高,但也对 LP 的金融意识提出了更高的要求,LP 需要更积极的管理自己的流动性。如果 LP 应对不力,那么链上频繁的波动将很容易导致 LP 遭受严重的无常损失。


DLMM


DLMM (Dynamic Liquidity Market Maker) 是 Meteora 推出的 AMM 产品,它也属于 Uniswap V3 的一种,和上文提到的 CLMM 也非常相似,DLMM 也允许 LP 将自己的资金集中在当前价格附近的一定范围内。不过 DLMM 在具体实现时有些不同,并且提供了一些特色功能。


DLMM 中提供了 Bin 的概念,池子将从基础价格开始,每隔一小段 Bin step 作为一个 Bin 存在。如果交易发生在同一个 Bin 内,那么交易者将享受到零滑点。这可以极大增加交易量和交易成功率,理论上 LP 能够收获更多的交易费用。



与 CLMM 相似的,池子中的代币同样在当前价格的两侧分布,一个代币仅需要提供单边流动性。但根据 Bin 的概念,当前激活的 Bin(表明了当前的交换价格)则拥有两种代币。即:


  • 当前激活的 Bin:其中存在两种代币,在当前 Bin 中交换代币将按照固定价格进行,并且 0 滑点;
  • 其他 Bin:在当前激活的 Bin 两侧分布,分别仅存在单个代币。


在当前激活的 Bin 中的代币量发生变化时,如果某一方代币减少为 0,则 DLMM 会将当前激活的 Bin,根据池子中的实际情况,设定为其左侧或右侧的下一个 Bin。依此来推动池子中的价格变化。


在 LP 提供流动性时,DLMM 提供了 3 中策略,分别是 Spot、Curve 和 Bid Ask



其中 Spot 最普世,基本上所有的流动性池都比较合适,算是一种最简单的流动性策略。


Curve 则更适合那些价格变化非常小的池子,例如稳定币对。这些池子中的价格波动非常小,就像它的形状所透露的那样,把 LP 的资金集中分布在此区间内,能够最大限度的吃满交易费。


Bid Ask 则更适合那些价格波动非常大的池子。人们总是倾向于在这种池子中进行更多的套利交易,价格可能很难集中在某一小段范围内。这种策略通常需要 LP 频繁调整自己的仓位,来避免价格脱离自己所设定的资金范围。由于涉及到对市场的判断力,这通常并不容易。


总结


AMM 作为 Web3 金融领域的重要组成部分,通过其独特的机制和创新,推动去中心化金融的普及和发展。随着技术的不断进步和生态系统的完善,AMM 有望在未来发挥更大的作用,进一步改变传统金融的格局。

【免责声明】市场有风险,投资需谨慎。本文不构成投资建议,用户应考虑本文中的任何意见、观点或结论是否符合其特定状况。据此投资,责任自负。

ZAN
数据请求中
查看更多

推荐专栏

数据请求中
在 App 打开