Solana DokümantasyonuLiteSVMRustProgramınızı Test Etme

Program Dağıtımı

Başlarken

let mut svm = LiteSVM::new();

Bu, tüm çalışma zamanı özellikleri etkin, varsayılan sysvars, ön derlemeler, spl programları, sigverify ve System Program dahil tüm yerleşik programlarla birlikte temel litesvm test örneğini oluşturur.

Testlerinizde başka bir programla etkileşime geçmek için o programı test ortamınıza dağıtmanız gerekir.

  1. Test etmek istediğiniz programı derleyin ve dağıtın

  2. Yukarıdaki programın CPI çağrısı yaptığı tüm programları bulun ve bu programları dağıtın

Örnek: Programınız Pyth'ten veri akışları kullanıyorsa, test örneğinize Pyth programının dağıtılmış olması gerekir.

Temel Program Dağıtımı

Yöntem 1: Baytlardan Dağıtım

En hızlı test yürütmesi için programları doğrudan bayt dizilerinden dağıtın:

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!, ikili dosyayı derleme sırasında doğrudan test yürütülebilir dosyasına gömer ve böylece test yürütmesi sırasında G/Ç işlemlerini ortadan kaldırır.

Avantajlar

  • Çalışma zamanında daha hızlı (disk okuma yok)
  • Bağımsız test ikili dosyası
  • Derleme sonrası .so dosyası silinse bile çalışır

Dezavantajlar

  • Daha büyük test ikili dosyası boyutu
  • .so değiştiğinde testlerin yeniden derlenmesi gerekir

Yöntem 2: Dosyadan Dağıtım (.so)

Sık değişen programları dosya sisteminden yükleyin:

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);

Avantajlar

  • Daha küçük test ikili dosyası
  • Testleri yeniden derlemeden .so değişikliklerini algılayabilir
  • CI/CD süreçleri için daha esnek

Dezavantajlar

  • Daha yavaş (çalışma zamanında disk G/Ç'si)
  • Test çalıştırma sırasında .so dosyasının mevcut olması gerekir
  • Dosya yolunun test çalıştırma dizinine göre doğru olması gerekir

Mainnet/Devnet'ten Program Çekme

Kaynak koduna sahip olmadığınız bir programa ihtiyaç duyduğunuzda, canlı kümelerden program almak ve testlerde kullanmak için Solana CLI'ı kullanın:

# 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

Ardından testlerinizde yükleyin:

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

En İyi Uygulamalar

1. Doğru Dağıtım Yöntemini Seçin

  • add_program() şu durumlarda kullanın:

    • Programlar derleme sırasında test ikilisine gömülüdür
    • Daha hızlı test çalıştırması istiyorsunuz (çalışma zamanı G/Ç'si olmadan)
    • Bağımsız testler
  • add_program_from_file() şunu kullandığınızda:

    • Programlar ayrı olarak derleniyor (yani devnet'ten çekiliyor)
    • Geliştirme sırasında program sık sık değişiyor (testleri yeniden derlemeden yeniden çalıştırabilirsiniz)
    • .so dosyalarının yapı eserleri olduğu CI/CD ortamlarınız var

Program keypair Dosyalarını Anlamak

Bir Solana programı derlediğinizde:

  1. Anchor, target/deploy/program-keypair.json oluşturur
  2. Native derlemeleri, .so dosyasının yanında bir keypair dosyası oluşturur
  3. Programın zincir üzerindeki adresi, bu keypair'ın public key'idir ve aynı zamanda program ID'si olarak da bilinir.
  4. PDA'lar için find_program_address(), program ID'sini seed olarak gerektirir
  5. CPI'lar için program ID, diğer programları çağırmak amacıyla kullanılır

Yaygın Sorunlar ve Çözümleri

Sessiz Dağıtım Hataları

Sorun: Program dağıtılmış görünüyor ancak işlemler "InvalidProgramForExecution" hatasıyla başarısız oluyor.

Neden: Program ID, keypair ile eşleşmiyor.

Çözüm:

// 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);

Program Bulunamadı Hatası

Hata: TransactionError::InvalidProgramForExecution

Yaygın Nedenler:

  1. Program dağıtılmadı
  2. Talimatta yanlış program ID kullanıldı
  3. Program ID, keypair ile eşleşmiyor

Hata Ayıklama Adımları:

// 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");

Dağıtılmamış Programlara CPI

Sorun: Programınız, dağıtılmamış bir programa CPI çağrısı yapıyor.

Çözüm: Tüm bağımlılık programlarını dağıtın:

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

Programı bir kümeden çekmeniz gerekiyorsa bu bölümü inceleyin.

Dağıtım için Yetersiz lamport

Not: LiteSVM, programlar için kira muafiyeti bakiyesini otomatik olarak yönetir.

// 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);

Dağıtım Doğrulama Kontrol Listesi

Program keypair'ini oku

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

Eşleşen ID ile dağıt

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

Dağıtımı doğrula

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

Programınızın CPI aracılığıyla çağırdığı tüm programları litesvm test örneğine dağıtın

Sonraki Adımlar

Bir sonraki bölümde, program talimatlarını nasıl çalıştıracağımızı ve karmaşık işlem kalıplarını nasıl ele alacağımızı öğreneceğiz.

Is this page helpful?

© 2026 Solana Vakfı. Tüm hakları saklıdır.