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.
-
Test etmek istediğiniz programı derleyin ve dağıtın
-
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 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!, 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 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);
✓ 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 mainnetsolana program dump gSbePebfvPy7tRqimPoVecS2UsBvYv46ynrzWocc92s pyth.so --url mainnet-beta# Dump from devnetsolana 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:
- Anchor,
target/deploy/program-keypair.jsonoluşturur - Native derlemeleri,
.sodosyasının yanında bir keypair dosyası oluşturur - Programın zincir üzerindeki adresi, bu keypair'ın public key'idir ve aynı zamanda program ID'si olarak da bilinir.
- PDA'lar için
find_program_address(), program ID'sini seed olarak gerektirir - 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 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);
Program Bulunamadı Hatası
Hata: TransactionError::InvalidProgramForExecution
Yaygın Nedenler:
- Program dağıtılmadı
- Talimatta yanlış program ID kullanıldı
- Program ID, keypair ile eşleşmiyor
Hata Ayıklama Adımları:
// 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");
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 deployedsvm.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 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);
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?