Trang này được dịch tự động bằng AI. Phiên bản tiếng Anh là bản chính thức.Xem bản tiếng Anh →
CPI (“cross-program invocation”) là cơ chế mà một chương trình Solana gọi một chương trình khác. Các chương trình Anchor của Raydium đi kèm với các crate CPI wrapper giúp call site trông như một hàm được gõ — các struct tài khoản với tên trường được xác thực và
cpi::<ix>() helpers. Trang này nêu ra mẫu chung; để xem các đoạn mã theo từng sản phẩm, hãy xem trang code-demos của từng chương sản phẩm.Các phụ thuộc Cargo
cpi khiến các crate được biên dịch chỉ thành bề mặt CPI (account structs + invokers) thay vì toàn bộ chương trình, vì vậy file nhị phân của bạn vẫn nhỏ.
Để xem các ví dụ CPI hoạt động nối tiếp các struct tài khoản từ đầu đến cuối, hãy xem raydium-io/raydium-cpi-example (bao gồm AMM v4, CPMM, và CLMM).
Xây dựng danh sách tài khoản
Mỗi CPI của Raydium yêu cầu một structAccounts trong chương trình gọi. Các trường khớp với thứ tự tài khoản của lệnh chương trình 1-1, với các bộ xác thực cấp trường:
UncheckedAccount vì chương trình được gọi (Raydium) sở hữu xác thực. Chương trình gọi của bạn chỉ xác thực nghiêm ngặt các tài khoản bạn sở hữu — user ATAs, PDAs của riêng bạn. Comment doc /// CHECK: che giấu cảnh báo của Anchor về các kiểm tra bị thiếu.
Xây dựng CPI call
Anchor tạo một helper cho mỗi lệnh:cpi::swap_base_input được tạo từ IDL; danh sách đối số của nó phản ánh danh sách đối số của lệnh Anchor.
Signer seeds (PDA-signed CPI)
Khi chương trình của bạn ký CPI thay mặt một PDA (phổ biến đối với vaults, escrows, v.v.), hãy sử dụngCpiContext::new_with_signer:
authority (hoặc vai trò signer tương tự), runtime Solana kiểm tra rằng PDA ký qua các seeds này.
Remaining accounts
Một số lệnh Raydium nhận remaining accounts — danh sách có độ dài thay đổi được nối sau các tài khoản cố định. Các ví dụ chuẩn:- CLMM
SwapV2: nối 1–8 tài khoảnTickArrayStatetương ứng với các mảng tick mà swap có thể đi qua. - Farm v6
Deposit: nối các cặp(reward_vault, user_reward_ata)cho mỗi luồng reward đang hoạt động.
.with_remaining_accounts(...):
Xử lý lỗi
Các chương trình của Raydium trả về các enum lỗi riêng của chúng. Anchor bao bọc chúng; chương trình gọi của bạn thấy chúng dưới dạngErr(ProgramError::Custom(code)). Để xử lý các lỗi cụ thể:
sdk-api/anchor-idl). Bạn có thể kiểm tra các mã cụ thể bằng cách so sánh với giá trị số.
Compute budget trong composed CPIs
Mỗi khung CPI có overhead (~1.500 CU cho chính call), và tiêu thụ CU của callee xếp chồng lên của bạn. Một giao dịch gọi CPMM swap từ bên trong chương trình của bạn chi tiêu:ComputeBudgetProgram::set_compute_unit_limit(...) rõ ràng trong giao dịch — giới hạn CU mặc định 200k sẽ cạn kiệt im lặng.
AMM v4 — xây dựng Instruction thủ công
AMM v4 không có crate Anchor. Xây dựngInstruction bằng tay:
products/amm-v4/code-demos để xem danh sách tài khoản đầy đủ.
Farm v6 — remaining accounts cặp reward
Farm v6Deposit / Withdraw / Harvest sử dụng mẫu cặp (reward_vault_i, user_reward_ata_i) trong remaining accounts. Trình tự chính xác:
farm_state.reward_infos[i].reward_state.
Kiểm tra luồng CPI
Dev cục bộ yêu cầu các chương trình Raydium có sẵn trong test validator của bạn. Các tùy chọn:-
anchor testvới program clone — trongAnchor.toml:Điều này kéo bytecode được triển khai từ mainnet vào validator cục bộ của bạn. -
Devnet — Raydium triển khai tất cả các chương trình vào devnet với cùng một program ID như mainnet. Chạy
anchor test --provider.cluster devnetđể truy cập code trực tiếp. -
Local deploy — clone các repo Raydium và
anchor deployvào một validator cục bộ. Thêm overhead vòng lặp kiểm tra nhưng cho phép bạn sửa đổi callee để gỡ lỗi.
Con trỏ
products/cpmm/code-demos,products/clmm/code-demos,products/amm-v4/code-demos,products/farm-staking/code-demos— các ví dụ CPI theo từng sản phẩm.sdk-api/anchor-idl— truy xuất IDL và tạo lại client.integration-guides/cpi-integration— các mẫu cấp cao hơn: escrows, vaults, aggregator composition.

