Skip to main content
Halaman ini diterjemahkan secara otomatis oleh AI. Versi bahasa Inggris adalah acuan resmi.Lihat versi bahasa Inggris →
Program Raydium yang lebih baru (CPMM, CLMM, Farm v6, LaunchLab) ditulis dalam Anchor — framework Rust yang dibangun di atas model program native Solana untuk menyediakan validasi akun, penanganan error, dan IDL (interface description). AMM v4 dan farm yang lebih lama mendahului Anchor. Memahami kedua paradigma membantu Anda membaca kode, membuat klien dari IDL, dan men-debug error yang tidak terduga.

Model deployment program

Setiap program Solana berada di sebuah Pubkey. Bytecode program disimpan dalam akun executable yang dimiliki oleh BPF Upgradable Loader (BPFLoaderUpgradeab1e11111111111111111111111). Deployment program terdiri dari tiga akun:
  1. Program account: akun metadata kecil di ID program. Pemilik: BPF Upgradable Loader.
  2. ProgramData account: menyimpan bytecode sebenarnya. Diturunkan sebagai [program_id, "programdata"].
  3. Buffer account (sementara): menyimpan bytecode baru selama upgrade. Dibuang setelah upgrade.
Akun ProgramData memiliki upgrade authority — kunci yang dapat mengganti bytecode dengan versi baru. Upgrade authority Raydium adalah multisig di belakang timelock 24 jam; lihat security/admin-and-multisig.

Memverifikasi program yang di-deploy

Untuk memastikan apa yang ada di on-chain cocok dengan sumber yang disetujui audit:
Hash yang cocok membuktikan Anda berinteraksi dengan sumber yang Anda pikir. Raydium menerbitkan instruksi verified-build di catatan rilis.

Anchor: framework di atas Solana

Program Solana mentah adalah fungsi Rust dengan signature ini:
Anchor membungkus semua boilerplate dan memungkinkan Anda menulis:
Anchor:
  • Auto-generate discriminator 8-byte deterministik untuk setiap instruksi dan tipe akun.
  • Validasi constraint akun (pemilik, seeds, writable, signer, mint-matches, token-program-matches) sebelum kode Anda berjalan.
  • Generate IDL — file deskripsi interface yang digunakan klien untuk memanggil program.
  • Dilengkapi dengan library klien-side Rust, TypeScript, dan Python.

Discriminator 8-byte

Setiap akun Anchor dan setiap instruksi Anchor dimulai dengan discriminator 8-byte — 8 byte pertama dari SHA-256 dari string tetap:
Ketika Anda memanggil instruksi Anchor, 8 byte pertama dari data instruksi adalah discriminator ini; Anchor mengirim ke handler yang tepat dengan mencarinya. Ketika Anda membaca akun Anchor, 8 byte pertama memberi tahu Anda tipenya — penting untuk tools seperti getProgramAccounts yang menghitung semua akun dari tipe.

Error

Program Anchor mendefinisikan error melalui #[error_code]:
Anchor auto-assign kode numerik ini mulai dari 6000 (0x1770). Tabel kode error lengkap Raydium ada di reference/error-codes.

IDL

File IDL (Interface Description Language) Anchor adalah deskripsi JSON dari program: instruksi, akun, tipe, error, dan event-nya. Ini setara dengan ABI Ethereum. Raydium menerbitkan IDL untuk semua program Anchor. Ambil langsung dari on-chain:
Atau dari sumber SDK: src/raydium/*/idl/*.json.

Struktur IDL

Membuat klien dari IDL

CLI anchor Anchor membuat tipe TypeScript dan Rust:
Tool pihak ketiga seperti Kinobi dapat membuat klien Rust, Python, C, atau Go dari IDL.

Ketika IDL adalah teman Anda

Jika Anda ingin membangun integrasi kustom yang tidak melalui Raydium SDK:
  1. Ambil IDL (langsung dari on-chain atau dari sumber SDK).
  2. Cari instruksi yang Anda inginkan (misalnya, swap_base_input).
  3. Bangun data instruksi: discriminator 8-byte + encoded args.
  4. Lewatkan akun dalam urutan yang ditentukan IDL.
Lihat sdk-api/anchor-idl untuk contoh yang dikerjakan.

Program pre-Anchor: AMM v4 dan Farm v3/v5

Program ini mendahului Anchor. Mereka menggunakan:
  • Manual instruction dispatch: tag u8 dalam instruction_data dengan pernyataan match.
  • Manual account validation: if accounts[0].owner != &expected_program { ... }.
  • Borsh-serialized instruction args: tidak ada discriminator, hanya instruction_data[1..].
  • Layout via #[repr(C, packed)]: layout binary struct C.
Raydium SDK v2 mengirimkan layout TypeScript untuk instruksi AMM v4 non-Anchor sehingga klien dapat encode/decode tanpa Anchor:
Pola integrasi sama — Anda hanya tidak mendapatkan auto-generation yang didorong IDL Anchor.

Mekanik upgrade program

Hanya upgrade_authority ProgramData yang dapat upgrade. Langkah-langkah:
  1. Kompilasi bytecode baru.
  2. Tuliskan ke akun buffer (solana program write-buffer).
  3. Kirimkan instruksi upgrade: BpfLoaderUpgradeable::Upgrade { buffer, program, authority }.
  4. Runtime secara atomik mengganti bytecode program dengan konten buffer.
Raydium membatasi ini di belakang timelock 24 jam yang diimplementasikan dalam pengaturan multisig Squads. Transaksi upgrade harus menunggu 24 jam setelah persetujuan multisig sebelum eksekusi. Ini melindungi dari upgrade yang terburu-buru / dipaksa. Lihat security/admin-and-multisig.

Membuat program immutable

Upgrade authority dapat diatur ke None, di mana program menjadi permanen immutable. Raydium belum melakukan ini untuk produk apa pun — tim mempertahankan kemampuan untuk mendorong perbaikan keamanan. Trade-off: pengguna harus mempercayai proses multisig + timelock.

Program dan rent

Men-deploy program mengonsumsi lamport rent-exempt:
  • Program 50 KB: ~0.35 SOL dalam rent.
  • Program 200 KB: ~1.4 SOL dalam rent.
Menutup program (via solana program close) mengembalikan lamport. Program Raydium tetap aktif dan tidak dijadwalkan untuk ditutup.

Men-debug program Anchor

Output log

Macro msg! Anchor menulis ke log transaksi. Simulasikan transaksi untuk melihat log:
Log mencakup:
  • Program invocation (Program CPMMoo8... invoke [1]).
  • Panggilan msg! dari kode program.
  • Konsumsi compute unit (consumed 137842 of 400000 compute units).
  • Kesuksesan atau error program.

Kode error

Jika program Anchor melempar, log menunjukkan:
0x1770 = 6000 desimal = error Anchor pertama (misalnya, SlippageExceeded). Cross-reference dengan array errors IDL. Lihat reference/error-codes untuk tabel error lengkap Raydium.

Ketidakcocokan layout akun

Jika Anda melewatkan akun yang salah di slot yang salah, macro validasi akun Anchor mengembalikan error seperti:
Nomor error di bawah 6000 adalah error built-in Anchor (lihat enum ErrorCode Anchor); error ≥6000 adalah kode kustom program.

Pointer

Sumber: