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.
本页内容由 AI 自动翻译,所有内容以英文版本为准。查看英文版 →
Raydium 的新程序(CPMM、CLMM、Farm v6、LaunchLab)采用 Anchor 框架编写——这是一个在 Solana 原生程序模型基础上构建的 Rust 框架,提供账户验证、错误处理和 IDL(接口描述)功能。AMM v4 和更早版本的 Farm 在 Anchor 出现前就已开发。理解这两种范式能帮你阅读代码、从 IDL 生成客户端,以及调试意外错误。
程序部署模型
每个 Solana 程序都驻留在一个Pubkey 地址。程序的字节码存储在由 BPF 可升级加载器(BPFLoaderUpgradeab1e11111111111111111111111)拥有的可执行账户中。
程序部署包括三个账户:
- Program 账户:程序 ID 处的小型元数据账户。所有者:BPF 可升级加载器。
- ProgramData 账户:保存实际的字节码。推导为
[program_id, "programdata"]。 - Buffer 账户(临时):升级期间保存新字节码。升级后丢弃。
security/admin-and-multisig。
验证已部署的程序
为了确认链上内容与经过审计批准的源代码一致:Anchor:Solana 之上的框架
原生 Solana 程序是具有以下签名的 Rust 函数:- 为每条指令和每种账户类型自动生成一个确定性的 8 字节鉴别符。
- 在代码运行前验证账户约束(所有者、seeds、可写、签名者、mint 匹配、代币程序匹配)。
- 生成 IDL ——客户端用来调用程序的接口描述文件。
- 提供 Rust、TypeScript 和 Python 的客户端库。
8 字节鉴别符
每个 Anchor 账户和每条 Anchor 指令都以 8 字节鉴别符开头——一个固定字符串的 SHA-256 哈希的前 8 字节:getProgramAccounts 这样需要枚举某种类型所有账户的工具至关重要。
错误
Anchor 程序通过#[error_code] 定义错误:
reference/error-codes。
IDL
Anchor IDL(接口描述语言)文件是程序的 JSON 描述:它的指令、账户、类型、错误和事件。这相当于以太坊的 ABI。 Raydium 为所有 Anchor 程序发布 IDL。从链上获取:src/raydium/*/idl/*.json。
IDL 结构
从 IDL 生成客户端
Anchor 的anchor CLI 生成 TypeScript 和 Rust 类型:
IDL 何时派上用场
如果你想构建不经过 Raydium SDK 的自定义集成:- 获取 IDL(从链上直接获取或从 SDK 源代码获取)。
- 查找你需要的指令(如
swap_base_input)。 - 构造指令数据:8 字节鉴别符 + 编码后的参数。
- 按 IDL 指定的顺序传递账户。
sdk-api/anchor-idl 了解实际例子。
前 Anchor 时代的程序:AMM v4 和 Farm v3/v5
这些程序在 Anchor 出现前就存在。它们使用:- 手动指令分派:
instruction_data中的u8标签配合match语句。 - 手动账户验证:
if accounts[0].owner != &expected_program { ... }。 - Borsh 序列化的指令参数:没有鉴别符,只有
instruction_data[1..]。 - 通过
#[repr(C, packed)]的布局:C 结构体二进制布局。
程序升级机制
只有 ProgramData 的upgrade_authority 可以升级。步骤:
- 编译新的字节码。
- 将其写入 buffer 账户(
solana program write-buffer)。 - 提交升级指令:
BpfLoaderUpgradeable::Upgrade { buffer, program, authority }。 - 运行时原子性地用 buffer 的内容替换程序的字节码。
security/admin-and-multisig。
使程序不可变
升级权限可以设置为None,此时程序变得永久不可变。Raydium 对任何产品都没有这样做——团队保留了推送安全补丁的能力。权衡:用户必须信任多签 + 时间锁过程。
程序和租金
部署程序消耗免租 lamports:- 50 KB 程序:约 0.35 SOL 的租金。
- 200 KB 程序:约 1.4 SOL 的租金。
solana program close)返回 lamports。Raydium 程序保持活跃,没有计划关闭。
调试 Anchor 程序
日志输出
Anchor 的msg! 宏写入交易的日志。模拟交易以查看日志:
- 程序调用(
Program CPMMoo8... invoke [1])。 - 程序代码中的
msg!调用。 - 计算单位消耗(
consumed 137842 of 400000 compute units)。 - 程序成功或错误。
错误代码
如果 Anchor 程序抛出错误,日志显示:SlippageExceeded)。与 IDL 的 errors 数组交叉引用。
见 reference/error-codes 了解 Raydium 的完整错误表。
账户布局不匹配
如果你在错误的位置传递错误的账户,Anchor 的账户验证宏会返回以下错误:ErrorCode 枚举);≥6000 的错误是程序的自定义代码。
相关资源
solana-fundamentals/account-model— 程序如何拥有账户。solana-fundamentals/pdas-and-cpis— PDA 作为 Anchor 声明的方式。sdk-api/anchor-idl— 获取和使用 Raydium 的 IDL。reference/program-addresses— 程序 ID。reference/error-codes— 错误代码参考。security/admin-and-multisig— 升级权限控制。
- Anchor 书籍。
- Solana 程序部署。
- Raydium IDL(发布于 SDK
src/raydium/*/idl/*.json)。


