Asennus
Varmista, että sinulla on kaikki tarvittavat riippuvuudet:
cargo add --dev litesvm litesvm-loader solana-keypair solana-signer
Jos testisi kutsuu käyttöönotettua ohjelmaa suoraan, lisää myös testissäsi käytetyt Solana-käsky- ja transaktiopaketit:
cargo add --dev solana-instruction solana-message solana-transaction
Mikä on litesvm-loader?
litesvm-loader-paketti tarjoaa apuvälineitä ohjelmien käyttöönottoon
BPF-päivitettävän lataajan kautta LiteSVM:ssä. Käytä sitä, kun testisi tarvitsee
lataajan omistamia program accounts -tilejä, program data accounts -tilejä tai
päivitysvaltuuden hallintaa sen sijaan, että lisäisit ohjelman suoraan
svm.add_program(...)-komennolla.
Päivitettävä käyttöönotto
- Luo lataajan puskuritilin
- Kirjoittaa ohjelmatavut osissa
- Ottaa lopullisen program account -tilin käyttöön BPF-päivitettävällä lataajalla
- Käyttää annettua program keypair -avariparia ohjelmatunnuksena
Päivitysvaltuuden hallinta - Muuttaa jo käyttöönotetun ohjelman
päivitysvaltuuden - Tukee uuden valtuuden määrittämistä - Tukee None-arvon
välittämistä ohjelman tekemiseksi muuttumattomaksi
Todellinen lataajan tila - Käyttää samaa lataajan tilirakennetta, jonka ohjelma näkee ketjussa - Mahdollistaa program account- ja program data account -tilien tarkastelun testeissä - Auttaa havaitsemaan virheet, jotka peittyisivät suorassa ohjelman lisäämisessä
Useimmissa testeissä svm.add_program(program_id, program_bytes) on edelleen
nopein ja yksinkertaisin tapa ladata ohjelma. Käytä litesvm-loader kun
loader-tilin rakenne tai päivitysvaltuus on osa testattavaa toiminnallisuutta.
Nopea esimerkki
Tässä on täydellinen esimerkki, joka ottaa käyttöön ohjelman päivitettävän loaderin kautta ja vaihtaa sen valtuuden:
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();}
Ohjelman keypair-valinnan tekeminen
deploy_upgradeable_program käyttää program_kp-argumenttia ohjelman
osoitteena. Jos ohjelmasi ilmoittaa kiinteän tunnuksen, lataa generoitu
käyttöönotto-keypair satunnaisen keypair-luomisen sijaan:
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();
Käyttöönotetun ohjelman kutsuminen
Käyttöönoton jälkeen kutsu ohjelmaa samalla tavalla kuin mitä tahansa
LiteSVM:llä ladattua ohjelmaa. Luo instruktio ohjelmaasi varten, allekirjoita
transaktio ja lähetä se saman LiteSVM-instanssin kautta:
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();
Keskeiset komponentit
deploy_upgradeable_program
| Argumentti | Kuvaus |
|---|---|
svm | Muuttuva LiteSVM-instanssi, joka vastaanottaa käyttöönotetun ohjelman |
payer_kp | Maksunmaksaja ja alkuperäinen päivitysvaltuus |
program_kp | keypair, jonka julkinen avain toimii ohjelmatunnuksena |
program_bytes | Käännetyt SBF-ohjelmatavut, yleensä haettu target/deploy/*.so:stä |
deploy_upgradeable_program luo loader-puskurin, kirjoittaa ohjelmatavut 512
tavun lohkoissa ja ottaa ohjelman käyttöön siten, että tulevat päivitykset ovat
mahdollisia.
set_upgrade_authority
| Argumentti | Kuvaus |
|---|---|
svm | Muuttuva LiteSVM-instanssi, joka sisältää käyttöönotetun ohjelman |
from_keypair | Maksunmaksaja ja transaktion allekirjoitusvaltuus |
program_address | Sen ohjelman tunnus, jonka valtuuden tulisi muuttua |
current_authority_keypair | Nykyinen päivitysvaltuuden keypair |
new_authority_address | Uusi valtuusosoite tai None, jotta ohjelma muuttuu muuttumattomaksi |
Nykyisessä apumetodien toteutuksessa luotu transaktio allekirjoitetaan
from_keypair:llä. Välitä nykyinen auktoriteetti muodossa from_keypair, tai
pidä maksaja ja nykyinen auktoriteetti samana, kun vaihdat
päivitysauktoriteettia.
Yleiset työnkulut
Ota käyttöön määritetyllä ohjelmatunnuksella
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();
Tee ohjelmasta muuttumaton
set_upgrade_authority(&mut svm,&payer,&program.pubkey(),&payer,None,).unwrap();
Vianmääritys
Yleiset virheet
| Virhe | Syy | Ratkaisu |
|---|---|---|
ProgramAccountNotFound tai ohjetoimintojen epäonnistumiset väärää tunnusta vastaan | Käyttöönotossa käytettiin satunnaista Keypair:ää, vaikka ohjelma odottaa määritettyä tunnusta | Lue target/deploy/<program>-keypair.json ja välitä kyseinen keypair deploy_upgradeable_program:lle |
InsufficientFunds | Maksajalla ei ole tarpeeksi lamporteja loader-puskurin ja program account -tilien käyttöön | Airdrop lisää lamporteja ennen käyttöönottoa |
MissingRequiredSignature auktoriteettia vaihdettaessa | Nykyinen auktoriteetti ei allekirjoittanut transaktiota | Välitä nykyinen auktoriteetti muodossa from_keypair, tai pidä maksaja ja nykyinen auktoriteetti samana keypair-avaimena |
| Ohjelman käyttöönotto on odotettua hitaampaa | Loader-käyttöönotto kirjoittaa tavuja todellisten loader-ohjeiden kautta | Käytä svm.add_program(...), kun et tarvitse loader-tilaa tai päivitysauktoriteettikäyttäytymistä |
Is this page helpful?