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 自动翻译,所有内容以英文版本为准。查看英文版 →
基本划分:程序与账户
程序
Solana 上的程序是可执行代码 — 从文件加载的编译二进制文件,部署到一个Pubkey,通过交易调用。程序没有关联状态;它们只包含逻辑。
Raydium 的程序:
- CPMM:
CPMMoo8L3F4NbTegBCKVNunggL7H1Zpdmwpwh8KMoZ0F - CLMM:
CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK - AMM v4:
675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8
账户
一个账户是链上的一行数据。每个账户都有:pubkey— 它的地址。owner— 拥有它的程序(控制写入)。data— 原始字节。lamports— SOL 余额(1 SOL = 1,000,000,000 lamports)。rent_epoch— 遗留的租金收取字段(自租金豁免成为强制要求后已忽略)。
所有权
每个账户恰好由一个程序拥有。只有该程序的代码可以修改账户的data 字段。用户可以修改他们可以签名的账户上的 lamports(发送/接收 SOL),但修改 data 需要所有者程序代表他们执行。
例子:
- 你的用户钱包:由系统程序拥有。Lamports 存放在这里;你签署以转账。
- 你的 USDC 代币账户:由 SPL Token 程序拥有。Token 程序的
transfer指令更新余额。 - Raydium 池状态账户:由 CPMM 程序拥有。只有 CPMM 的指令可以修改储备、费用等。
- Raydium 头寸 NFT 的
PersonalPositionState:由 CLMM 程序拥有。
租金与租金豁免
创建账户消耗存储空间。Solana 对这个空间收取租金,但自 2020 年以来所有新账户都必须是租金豁免的 — 意味着它们持有足够的 lamports 来预付 2 年内需要支付的租金。实际上:- 租金豁免账户永久存在。
- 关闭账户会将 lamports 返回给关闭签署者。
Raydium 租金成本
| 账户 | 大小 | 租金 |
|---|---|---|
| CPMM PoolState | ~1,440 B | ~0.011 SOL |
| CLMM PoolState | ~1,500 B | ~0.012 SOL |
| CLMM TickArray | ~9,000 B | ~0.063 SOL |
| CLMM PersonalPositionState | ~280 B | ~0.003 SOL |
| ATA | 165 B | ~0.002 SOL |
| Vault(代币账户) | 165 B | ~0.002 SOL |
数据与可执行账户
账户有两种类型:数据账户
保存状态(池储备、代币余额、用户头寸)。executable = false。这是绝大多数。
可执行账户
保存程序字节码。executable = true。这些是程序(CPMM、CLMM 等)。程序除了字节码外没有其他数据。
程序衍生账户(PDA)
PDA 是一个数据账户,其地址是从程序和一些种子确定性衍生的 — 这个地址不存在私钥。只有衍生程序可以通过invoke_signed 代表 PDA 签署。
Raydium 广泛使用 PDA:
- 池状态 PDA:从
[poolTypeDiscriminator, mintA, mintB, ammConfig]衍生。 - 金库 PDA:从
[pool, mint]衍生。 - 观察状态 PDA:从
[observationSeed, pool]衍生。
solana-fundamentals/pdas-and-cpis。
交易与账户引用
每个 Solana 交易都携带一个明确的账户列表,它将读写这些账户。运行时强制执行:- 列出的账户可以根据其
is_writable标志进行读取或写入。 - 未列出的账户无法被触及。
账户大小与数据布局
每个 Raydium 账户都有固定或有界的大小。布局在代码中定义(带#[repr(C)] 的 Rust 结构体)并在 sdk-api/anchor-idl 中记录。
Anchor 程序为它们创建的每个账户前置一个 8 字节的鉴别器,从 hash("account:<StructName>")[0..8] 衍生。这让客户端只需读取前 8 个字节就能识别账户类型 — 对于枚举所有特定类型账户的 getProgramAccounts 扫描至关重要。
读取 Raydium 池状态
通过 SDK:src/raydium/cpmm/layout.ts 中。
实际例子:读取代币账户
让我们读一个用户的 USDC 余额。这对 Raydium 的重要性
账户模型塑造了 Raydium 的设计:- 池状态是单个账户 — 关于池的所有内容(代币、储备、费用、管理员)都存在于一个由池程序拥有的账户中。
- LP 代币是标准 SPL 代币账户 — Raydium 将代币化委托给 SPL Token 程序。
- Tick 数组是分块的 — CLMM 不能有单个可增长的 tick 数组,因为账户有固定分配的大小;它使用分块的
TickArrayPDA。 - 头寸 NFT 是 Metaplex NFT — CLMM 头寸是按 Metaplex 规范的标准 NFT;头寸状态是一个单独的 PDA。
- “池储备在哪里?” → 两个金库账户(代币账户)由 SPL Token 程序拥有,权限委托给池程序的 PDA。
- “CLMM 的 tick 数据在哪里?” → 一系列 TickArray PDA,每一个覆盖 60 个连续 tick。
- “我的农场质押在哪里?” → 一个
UserLedgerPDA,从[user, farmId]衍生,由农场程序拥有。
参考资源
solana-fundamentals/programs-and-anchor— 程序如何处理账户。solana-fundamentals/pdas-and-cpis— PDA 衍生和 CPI。solana-fundamentals/transactions-and-fees— 账户如何在交易中被引用。sdk-api/anchor-idl— Raydium 程序的账户布局。
- Solana 账户文档。
- SPL Token 程序 — 代币账户存放的地方。


