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.
-
Build dan deploy program yang ingin Anda uji
-
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 IDlet 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 timelet program_bytes = include_bytes!("../target/deploy/my_program.so");// Deploy from bytessvm.add_program(program_id, program_bytes).expect("Failed to deploy program");// Verify deploymentassert!(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 IDlet program_keypair = read_keypair_file("target/deploy/program-keypair.json").unwrap();let program_id = program_keypair.pubkey();// Deploy from filesvm.add_program_from_file(program_id, "target/deploy/program.so").expect("Failed to deploy program from file");// Always verifyassert!(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 mainnetsolana program dump gSbePebfvPy7tRqimPoVecS2UsBvYv46ynrzWocc92s pyth.so --url mainnet-beta# Dump from devnetsolana 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:
- Anchor membuat
target/deploy/program-keypair.json - Native menghasilkan file keypair bersama file
.so - Alamat on-chain program adalah kunci publik keypair ini, yang juga dikenal sebagai ID program.
- Untuk PDA,
find_program_address()memerlukan ID program sebagai seed - 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 IDlet 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 checkslet 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:
- Program belum di-deploy
- ID program yang digunakan dalam instruksi salah
- ID program tidak cocok dengan keypair
Langkah-langkah Debug:
// Step 1: Check if program existsif 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 keypairlet 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 IDprintln!("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 deployedsvm.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 thissvm.add_program(program_id, &program_bytes).unwrap();// But you can check the rent if neededlet 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?