Aloittaminen
let mut svm = LiteSVM::new();
Tämä luo perustason litesvm-testiympäristön, johon sisältyvät kaikki käytössä olevat ajonaikaiset ominaisuudet, oletussysvars, esikääntäjät, spl-ohjelmat, allekirjoitusten vahvistus sekä kaikki sisäänrakennetut ohjelmat, kuten System Program.
Jotta voit käyttää muita ohjelmia testeissäsi, sinun täytyy ottaa kyseiset ohjelmat käyttöön testiympäristössäsi.
-
Käännä ja ota käyttöön ohjelma, jota haluat testata
-
Etsi kaikki ohjelmat, joihin yllä mainittu ohjelma tekee CPI-kutsuja, ja ota ne käyttöön
Esimerkki: Jos ohjelmasi käyttää Pythin datasyötteitä, sinun täytyy ottaa Pyth-ohjelma käyttöön testiympäristössäsi.
Ohjelman peruskäyttöönotto
Menetelmä 1: Käyttöönotto tavuista
Ota ohjelmat käyttöön suoraan tavutaulukoista nopeinta testien suoritusta varten:
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! upottaa binäärin suoraan testiajettavaan tiedostoon
käännösaikana, mikä poistaa I/O-operaatiot testien suorituksen aikana.
✓ Edut
- •Nopeampi suoritusaikana (ei levylukuja)
- •Itsenäinen testibinääri
- •Toimii, vaikka .so-tiedosto poistetaan käännöksen jälkeen
✗ Haitat
- •Suurempi testibinäärin koko
- •Testit täytyy kääntää uudelleen, kun .so muuttuu
Menetelmä 2: Ota käyttöön tiedostosta (.so)
Lataa ohjelmat tiedostojärjestelmästä, kun ne muuttuvat usein:
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);
✓ Edut
- •Pienempi testibinääri
- •Voi havaita .so-muutokset ilman testien uudelleenkääntämistä
- •Joustavampi CI/CD-putkille
✗ Haitat
- •Hitaampi (levyn I/O suoritusaikana)
- •Vaatii .so-tiedoston olemassaolon testin suoritushetkellä
- •Tiedostopolun on oltava oikea suhteessa testin suoritushakemistoon
Ohjelmien hakeminen Mainnetistä/Devnetistä
Kun tarvitset ohjelman, jonka lähdekoodia sinulla ei ole, käytä Solana CLI:tä kopioidaksesi ohjelmia live-klustereista ja käyttääksesi niitä testeissä:
# Dump a program from mainnetsolana program dump gSbePebfvPy7tRqimPoVecS2UsBvYv46ynrzWocc92s pyth.so --url mainnet-beta# Dump from devnetsolana program dump YourProgramID program.so --url devnet
Lataa se sitten testeissäsi:
svm.add_program_from_file(pubkey!("gSbePebfvPy7tRqimPoVecS2UsBvYv46ynrzWocc92s"),"pyth.so").unwrap();
Parhaat käytännöt
1. Valitse oikea käyttöönottomenetelmä
-
Käytä
add_program()kun:- Ohjelmat on upotettu testibinääriisi käännösaikana
- Haluat nopeamman testisuorituksen (ei I/O:ta suoritusaikana)
- Itsenäiset testit
-
Käytä
add_program_from_file()kun:- Ohjelmat rakennetaan erikseen (eli haetaan devnetistä)
- Ohjelma muuttuu usein kehityksen aikana (testit voidaan ajaa uudelleen ilman uudelleenkääntämistä)
- Sinulla on CI/CD-ympäristöjä, joissa .so-tiedostot ovat artefakteja
Program keypair -parien ymmärtäminen
Kun rakennat Solana-ohjelman:
- Anchor luo
target/deploy/program-keypair.json - Natiivi rakentaa luo keypair-tiedoston
.sotiedoston rinnalle - Ohjelman ketjussa oleva osoite on tämän keypair-parin julkinen avain, joka tunnetaan myös ohjelmatunnuksena.
- PDA:ille,
find_program_address()vaatii ohjelmatunnuksen seed-arvona - CPI:ille, ohjelmatunnusta käytetään muiden ohjelmien kutsumiseen
Yleiset ongelmat ja ratkaisut
Äänettömät käyttöönottovirheet
Ongelma: Ohjelma näyttää käyttöönotetulta, mutta tapahtumat epäonnistuvat virheellä "InvalidProgramForExecution".
Syy: Ohjelmatunnus ei vastaa keypair-paria.
Ratkaisu:
// 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);
Ohjelma ei löydy -virhe
Virhe: TransactionError::InvalidProgramForExecution
Yleisiä syitä:
- Ohjelmaa ei ole otettu käyttöön
- Ohjeessa käytetty väärä ohjelmatunnus
- Ohjelmatunnus ei vastaa keypair-paria
Vianmäärityksen vaiheet:
// 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");
CPI käyttöönottamattomiin ohjelmiin
Ongelma: Ohjelmasi tekee CPI-kutsun ohjelmaan, jota ei ole otettu käyttöön.
Ratkaisu: Ota käyttöön kaikki riippuvuusohjelmat:
// Find all dependency programs and make sure they are deployedsvm.add_program_from_file(pubkey!("gSbePebfvPy7tRqimPoVecS2UsBvYv46ynrzWocc92s"),"pyth.so").unwrap();
Jos sinun täytyy hakea ohjelma klusterista, katso tämä osio.
Riittämättömät lamport-yksiköt käyttöönottoon
Huomio: LiteSVM käsittelee automaattisesti ohjelmien vuokravapaan saldon.
// 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);
Käyttöönoton tarkistuslista
Lue ohjelman keypair
let keypair = read_keypair_file("target/deploy/program-keypair.json").unwrap();let program_id = keypair.pubkey();
Ota käyttöön vastaavalla tunnuksella
svm.add_program(program_id, &program_bytes).unwrap();
Tarkista käyttöönotto
assert!(svm.get_account(&program_id).unwrap().executable);
Ota käyttöön kaikki ohjelmat, joita ohjelmasi kutsuu CPI:n kautta litesvm-testiinstanssiin
Seuraavat vaiheet
Seuraavassa osiossa opimme, miten ohjelman ohjeita suoritetaan ja miten käsitellään monimutkaisempia transaktiokaavoja.
Is this page helpful?