本頁內容由 AI 自動翻譯,所有內容以英文版本為準。查看英文版 →
Raydium 的較新程式(CPMM、CLMM、Farm v6、LaunchLab)是用 Anchor 編寫的——一個建立在 Solana 原生程式模型之上的 Rust 框架,提供帳戶驗證、錯誤處理和 IDL(介面描述)。AMM v4 和較舊的農場程式早於 Anchor。理解兩種範式有助於你閱讀程式碼、從 IDL 產生客戶端,以及除錯意外的錯誤。
程式部署模型
每個 Solana 程式都位於一個Pubkey。程式的位元組碼儲存在由 BPF 可升級載入器(BPFLoaderUpgradeab1e11111111111111111111111)擁有的可執行帳戶中。
一個程式部署包含三個帳戶:
- 程式帳戶:程式 ID 處的小型元資料帳戶。擁有者:BPF 可升級載入器。
- ProgramData 帳戶:保存實際的位元組碼。衍生為
[program_id, "programdata"]。 - Buffer 帳戶(暫時性):在升級期間保存新位元組碼。升級後被丟棄。
security/admin-and-multisig。
驗證已部署的程式
要確認鏈上的內容與經過審計批准的原始碼相符:Anchor:Solana 之上的框架
原生 Solana 程式是具有以下簽名的 Rust 函數:- 為每個指令和每個帳戶類型自動產生一個確定性的 8 位元組判別器。
- 在你的程式碼執行前驗證帳戶約束(擁有者、種子、可寫、簽署者、鑄幣匹配、代幣程式匹配)。
- 產生一個 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 可以升級。步驟:
- 編譯新位元組碼。
- 將其寫入緩衝區帳戶(
solana program write-buffer)。 - 提交升級指令:
BpfLoaderUpgradeable::Upgrade { buffer, program, authority }。 - 執行時原子性地用緩衝區的內容替換程式的位元組碼。
security/admin-and-multisig。
使程式不可變
升級授權可以設定為None,此時程式變成永久不可變。Raydium 還沒有為任何產品這樣做——團隊保留推送安全修復的能力。權衡:使用者必須信任多簽 + 時間鎖流程。
程式與租金
部署程式消耗免租 lamport:- 一個 50 KB 程式:約 0.35 SOL 租金。
- 一個 200 KB 程式:約 1.4 SOL 租金。
solana program close)返回 lamport。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— Anchor 聲明的 PDA。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中發佈)。

