Vue d'ensemble
Après avoir déployé un programme sur LiteSVM, vous devrez exécuter des instructions pour interagir avec le programme déployé.
LiteSVM fournit une API simple pour créer, envoyer et simuler des transactions entièrement compatible avec le modèle de transaction de Solana.
Flux de transaction de base
Le flux typique pour exécuter une instruction est le suivant :
- Créer une instruction - Définir quel programme appeler et avec quelles données
- Construire un message - Combiner une ou plusieurs instructions
- Créer une transaction - Signer le message avec les signataires requis
- Envoyer ou simuler - Exécuter la transaction et gérer les résultats
Création des instructions
Structure de base d'une instruction
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)};
Construction et envoi des transactions
Méthode 1 : Transaction de base
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);
Ce que fait new_signed_with_payer :
- Construit automatiquement un Message à partir de vos instructions
- Signe automatiquement la transaction avec tous les keypairs fournis
- Retourne une transaction entièrement signée, prête à être envoyée
Méthode 2 : Transaction avec message personnalisé
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);
Utilisez cette méthode lorsque vous avez besoin de contrôler Message, par
exemple pour :
- Les transactions versionnées (v0 avec tables de correspondance)
- Les flux de travail à signature partielle ou multiple
- Les nonces durables
- La simulation ou l'inspection avant signature
- La logique de frais personnalisée
- L'optimisation de la taille des transactions
Transactions versionnées
LiteSVM prend en charge les transactions héritées et versionnées :
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);
Résultats des transactions
Transaction réussie
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);}}
Champs des métadonnées de transaction
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,}
Simulation de transactions
La simulation de transaction vous permet de tester des transactions sans modifier l'état :
// 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);}}
Gestion des erreurs
Erreurs de transaction courantes
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(_) => {}}
Utilisation des journaux de programme
Accès aux journaux
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());
Exemple de sortie de journal
Program 11111111111111111111111111111111 invoke [1]Program log: Processing instructionProgram 11111111111111111111111111111111 consumed 2000 compute unitsProgram 11111111111111111111111111111111 success
Configuration du budget de calcul
Définir le budget de calcul global
use solana_compute_budget::compute_budget::ComputeBudget;let mut svm = LiteSVM::new().with_compute_budget(ComputeBudget {compute_unit_limit: 200_000,..Default::default()});
Budget de calcul par transaction
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,];
Instructions System Program
LiteSVM inclut la prise en charge du 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,);
Résumé
L'exécution des instructions dans LiteSVM suit le modèle de transaction Solana standard :
- Créer des objets
Instructionavec l'identifiant du programme, les comptes et les données - Construire une
Transactionavec l'instruction et les signataires requis - Utiliser
send_transaction()pour exécuter ousimulate_transaction()pour tester - Traiter les résultats en vérifiant le
TransactionMetadataou les détails de l'erreur
LiteSVM offre une exécution instantanée avec des journaux détaillés et des informations de débogage, ce qui en fait un outil idéal pour tester efficacement les programmes Solana.
Is this page helpful?