Dokumentasi SolanaLiteSVMRustMenguji Program Anda

Mendeploy Program

Memulai

let mut svm = LiteSVM::new();

Ini membuat instans pengujian litesvm dasar, yang mencakup semua fitur runtime yang diaktifkan, sysvars default, precompile, program spl, sigverify, dan semua program bawaan seperti System Program.

Untuk berinteraksi dengan program lain dalam pengujian Anda, Anda harus mendeploy program tersebut ke lingkungan pengujian Anda.

  1. Build dan deploy program yang ingin Anda uji

  2. Temukan semua program yang dipanggil oleh program di atas melalui CPI dan deploy program-program tersebut

Contoh: Jika program Anda menggunakan data feed dari Pyth, Anda perlu mendeploy program Pyth ke instans pengujian Anda.

Deployment Program Dasar

Metode 1: Deploy dari Bytes

Deploy program langsung dari array byte untuk eksekusi pengujian tercepat:

use litesvm::LiteSVM;
use solana_sdk::signature::{read_keypair_file, Signer};
let mut svm = LiteSVM::new();
// Read the program's keypair to get correct ID
let program_keypair = read_keypair_file("target/deploy/my_program-keypair.json")
.expect("Program keypair file not found");
let program_id = program_keypair.pubkey();
// Include bytes at compile time
let program_bytes = include_bytes!("../target/deploy/my_program.so");
// Deploy from bytes
svm.add_program(program_id, program_bytes)
.expect("Failed to deploy program");
// Verify deployment
assert!(svm.get_account(&program_id).is_some(), "Program account not created");
assert!(svm.get_account(&program_id).unwrap().executable, "Program not executable");

include_bytes! menyematkan biner langsung ke dalam eksekusi pengujian saat kompilasi, menghilangkan I/O selama eksekusi pengujian.

Kelebihan

  • Lebih cepat saat runtime (tidak ada pembacaan disk)
  • Biner pengujian yang mandiri
  • Tetap berfungsi meski file .so dihapus setelah kompilasi

Kekurangan

  • Ukuran biner pengujian lebih besar
  • Harus mengompilasi ulang pengujian saat .so berubah

Metode 2: Deploy dari File (.so)

Muat program dari sistem file saat program sering berubah:

use litesvm::LiteSVM;
use solana_sdk::signature::{read_keypair_file, Signer};
let mut svm = LiteSVM::new();
// Read keypair for correct program ID
let program_keypair = read_keypair_file("target/deploy/program-keypair.json").unwrap();
let program_id = program_keypair.pubkey();
// Deploy from file
svm.add_program_from_file(program_id, "target/deploy/program.so")
.expect("Failed to deploy program from file");
// Always verify
assert!(svm.get_account(&program_id).unwrap().executable);

Kelebihan

  • Binary pengujian lebih kecil
  • Dapat memuat perubahan .so tanpa mengompilasi ulang pengujian
  • Lebih fleksibel untuk pipeline CI/CD

Kekurangan

  • Lebih lambat (I/O disk saat runtime)
  • Memerlukan file .so yang ada pada saat eksekusi pengujian
  • Path file harus benar relatif terhadap direktori eksekusi pengujian

Mengambil Program dari Mainnet/Devnet

Saat Anda membutuhkan program yang kodenya tidak Anda miliki, gunakan Solana CLI untuk mengambil program dari cluster live dan menggunakannya dalam pengujian:

# Dump a program from mainnet
solana program dump gSbePebfvPy7tRqimPoVecS2UsBvYv46ynrzWocc92s pyth.so --url mainnet-beta
# Dump from devnet
solana program dump YourProgramID program.so --url devnet

Kemudian muat dalam pengujian Anda:

svm.add_program_from_file(
pubkey!("gSbePebfvPy7tRqimPoVecS2UsBvYv46ynrzWocc92s"),
"pyth.so"
).unwrap();

Praktik Terbaik

1. Pilih Metode Deployment yang Tepat

  • Gunakan add_program() saat:

    • Program disematkan dalam binary pengujian Anda pada waktu kompilasi
    • Anda menginginkan eksekusi pengujian yang lebih cepat (tanpa I/O runtime)
    • Pengujian yang bersifat mandiri
  • Gunakan add_program_from_file() ketika:

    • Program dibangun secara terpisah (yaitu mengambil dari devnet)
    • Program sering berubah selama pengembangan (dapat menjalankan ulang pengujian tanpa mengompilasi ulang)
    • Anda memiliki lingkungan CI/CD di mana file .so adalah artefak

