Documentation Index
Fetch the complete documentation index at: https://docs.raydium.io/llms.txt
Use this file to discover all available pages before exploring further.
每个 Raydium 程序都至少有一个特权角色——可用于升级程序、创建新配置或提取协议费用的密钥。缩小这些角色的权限范围(并通过带时间锁的多签来管控)是防范管理员被攻陷的首要手段。本页梳理了各角色及其实际安全措施。
各程序的角色
AMM v4
| 角色 | 权限地址 | 能做什么 |
|---|
| 程序升级 | Squads 多签(3/4) | 部署新的程序字节码 |
| Pool 管理员 | 国库多签(3/5) | 切换池状态、更新现有池的费率 |
CPMM
| 角色 | 权限地址 | 能做什么 |
|---|
| 程序升级 | Squads 多签(3/4) | 部署新的程序字节码 |
| AmmConfig 管理员 | 国库多签(3/5) | 创建新的 AmmConfig(费率档位);切换已有配置 |
| 创建池费用接收方 | 国库多签(3/5) | 接收一次性建池费用 |
CLMM
| 角色 | 权限地址 | 能做什么 |
|---|
| 程序升级 | Squads 多签(3/4) | 部署新的程序字节码 |
| AmmConfig 管理员 | 国库多签(3/5) | 创建/修改 AmmConfig |
| DynamicFeeConfig 管理员 | 国库多签(3/5) | CreateDynamicFeeConfig / UpdateDynamicFeeConfig — 校准 CreateCustomizablePool 调用可选择的动态费率档位 |
limit_order_admin(程序级) | 链下运营热钱包,非多签 | 代替订单所有者结算并关闭限价订单。keeper 密钥是一个程序级常量(主网与 devnet 取值不同),在 SettleLimitOrder / CloseLimitOrder 中通过 signer == limit_order.owner || signer == limit_order_admin::ID 进行校验。资金始终转入原始所有者的 ATA;keeper 无法重定向资金、修改订单或开新订单。 |
limit_order_admin 是一个权限刻意收窄的运营角色,目的是让链下 keeper 可以在订单所有者不在线的情况下扫单。keeper 密钥是热密钥(存放在 keeper 虚拟机上),独立于上述多签进行轮换。具体而言,keeper 权限仅限于:
SettleLimitOrder — 按订单限价将已成交部分转入所有者的 ATA。
CloseLimitOrder — 关闭已完全结算的订单账户以回收租金(租金归还给订单所有者)。
keeper 无法调用 OpenLimitOrder、IncreaseLimitOrder、DecreaseLimitOrder,无法修改任何池字段,也无法为其他指令签名——这些约束由指令 Accounts 结构体中的 seed 和 has_one 约束在链上强制执行。即使 keeper 被攻陷,最坏的情况也只是 keeper 失联(订单保持挂单状态,直到所有者自行结算),或对合法可成交的订单进行乱序结算/关闭;它无法将用户资金转移到所有者原本授权目的地之外的任何地方。
Farm v6
| 角色 | 权限地址 | 能做什么 |
|---|
| 程序升级 | Squads 多签(3/4) | 部署新的程序字节码 |
| Farm 创建者(每个 Farm) | Farm 的创建者钱包 | 为奖励金库注资、延长计划、取回未使用的奖励 |
单个 Farm 没有协议管理员——每个 Farm 的创建者只控制自己的 Farm,且创建者的权限有明确边界(不能没收用户质押,不能更改质押 mint)。
LaunchLab
| 角色 | 权限地址 | 能做什么 |
|---|
| 程序升级 | Squads 多签(3/4) | 部署新的程序字节码 |
| Launch 创建者(每个 Launch) | Launch 的创建者钱包 | 毕业后收取创建者费用;提取未毕业曲线的剩余资金 |
Launch 没有可以修改曲线或没收募集资金的协议管理员。
程序升级权限
Raydium 的程序使用 Solana 标准的 BPF Loader v3 升级机制。所有程序的升级权限归属于 3/4 Squads 多签。
选择 3/4 的原因:签名者数量足够多,单一密钥被攻陷不足以完成升级;同时数量足够少,协调合法升级仍然可行。四个权限方均为独立的、物理隔离的冷设备签名者,由核心团队成员持有。顺序签名方式防止对同一笔交易进行并行审批;交易设有固定的过期窗口。多签操作定期与 **Solana STRIDE 计划(Asymmetric Research)**合作审查。
移除升级权限
Raydium 尚未将任何程序的升级权限设置为 null。协议遵循的原则是:程序需要保持可升级状态(以修复漏洞、添加 Token-2022 等扩展功能、修正集成偏差)。权衡在于:用户需要信任 3/4 多签只会部署经过充分审查的升级。
对于希望使用不可变替代方案的用户,较旧的 AMM v4 程序自上次审计后一直保持稳定;18 个月内零升级。尽管升级权限依然存在,该代码路径实际上已冻结。
AmmConfig 权限
创建新的 AmmConfig 需要权限——新的费率档位和 tick 间距须由 3/5 国库多签授权。现有池通过 PDA 引用其 AmmConfig;池的费率档位由 AmmConfig 决定。
管理员能修改现有 AmmConfig 吗? 技术上可以。updateAmmConfig 可由管理员调用。但在实践中,我们避免修改已部署的 AmmConfig,因为这会在用户无感知的情况下改变所有使用该配置的池的经济参数。协议政策是:有变更需求时创建新的 AmmConfig 并迁移。
管理员能通过配置窃取协议费用吗? 不能——AmmConfig 包含费率参数,但不包含协议费用接收地址;后者是每个池独立的不可变地址。
协议费用领取
swap 手续费的一部分(通常为 25 bps swap 费中的 3–12 bps,具体取决于配置)累积到协议费用金库。多签可提取这些累积费用。用户不会看到自己的 LP 余额因此变化——这是协议预先分配的份额,不是 LP 资金。
Farm 创建者权限
Farm v6 赋予创建者以下权限:
- 为奖励金库注资(添加更多代币)。
- 延长计划(将结束时间向后推移)。
- 在结束时间后调用
withdrawReward 以取回金库中未使用的余额。
Farm 创建者不能:
- 提取用户已质押的 LP。
- 更改质押 mint。
- 追溯修改排放速率(只能通过
setRewards 向前调整)。
- 冻结用户的收益提取。
恶意 Farm 创建者最坏的情况是让金库注资不足,导致 Farm 提前耗尽;用户的本金质押始终安全。
Squads 多签配置
Raydium 针对不同风险面运营两个独立的 Squads 多签,均可通过 Squads Protocol UI 在链上查看。
| 多签 | 阈值 | 时间锁 | 范围 |
|---|
| 程序升级 | 3/4 | 24 小时 | AMM v4、CPMM、CLMM、LaunchLab、Lock、AMM Routing、Stable Swap 及旧版 Farm/Staking 程序字节码部署的唯一权限。查看地址:app.squads.so/.../FytDr…ceZQK。 |
| 国库 | 3/5 | 无 | 国库资产、协议收入、运营支出。目前同时持有 Raydium 有限的程序管理员权限(创建 AmmConfig、提取协议费用、配置池参数)。查看地址:v3.squads.so/dashboard/RVha…dHdtYz09。 |
升级多签的运营特性:
- 24 小时时间锁:任何交易均需等待 24 小时。今天批准的升级最早 24 小时后才能执行,给用户留出应对时间。
- 物理隔离冷设备签名:冷设备已物理移除网卡,仅连接硬件钱包,并通过独立热设备的二维码读取交易数据。
- 顺序签名:只有在第一台冷设备生成并签署交易后,下一台冷设备才能开始签名流程,防止对同一交易进行冲突或并行签名。
- 交易过期:每笔交易设有固定过期窗口,过期交易自动失效。
- TOTP + 物理密钥:用于交易发起和链上广播的热设备均强制启用 TOTP 与物理密钥验证。
- 公开交易队列:任何人都可以在 Squads UI 上监控待处理的升级。
国库多签没有时间锁——其权限范围更窄,且常规操作(创建 AmmConfig、提取费用)需要当天完成。国库多签还持有上述各程序表格中列出的有限程序管理员权限;这是临时安排,定期与项目安全合作伙伴进行审查。
在链上验证权限
验证程序当前升级权限最简单的方式:
solana program show <PROGRAM_ID>
输出包含:
Program Id: CPMMoo8L3F4NbTegBCKVNunggL7H1Zpdmwpwh8KMoZ0F
Owner: BPFLoaderUpgradeab1e11111111111111111111111
ProgramData Address: <ProgramDataPDA>
Authority: <EXPECTED_MULTISIG_ADDRESS>
Last Deployed In Slot: <slot>
Data Length: <n> bytes
如果 Authority 不是预期的 Squads 多签地址,则说明存在异常。Raydium 在 reference/program-addresses 上公布了预期的权限地址。
如需查询 AmmConfig / 池管理员角色,请获取链上账户并解码:
const config = await raydium.cpmm.getAmmConfig(configPda);
console.log("AmmConfig admin:", config.admin.toBase58());
// Expected: 3/5 treasury multisig.
历史权限变更
| 日期 | 程序 | 变更内容 |
|---|
| 2022-12 | AMM v4 | 安全事件后,升级权限从单签迁移至 3/4 多签 |
| 2023-02 | 所有程序 | 所有运营角色统一归入 3/5 国库多签 |
| 2023-11 | CLMM | 新增仅用于奖励操作的第二个多签,以降低暴露面 |
| 2024-05 | CPMM | 初始部署时即使用多签权限 |
用户注意事项
作为用户/LP/集成方,建议采取以下措施:
- 大额配置前检查升级权限:确认其与文档记录的多签地址一致。
- 监控多签活动:Squads UI 显示待处理交易;计划中的升级会提前 24 小时公示,如果你不认可该变更,有时间撤出。
- 制定考虑时间锁的退出策略:如果你在运行自动复投策略,确保退出路径不依赖正在变更的指令。
- 不要假设程序不可变:所有 Raydium 程序均可升级,请将此纳入规划。
集成方常见误区
1. 缓存权限地址
如果你在代码中硬编码了升级权限或管理员多签地址,一旦地址发生轮换,你的验证逻辑就会失效。建议在运行时从 reference/program-addresses 获取,或定期刷新。
2. 假设 AmmConfig 稳定不变
新的 AmmConfig 随时可能被创建。你的聚合器/路由器应定期(每小时即可)重新获取完整的配置列表。
3. Farm 创建者的恶意行为向量
如果你向信誉不佳的 Farm 存款,创建者可能提前结束 Farm 并取回奖励金库(前提是尚无用户质押)。一旦有用户质押,程序会强制执行按比例的权益分配;取回操作只能获取合理结束后的剩余部分。
相关链接
参考资料: