本頁內容由 AI 自動翻譯,所有內容以英文版本為準。查看英文版 →
CPI(「跨程式叫用」)是一個 Solana 程式呼叫另一個程式的機制。Raydium 的 Anchor 程式附帶 CPI 包裝 crate,讓呼叫端看起來像是有型別的函式呼叫 — 包含驗證過的欄位名稱的帳戶結構體和
cpi::<ix>() 輔助函式。本頁文件涵蓋一般模式;對於特定產品的程式碼片段,請參閱各產品章節的 code-demos 頁面。Cargo 相依性
cpi 特性旗標讓 crate 僅編譯至 CPI 介面面(帳戶結構體 + 叫用程式),而不是完整程式,因此你的二進位檔保持小巧。
如需從頭到尾連接帳戶結構體的有效 CPI 範例,請見 raydium-io/raydium-cpi-example(涵蓋 AMM v4、CPMM 和 CLMM)。
帳戶列表構造
每個 Raydium CPI 都需要呼叫程式中的Accounts 結構體。欄位與程式的指令帳戶順序一一對應,並具備欄位級驗證器:
UncheckedAccount,因為被呼叫程式(Raydium)負責驗證。你的呼叫程式只需嚴格驗證你擁有的帳戶 — 使用者 ATA、你自己的 PDA。/// CHECK: 文件註解會抑制 Anchor 關於遺失檢查的警告。
構建 CPI 呼叫
Anchor 為每條指令產生一個輔助函式:cpi::swap_base_input 是由 IDL 產生的;其引數列表反映 Anchor 指令的引數列表。
簽署者種子(PDA 簽署 CPI)
當你的程式代表 PDA 簽署 CPI 時(對於保管庫、託管等很常見),請使用CpiContext::new_with_signer:
authority(或類似簽署者角色)傳遞的任何帳戶,Solana 執行時會檢查 PDA 是否透過這些種子簽署。
剩餘帳戶
某些 Raydium 指令會取用剩餘帳戶 — 固定帳戶後面附加的可變長度列表。規範例子:- CLMM
SwapV2:附加 1–8 個TickArrayState帳戶,對應交換可能遍歷的 tick 陣列。 - Farm v6
Deposit:為每個活躍獎勵流附加(reward_vault, user_reward_ata)對。
.with_remaining_accounts(...) 傳遞它們:
錯誤傳播
Raydium 的程式會傳回它們自己的錯誤列舉。Anchor 會包裝它們;你的呼叫程式將其視為Err(ProgramError::Custom(code))。若要處理特定錯誤:
sdk-api/anchor-idl),錯誤代碼數字是穩定的。你可以透過與數值比較來測試特定程式碼。
組成 CPI 中的運算預算
每個 CPI 框架都有開銷(~1,500 CU 用於呼叫本身),被呼叫程式本身的 CU 消耗堆疊在你的之上。從你的程式內部呼叫 CPMM 交換的交易花費:ComputeBudgetProgram::set_compute_unit_limit(...) 指令 — 預設 200k CU 限制會無聲地用盡。
AMM v4 — 手動 Instruction 構造
AMM v4 沒有 Anchor crate。手動構建Instruction:
products/amm-v4/code-demos 了解完整帳戶列表。
Farm v6 — 獎勵對剩餘帳戶
Farm v6 的Deposit / Withdraw / Harvest 在剩餘帳戶中使用 (reward_vault_i, user_reward_ata_i) 對模式。確切序列:
farm_state.reward_infos[i].reward_state 進行分配。
測試 CPI 流
本機開發需要 Raydium 程式在你的測試驗證器中可用。選項:-
anchor testwith program clone — 在Anchor.toml中:這會將已部署的位元組碼從主網拉入你的本機驗證器。 -
Devnet — Raydium 將所有程式部署到 devnet,使用與主網相同的程式 ID。執行
anchor test --provider.cluster devnet以叫用實時程式碼。 -
本機部署 — 複製 Raydium 儲存庫並
anchor deploy至本機驗證器。增加測試週期開銷,但讓你可以修改被呼叫程式進行偵錯。
指標
products/cpmm/code-demos、products/clmm/code-demos、products/amm-v4/code-demos、products/farm-staking/code-demos— 特定產品的 CPI 範例。sdk-api/anchor-idl— IDL 檢索和用戶端重新產生。integration-guides/cpi-integration— 更高階的模式:託管、保管庫、聚合器組成。