Memahami Program keypair

Ketika Anda membangun program Solana:

  1. Anchor membuat target/deploy/program-keypair.json
  2. Native menghasilkan file keypair bersama file .so
  3. Alamat on-chain program adalah kunci publik keypair ini, yang juga dikenal sebagai ID program.
  4. Untuk PDA, find_program_address() memerlukan ID program sebagai seed
  5. Untuk CPI, ID program digunakan untuk memanggil program lain

Masalah Umum dan Solusinya

Kegagalan Deployment yang Tidak Terdeteksi

Masalah: Program tampak berhasil di-deploy tetapi transaksi gagal dengan "InvalidProgramForExecution".

Penyebab: ID program tidak cocok dengan keypair.

Solusi:

// Always use the keypair-derived ID
let keypair = read_keypair_file("target/deploy/program-keypair.json").unwrap();
let program_id = keypair.pubkey();
svm.add_program(program_id, &program_bytes).unwrap();
// Verify with detailed checks
let account = svm.get_account(&program_id)
.expect("Program account doesn't exist");
assert!(account.executable, "Program not executable");
assert_eq!(account.owner, solana_sdk::bpf_loader::id(), "Wrong owner");
assert!(!account.data.is_empty(), "Program data is empty");
println!("✅ Program verified at {}", program_id);

Error Program Tidak Ditemukan

Error: TransactionError::InvalidProgramForExecution

Penyebab Umum:

  1. Program belum di-deploy
  2. ID program yang digunakan dalam instruksi salah
  3. ID program tidak cocok dengan keypair

Langkah-langkah Debug:

// Step 1: Check if program exists
if let Some(account) = svm.get_account(&program_id) {
println!("Program exists");
println!(" Executable: {}", account.executable);
println!(" Owner: {}", account.owner);
println!(" Data length: {}", account.data.len());
} else {
println!("Program does not exist at {}", program_id);
}
// Step 2: Verify the ID matches keypair
let expected_keypair = read_keypair_file("target/deploy/program-keypair.json").unwrap();
let expected_id = expected_keypair.pubkey();
if program_id != expected_id {
println!(" ID mismatch!");
println!(" Used: {}", program_id);
println!(" Expected: {}", expected_id);
}
// Step 3: Check instruction program ID
println!("Instruction program_id: {}", instruction.program_id);
assert_eq!(instruction.program_id, program_id, "Instruction uses wrong program ID");

CPI ke Program yang Belum Di-deploy

Masalah: Program Anda melakukan panggilan CPI ke program yang belum di-deploy.

Solusi: Deploy semua program dependensi:

// Find all dependency programs and make sure they are deployed
svm.add_program_from_file(
pubkey!("gSbePebfvPy7tRqimPoVecS2UsBvYv46ynrzWocc92s"),
"pyth.so"
).unwrap();

Jika Anda perlu mengambil program dari sebuah cluster, tinjau bagian ini.

lamport Tidak Cukup untuk Deployment

Catatan: LiteSVM secara otomatis menangani saldo bebas sewa untuk program.

// No need to manually fund - LiteSVM handles this
svm.add_program(program_id, &program_bytes).unwrap();
// But you can check the rent if needed
let program_len = program_bytes.len();
let required_lamports = svm.minimum_balance_for_rent_exemption(program_len);
println!("Program requires {} lamports for rent exemption", required_lamports);

Daftar Periksa Verifikasi Deployment

Baca keypair program

let keypair = read_keypair_file("target/deploy/program-keypair.json").unwrap();
let program_id = keypair.pubkey();

Deploy dengan ID yang sesuai

svm.add_program(program_id, &program_bytes).unwrap();

Verifikasi deployment

assert!(svm.get_account(&program_id).unwrap().executable);

Deploy semua program yang dipanggil oleh program Anda melalui CPI ke instans pengujian litesvm

Langkah Selanjutnya

Di bagian berikutnya, kita akan mempelajari cara mengeksekusi instruksi program dan menangani pola transaksi yang kompleks.

Is this page helpful?

© 2026 Yayasan Solana. Semua hak dilindungi.