Solana-dokumentaatioLiteSVMRustOhjelmasi testaaminen

Ohjelmien käyttöönotto

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.

  1. Käännä ja ota käyttöön ohjelma, jota haluat testata

  2. 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 ID
let 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 time
let program_bytes = include_bytes!("../target/deploy/my_program.so");
// Deploy from bytes
svm.add_program(program_id, program_bytes)
.expect("Failed to deploy program");
// Verify deployment
assert!(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 ID
let program_keypair = read_keypair_file("target/deploy/program-keypair.json").unwrap();
let program_id = program_keypair.pubkey();
// Deploy from file
svm.add_program_from_file(program_id, "target/deploy/program.so")
.expect("Failed to deploy program from file");
// Always verify
assert!(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 mainnet
solana program dump gSbePebfvPy7tRqimPoVecS2UsBvYv46ynrzWocc92s pyth.so --url mainnet-beta
# Dump from devnet
solana 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:

  1. Anchor luo target/deploy/program-keypair.json
  2. Natiivi rakentaa luo keypair-tiedoston .so tiedoston rinnalle
  3. Ohjelman ketjussa oleva osoite on tämän keypair-parin julkinen avain, joka tunnetaan myös ohjelmatunnuksena.
  4. PDA:ille, find_program_address() vaatii ohjelmatunnuksen seed-arvona
  5. 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 ID
let 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 checks
let 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ä:

  1. Ohjelmaa ei ole otettu käyttöön
  2. Ohjeessa käytetty väärä ohjelmatunnus
  3. Ohjelmatunnus ei vastaa keypair-paria

Vianmäärityksen vaiheet:

// Step 1: Check if program exists
if 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 keypair
let 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 ID
println!("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 deployed
svm.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 this
svm.add_program(program_id, &program_bytes).unwrap();
// But you can check the rent if needed
let 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?

© 2026 Solana Foundation. Kaikki oikeudet pidätetään.