Overzicht
Na het implementeren van een programma in LiteSVM moet je instructies uitvoeren om te communiceren met het geïmplementeerde programma.
LiteSVM biedt een eenvoudige API voor het aanmaken, verzenden en simuleren van transacties die volledig compatibel is met het transactiemodel van Solana.
Basisstroom van Transacties
De typische stroom voor het uitvoeren van een instructie is:
- Maak een Instructie - Definieer welk programma je wilt aanroepen en met welke gegevens
- Bouw een Bericht - Combineer een of meer instructies
- Maak een Transactie - Onderteken het bericht met de vereiste ondertekenaars
- Verzenden of Simuleren - Voer de transactie uit en verwerk de resultaten
Instructies Aanmaken
Basisstructuur van een Instructie
use solana_instruction::{Instruction, AccountMeta};use solana_pubkey::Pubkey;let instruction = Instruction {program_id: Pubkey::new_unique(), // The program to callaccounts: vec![ // Accounts the program needsAccountMeta::new(account_pubkey, false), // Writable, not signerAccountMeta::new_readonly(readonly_pubkey, false), // Read-only, not signerAccountMeta::new(signer_pubkey, true), // Writable, signer],data: vec![0, 1, 2, 3], // Instruction data (program-specific)};
Transacties Bouwen en Verzenden
Methode 1: Basistransactie
use litesvm::LiteSVM;use solana_keypair::Keypair;use solana_message::Message;use solana_transaction::Transaction;use solana_signer::Signer;let mut svm = LiteSVM::new();let payer = Keypair::new();// Airdrop SOL for feessvm.airdrop(&payer.pubkey(), 1_000_000_000).unwrap();// Create instructionlet instruction = /* your instruction */;// Build message with payerlet message = Message::new(&[instruction], Some(&payer.pubkey()));// Create and sign transactionlet tx = Transaction::new_signed_with_payer(&[instruction], // Your instructionsSome(&payer.pubkey()), // Who pays transaction fees&[&payer], // All required signerssvm.latest_blockhash(), // Recent blockhash);// Send transactionlet result = svm.send_transaction(tx);
Wat new_signed_with_payer doet:
- Bouwt automatisch een Bericht op basis van je instructies
- Ondertekent de transactie automatisch met alle opgegeven keypairs
- Geeft een volledig ondertekende, verzendklare transactie terug
Methode 2: Aangepaste Berichttransactie
let payer = Keypair::new();// Manually construct messagelet message = Message::new(&[instruction], Some(&payer.pubkey()));// Create transaction with signers, message, and blockhashlet tx = Transaction::new(&[&payer],message,svm.latest_blockhash(),);let result = svm.send_transaction(tx);
Gebruik deze methode wanneer je controle nodig hebt over de Message zoals:
- Versietransacties (v0 met opzoektabellen)
- Gedeeltelijke/multi-sig workflows
- Duurzame nonces
- Simulatie of inspectie vóór ondertekening
- Aangepaste logica voor betalende partij
- Optimalisatie van transactiegrootte
Versietransacties
LiteSVM ondersteunt zowel verouderde als versietransacties:
use solana_transaction::versioned::VersionedTransaction;use solana_message::VersionedMessage;// Legacy transaction (most common)let legacy_msg = Message::new(&[instruction], Some(&payer.pubkey()));let versioned_tx = VersionedTransaction::try_new(VersionedMessage::Legacy(legacy_msg),&[&payer]).unwrap();// Send versioned transactionlet result = svm.send_transaction(versioned_tx);
Transactieresultaten
Geslaagde Transactie
match svm.send_transaction(tx) {Ok(meta) => {println!("Signature: {}", meta.signature);println!("Compute units: {}", meta.compute_units_consumed);println!("Logs:");for log in &meta.logs {println!(" {}", log);}}Err(err) => {println!("Transaction failed: {:?}", err.err);// Logs are still available on failureprintln!("Failure logs: {:?}", err.meta.logs);}}
Metadatavelden van Transacties
pub struct TransactionMetadata {pub signature: Signature,pub logs: Vec<String>,pub inner_instructions: InnerInstructionsList,pub compute_units_consumed: u64,pub return_data: TransactionReturnData,pub fee: u64,}
Transacties simuleren
Transactie simuleren laat je transacties testen zonder de status te wijzigen:
// Simulate instead of sendingmatch svm.simulate_transaction(tx) {Ok(sim_result) => {println!("Simulation successful!");println!("Logs: {:?}", sim_result.meta.logs);println!("Compute units: {}", sim_result.meta.compute_units_consumed);}Err(err) => {println!("Simulation failed: {:?}", err.err);}}
Foutafhandeling
Veelvoorkomende transactiefouten
use solana_transaction_error::TransactionError;use solana_instruction::error::InstructionError;match svm.send_transaction(tx) {Err(failed_tx) => {match failed_tx.err {TransactionError::InsufficientFundsForFee => {println!("Not enough SOL for fees");}TransactionError::InvalidProgramForExecution => {println!("Program doesn't exist or isn't executable");}TransactionError::InstructionError(index, err) => {println!("Instruction {} failed: {:?}", index, err);match err {InstructionError::Custom(code) => {println!("Custom error code: {}", code);}InstructionError::AccountNotFound => {println!("An account doesn't exist");}_ => {}}}TransactionError::BlockhashNotFound => {println!("Blockhash expired or invalid");}_ => println!("Other error: {:?}", failed_tx.err),}}Ok(_) => {}}
Werken met programmalogboeken
Logboeken raadplegen
let result = svm.send_transaction(tx).unwrap();// All logs (including system logs)for log in &result.logs {println!("{}", log);}// Pretty-printed logs (formatted)println!("{}", result.pretty_logs());
Voorbeeld van logboekuitvoer
Program 11111111111111111111111111111111 invoke [1]Program log: Processing instructionProgram 11111111111111111111111111111111 consumed 2000 compute unitsProgram 11111111111111111111111111111111 success
Rekenkrachtbudget configureren
Globaal rekenkrachtbudget instellen
use solana_compute_budget::compute_budget::ComputeBudget;let mut svm = LiteSVM::new().with_compute_budget(ComputeBudget {compute_unit_limit: 200_000,..Default::default()});
Rekenkrachtbudget per transactie
use solana_compute_budget_interface::ComputeBudgetInstruction;let instructions = vec![// Set compute budget for this transactionComputeBudgetInstruction::set_compute_unit_limit(400_000),ComputeBudgetInstruction::set_compute_unit_price(1),// Your actual instructionyour_instruction,];
System Program-instructies
LiteSVM biedt ondersteuning voor het System Program:
use solana_keypair::Keypair;use solana_signer::Signer;use solana_system_interface::instruction as system_instruction;use solana_transaction::Transaction;// Transfer SOLlet transfer_ix = system_instruction::transfer(&alice.pubkey(),&bob.pubkey(),1_000_000_000, // 1 SOL);// Create new accountlet create_ix = system_instruction::create_account(&payer_pubkey,&new_account_pubkey,lamports,space as u64,&owner_program_id,);
Samenvatting
Het uitvoeren van instructies in LiteSVM volgt het standaard Solana-transactiemodel:
- Maak
Instruction-objecten aan met programma-ID, accounts en gegevens - Bouw een
Transactionmet de instructie en vereiste ondertekenaars - Gebruik
send_transaction()om uit te voeren ofsimulate_transaction()om te testen - Verwerk resultaten door de
TransactionMetadataof foutdetails te controleren
LiteSVM biedt directe uitvoering met gedetailleerde logboeken en foutopsporingsinformatie, waardoor het ideaal is voor het efficiënt testen van Solana-programma's.
Is this page helpful?