Instalasi
Pastikan Anda memiliki semua dependensi yang diperlukan:
cargo add --dev litesvm litesvm-loader solana-keypair solana-signer
Jika pengujian Anda memanggil program yang telah di-deploy secara langsung, tambahkan juga crate instruksi dan transaksi Solana yang digunakan oleh pengujian Anda:
cargo add --dev solana-instruction solana-message solana-transaction
Apa itu litesvm-loader?
Crate litesvm-loader menyediakan helper untuk men-deploy program melalui BPF
upgradeable loader di dalam LiteSVM. Gunakan ini ketika pengujian Anda
membutuhkan program account milik loader, program data account, atau perilaku
upgrade authority alih-alih menyisipkan program secara langsung menggunakan
svm.add_program(...).
Deployment yang Dapat Diperbarui
- Membuat buffer account loader
- Menulis byte program dalam potongan-potongan
- Men-deploy program account final dengan BPF upgradeable loader
- Menggunakan program keypair yang diberikan sebagai ID program
Manajemen Upgrade Authority - Mengubah upgrade authority untuk program
yang sudah di-deploy - Mendukung penetapan authority baru - Mendukung
pemberian None untuk membuat program tidak dapat diubah
Status Loader Nyata - Menjalankan model account loader yang sama seperti yang dilihat program Anda di-chain - Memungkinkan pengujian untuk memeriksa program account dan program data account - Membantu mendeteksi kesalahan yang tersembunyi akibat penyisipan program secara langsung
Untuk sebagian besar pengujian, svm.add_program(program_id, program_bytes)
masih merupakan cara tercepat dan termudah untuk memuat program. Gunakan
litesvm-loader ketika tata letak loader account atau upgrade authority
merupakan bagian dari yang perlu Anda uji.
Contoh Cepat
Berikut adalah contoh lengkap yang men-deploy program melalui upgradeable loader dan kemudian merotasi authority-nya:
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();}
Memilih Program keypair
deploy_upgradeable_program menggunakan argumen program_kp sebagai alamat
program. Jika program Anda mendeklarasikan ID tetap, muat keypair deploy yang
dihasilkan alih-alih membuat keypair acak:
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();
Memanggil Program yang Di-deploy
Setelah deployment, panggil program dengan cara yang sama seperti Anda memanggil
program yang dimuat oleh LiteSVM. Buat instruksi untuk program Anda,
tandatangani transaksi, dan kirimkan melalui instance LiteSVM yang sama:
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();
Komponen Utama
deploy_upgradeable_program
| Argumen | Deskripsi |
|---|---|
svm | Instance LiteSVM yang dapat diubah dan menerima program yang di-deploy |
payer_kp | Pembayar biaya dan upgrade authority awal |
program_kp | keypair yang public key-nya menjadi ID program |
program_bytes | Byte program SBF yang telah dikompilasi, biasanya dari target/deploy/*.so |
deploy_upgradeable_program membuat loader buffer, menulis byte program dalam
potongan 512-byte, dan men-deploy program dengan ruang untuk peningkatan di masa
mendatang.
set_upgrade_authority
| Argumen | Deskripsi |
|---|---|
svm | Instance LiteSVM yang dapat diubah yang berisi program yang di-deploy |
from_keypair | Pembayar biaya dan signing authority untuk transaksi |
program_address | ID program yang authority-nya harus diubah |
current_authority_keypair | keypair upgrade authority saat ini |
new_authority_address | Alamat authority baru, atau None untuk membuat program tidak dapat diubah |
Dalam implementasi helper saat ini, transaksi yang dihasilkan ditandatangani
oleh from_keypair. Berikan otoritas saat ini sebagai from_keypair, atau
pertahankan payer dan otoritas saat ini tetap sama, saat mengubah upgrade
authority.
Alur Kerja Umum
Deploy dengan program ID yang dideklarasikan
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();
Membuat program tidak dapat diubah (immutable)
set_upgrade_authority(&mut svm,&payer,&program.pubkey(),&payer,None,).unwrap();
Pemecahan Masalah
Kesalahan Umum
| Error | Penyebab | Solusi |
|---|---|---|
ProgramAccountNotFound atau kegagalan instruksi terhadap ID yang salah | Deployment menggunakan Keypair acak sementara program mengharapkan ID yang dideklarasikan | Baca target/deploy/<program>-keypair.json dan berikan keypair tersebut ke deploy_upgradeable_program |
InsufficientFunds | Payer tidak memiliki cukup lamport untuk loader buffer dan program account | Airdrop lebih banyak lamport sebelum deployment |
MissingRequiredSignature saat mengubah otoritas | Otoritas saat ini tidak menandatangani transaksi | Berikan otoritas saat ini sebagai from_keypair, atau pertahankan payer dan otoritas saat ini sebagai keypair yang sama |
| Deployment program lebih lambat dari yang diharapkan | Deployment loader menulis byte melalui instruksi loader nyata | Gunakan svm.add_program(...) jika Anda tidak memerlukan status loader atau perilaku upgrade authority |
Is this page helpful?