Kurulum
Gerekli tüm bağımlılıklara sahip olduğunuzdan emin olun:
cargo add --dev litesvm litesvm-loader solana-keypair solana-signer
Testiniz dağıtılan programı doğrudan çağırıyorsa, testinizde kullanılan Solana komut ve işlem crate'lerini de ekleyin:
cargo add --dev solana-instruction solana-message solana-transaction
litesvm-loader Nedir?
litesvm-loader crate'i, LiteSVM içinde BPF yükseltilebilir yükleyici
aracılığıyla program dağıtımı için yardımcı araçlar sağlar. Testinizin
svm.add_program(...) ile programı doğrudan eklemek yerine yükleyiciye ait
program accounts, program data accounts veya yükseltme yetkisi davranışına
ihtiyaç duyduğu durumlarda kullanın.
Yükseltilebilir Dağıtım
- Yükleyici arabellek hesabını oluşturur
- Program baytlarını parçalar hâlinde yazar
- BPF yükseltilebilir yükleyici ile nihai program account'u dağıtır
- Sağlanan program keypair'ini program kimliği olarak kullanır
Yükseltme Yetkisi Yönetimi - Zaten dağıtılmış bir programın yükseltme
yetkisini değiştirir - Yeni bir yetki atamayı destekler - Programı
değiştirilemez hâle getirmek için None geçişini destekler
Gerçek Yükleyici Durumu - Programınızın zincir üzerinde gördüğü aynı yükleyici hesap modelini çalıştırır - Testlerin program ve program data accounts'ları incelemesine olanak tanır - Doğrudan program ekleme ile gizlenen hataları yakalamaya yardımcı olur
Çoğu test için svm.add_program(program_id, program_bytes), bir programı
yüklemek için hâlâ en hızlı ve en basit yoldur. Yükleyici hesabı düzeni veya
yükseltme yetkisi test etmeniz gereken bir parçaysa litesvm-loader kullanın.
Hızlı Örnek
Aşağıda, yükseltilebilir yükleyici aracılığıyla bir programı dağıtan ve ardından yetkisini değiştiren eksiksiz bir örnek verilmiştir:
use litesvm::LiteSVM;use litesvm_loader::{deploy_upgradeable_program, set_upgrade_authority};use solana_keypair::Keypair;use solana_signer::Signer;#[test]fn test_upgradeable_deployment() {let mut svm = LiteSVM::new();let payer = Keypair::new();svm.airdrop(&payer.pubkey(), 10_000_000_000).unwrap();// Use the keypair that should own the program ID.// For Anchor programs, this is usually target/deploy/<program>-keypair.json.let program = Keypair::new();let program_bytes = include_bytes!("../target/deploy/my_program.so");deploy_upgradeable_program(&mut svm, &payer, &program, program_bytes).unwrap();let program_account = svm.get_account(&program.pubkey()).unwrap();assert!(program_account.executable);let new_authority = Keypair::new();set_upgrade_authority(&mut svm,&payer,&program.pubkey(),&payer,Some(&new_authority.pubkey()),).unwrap();}
Program keypair Seçimi
deploy_upgradeable_program, program adresi olarak program_kp argümanını
kullanır. Programınız sabit bir kimlik bildiriyorsa, rastgele bir keypair
oluşturmak yerine oluşturulan dağıtım keypair'ini yükleyin:
use solana_keypair::read_keypair_file;let program = read_keypair_file("target/deploy/my_program-keypair.json").unwrap();deploy_upgradeable_program(&mut svm, &payer, &program, program_bytes).unwrap();
Dağıtılan Programı Çağırma
Dağıtımın ardından, programı LiteSVM ile yüklenmiş herhangi bir programı çağırır
gibi çağırın. Programınız için bir talimat oluşturun, işlemi imzalayın ve aynı
LiteSVM örneği üzerinden gönderin:
use solana_instruction::Instruction;use solana_message::Message;use solana_transaction::Transaction;let instruction = Instruction::new_with_bytes(program.pubkey(),&[], // instruction data for your programvec![], // account metas for your program);let message = Message::new(&[instruction], Some(&payer.pubkey()));let tx = Transaction::new(&[&payer], message, svm.latest_blockhash());svm.send_transaction(tx).unwrap();
Temel Bileşenler
deploy_upgradeable_program
| Argüman | Açıklama |
|---|---|
svm | Dağıtılan programı alan değiştirilebilir LiteSVM örneği |
payer_kp | Ücret ödeyici ve ilk yükseltme yetkisi |
program_kp | Genel anahtarı program kimliği olan keypair |
program_bytes | Derlenmiş SBF program baytları, genellikle target/deploy/*.so kaynağından |
deploy_upgradeable_program bir yükleyici arabelleği oluşturur, program
baytlarını 512 baytlık parçalar hâlinde yazar ve programı gelecekteki
yükseltmelere yer bırakarak dağıtır.
set_upgrade_authority
| Argüman | Açıklama |
|---|---|
svm | Dağıtılan programı içeren değiştirilebilir LiteSVM örneği |
from_keypair | İşlem için ücret ödeyici ve imzalama yetkisi |
program_address | Yetkisi değiştirilecek program kimliği |
current_authority_keypair | Mevcut yükseltme yetkisi keypair'i |
new_authority_address | Yeni yetki adresi veya programı değiştirilemez kılmak için None |
Mevcut yardımcı uygulamada, oluşturulan işlem from_keypair tarafından
imzalanır. Yükseltme yetkisini değiştirirken mevcut yetkiyi from_keypair
olarak geçin ya da ödeyici ile mevcut yetkiyi aynı tutun.
Yaygın İş Akışları
Bildirilen program ID'si ile dağıtım
use solana_keypair::read_keypair_file;let program = read_keypair_file("target/deploy/my_program-keypair.json").unwrap();let program_bytes = include_bytes!("../target/deploy/my_program.so");deploy_upgradeable_program(&mut svm, &payer, &program, program_bytes).unwrap();
Programı değiştirilemez hale getirme
set_upgrade_authority(&mut svm,&payer,&program.pubkey(),&payer,None,).unwrap();
Sorun Giderme
Yaygın Hatalar
| Hata | Neden | Çözüm |
|---|---|---|
ProgramAccountNotFound veya yanlış ID'ye karşı yönerge hataları | Dağıtım rastgele bir Keypair kullanırken program bildirilen bir ID bekliyor | target/deploy/<program>-keypair.json dosyasını okuyun ve o keypair'i deploy_upgradeable_program'e geçin |
InsufficientFunds | Ödeyicinin loader tamponu ve program account'ları için yeterli lamport'u yok | Dağıtımdan önce daha fazla lamport airdrop edin |
Yetki değiştirirken MissingRequiredSignature | Mevcut yetki işlemi imzalamadı | Mevcut yetkiyi from_keypair olarak geçin ya da ödeyici ve mevcut yetkiyi aynı keypair olarak tutun |
| Program dağıtımı beklenenden yavaş | Loader dağıtımı baytları gerçek loader yönergeleri aracılığıyla yazar | Loader durumuna veya yükseltme yetkisi davranışına ihtiyaç duymadığınızda svm.add_program(...) kullanın |
Is this page helpful?