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 →
Các chương trình mới hơn của Raydium (CPMM, CLMM, Farm v6, LaunchLab) được viết bằng Anchor — một framework Rust xây dựng trên mô hình chương trình gốc của Solana để cung cấp xác thực tài khoản, xử lý lỗi và IDL (interface description). AMM v4 và các farm cũ hơn ra đời trước Anchor. Hiểu cả hai mô hình giúp bạn đọc code, tạo client từ IDL và gỡ lỗi các lỗi không mong muốn.
Mô hình triển khai chương trình
Mỗi chương trình Solana nằm tại mộtPubkey. Bytecode của chương trình được lưu trữ trong một tài khoản executable được sở hữu bởi BPF Upgradable Loader (BPFLoaderUpgradeab1e11111111111111111111111).
Một triển khai chương trình bao gồm ba tài khoản:
- Program account: tài khoản metadata nhỏ tại ID của chương trình. Chủ sở hữu: BPF Upgradable Loader.
- ProgramData account: chứa bytecode thực tế. Được dẫn xuất dưới dạng
[program_id, "programdata"]. - Buffer account (tạm thời): chứa bytecode mới trong quá trình nâng cấp. Bị loại bỏ sau khi nâng cấp.
security/admin-and-multisig.
Xác minh một chương trình được triển khai
Để xác nhận rằng những gì trên chuỗi khớp với những gì trong nguồn được kiểm toán:Anchor: một framework trên Solana
Các chương trình Solana thô là các hàm Rust với chữ ký này:- Tự động tạo một discriminator 8 byte xác định cho mỗi instruction và mỗi loại tài khoản.
- Xác thực các ràng buộc tài khoản (chủ sở hữu, seeds, writable, signer, mint-matches, token-program-matches) trước khi code của bạn chạy.
- Tạo một IDL — một tệp mô tả interface mà các client sử dụng để gọi chương trình.
- Đi kèm với thư viện client Rust, TypeScript và Python.
Discriminator 8 byte
Mỗi tài khoản Anchor và mỗi instruction Anchor bắt đầu bằng một discriminator 8 byte — 8 byte đầu tiên của SHA-256 của một chuỗi cố định:getProgramAccounts liệt kê tất cả các tài khoản của một loại.
Lỗi
Các chương trình Anchor định nghĩa lỗi thông qua#[error_code]:
reference/error-codes.
IDL
Một tệp IDL (Interface Description Language) của Anchor là mô tả JSON của một chương trình: các instruction, tài khoản, loại, lỗi và sự kiện của nó. Nó tương đương với ABI của Ethereum. Raydium công bố IDL cho tất cả các chương trình Anchor. Lấy trực tiếp từ trên chuỗi:src/raydium/*/idl/*.json.
Cấu trúc IDL
Tạo client từ IDL
CLIanchor của Anchor tạo các loại TypeScript và Rust:
Khi IDL là bạn của bạn
Nếu bạn muốn xây dựng một tích hợp tùy chỉnh không đi qua Raydium SDK:- Lấy IDL (trực tiếp từ trên chuỗi hoặc từ nguồn SDK).
- Tra cứu instruction bạn muốn (ví dụ:
swap_base_input). - Xây dựng dữ liệu instruction: discriminator 8 byte + các args được mã hóa.
- Truyền các tài khoản theo thứ tự mà IDL chỉ định.
sdk-api/anchor-idl để xem các ví dụ thực tế.
Các chương trình trước Anchor: AMM v4 và Farm v3/v5
Các chương trình này ra đời trước Anchor. Chúng sử dụng:- Manual instruction dispatch: một thẻ
u8tronginstruction_datavới một câu lệnhmatch. - Manual account validation:
if accounts[0].owner != &expected_program { ... }. - Borsh-serialized instruction args: không có discriminator, chỉ
instruction_data[1..]. - Layout via
#[repr(C, packed)]: bố cục binary struct C.
Cơ chế nâng cấp chương trình
Chỉupgrade_authority của ProgramData mới có thể nâng cấp. Các bước:
- Biên dịch bytecode mới.
- Viết nó vào một buffer account (
solana program write-buffer). - Gửi một instruction nâng cấp:
BpfLoaderUpgradeable::Upgrade { buffer, program, authority }. - Runtime nguyên tử thay thế bytecode của chương trình bằng nội dung của buffer.
security/admin-and-multisig.
Làm cho một chương trình bất biến
Một upgrade authority có thể được đặt thànhNone, tại thời điểm đó chương trình trở nên vĩnh viễn bất biến. Raydium chưa làm điều này cho bất kỳ sản phẩm nào — nhóm giữ lại khả năng đẩy các bản sửa lỗi bảo mật. Sự đánh đổi: người dùng phải tin tưởng vào quy trình multisig + timelock.
Các chương trình và rent
Triển khai một chương trình tiêu thụ lamports miễn phí rent:- Một chương trình 50 KB: ~0,35 SOL trong rent.
- Một chương trình 200 KB: ~1,4 SOL trong rent.
solana program close) trả lại lamports. Các chương trình Raydium vẫn hoạt động và không được lên lịch để đóng.
Gỡ lỗi các chương trình Anchor
Đầu ra log
Macromsg! của Anchor ghi vào log của giao dịch. Mô phỏng một giao dịch để xem log:
- Program invocation (
Program CPMMoo8... invoke [1]). - Các lệnh gọi
msg!từ code chương trình. - Tiêu thụ compute unit (
consumed 137842 of 400000 compute units). - Thành công hoặc lỗi của chương trình.
Mã lỗi
Nếu một chương trình Anchor ném, log hiển thị:SlippageExceeded). Tham chiếu chéo với mảng errors của IDL.
Xem reference/error-codes để xem bảng lỗi đầy đủ của Raydium.
Sự không khớp bố cục tài khoản
Nếu bạn truyền tài khoản sai vào slot sai, các macro xác thực tài khoản của Anchor trả về lỗi như:ErrorCode của Anchor); các lỗi ≥6000 là các mã tùy chỉnh của chương trình.
Con trỏ
solana-fundamentals/account-model— cách các chương trình sở hữu tài khoản.solana-fundamentals/pdas-and-cpis— PDA như Anchor khai báo chúng.sdk-api/anchor-idl— lấy và sử dụng IDL của Raydium.reference/program-addresses— ID chương trình.reference/error-codes— tham chiếu mã lỗi.security/admin-and-multisig— kiểm soát upgrade-authority.
- Anchor docs.
- Solana program deployment.
- Raydium IDLs (published in SDK
src/raydium/*/idl/*.json).

