Documentation SolanaLiteSVMRustTester votre programme

Exécution des instructions

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 :

  1. Créer une instruction - Définir quel programme appeler et avec quelles données
  2. Construire un message - Combiner une ou plusieurs instructions
  3. Créer une transaction - Signer le message avec les signataires requis
  4. 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 call
accounts: vec![ // Accounts the program needs
AccountMeta::new(account_pubkey, false), // Writable, not signer
AccountMeta::new_readonly(readonly_pubkey, false), // Read-only, not signer
AccountMeta::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 fees
svm.airdrop(&payer.pubkey(), 1_000_000_000).unwrap();
// Create instruction
let instruction = /* your instruction */;
// Build message with payer
let message = Message::new(&[instruction], Some(&payer.pubkey()));
// Create and sign transaction
let tx = Transaction::new_signed_with_payer(
&[instruction], // Your instructions
Some(&payer.pubkey()), // Who pays transaction fees
&[&payer], // All required signers
svm.latest_blockhash(), // Recent blockhash
);
// Send transaction
let 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 message
let message = Message::new(&[instruction], Some(&payer.pubkey()));
// Create transaction with signers, message, and blockhash
let 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 transaction
let 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 failure
println!("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 sending
match 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 instruction
Program 11111111111111111111111111111111 consumed 2000 compute units
Program 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 transaction
ComputeBudgetInstruction::set_compute_unit_limit(400_000),
ComputeBudgetInstruction::set_compute_unit_price(1),
// Your actual instruction
your_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 SOL
let transfer_ix = system_instruction::transfer(
&alice.pubkey(),
&bob.pubkey(),
1_000_000_000, // 1 SOL
);
// Create new account
let 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 :

  1. Créer des objets Instruction avec l'identifiant du programme, les comptes et les données
  2. Construire une Transaction avec l'instruction et les signataires requis
  3. Utiliser send_transaction() pour exécuter ou simulate_transaction() pour tester
  4. Traiter les résultats en vérifiant le TransactionMetadata ou 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?

© 2026 Fondation Solana. Tous droits réservés.