Dokumentasi SolanaLiteSVMRustPeti Tambahanlitesvm-utils

Pembantu Transaksi

Mengirim Transaksi

Trait TransactionHelpers menyediakan metode yang mudah digunakan untuk mengirim instruksi dan menganalisis hasilnya.

Kirim Satu Instruksi

use litesvm_utils::{LiteSVM, Signer, TestHelpers, TransactionHelpers};
use solana_sdk::{native_token::LAMPORTS_PER_SOL, system_instruction};
#[test]
fn test_send_instruction() {
let mut svm = LiteSVM::new();
let alice = svm.create_funded_account(10 * LAMPORTS_PER_SOL).unwrap();
let bob = svm.create_funded_account(0).unwrap();
// Create a transfer instruction
let transfer_ix = system_instruction::transfer(
&alice.pubkey(),
&bob.pubkey(),
LAMPORTS_PER_SOL,
);
// Send and get result (returns Result<TransactionResult, TransactionError>)
let result = svm.send_instruction(transfer_ix, &[&alice]).unwrap();
// Assert it succeeded
result.assert_success();
}

Kirim Beberapa Instruksi

use litesvm_utils::{LiteSVM, Signer, TestHelpers, TransactionHelpers};
use solana_sdk::{native_token::LAMPORTS_PER_SOL, system_instruction};
#[test]
fn test_send_multiple_instructions() {
let mut svm = LiteSVM::new();
let alice = svm.create_funded_account(10 * LAMPORTS_PER_SOL).unwrap();
let bob = svm.create_funded_account(0).unwrap();
let carol = svm.create_funded_account(0).unwrap();
// Create multiple transfer instructions
let instructions = vec![
system_instruction::transfer(&alice.pubkey(), &bob.pubkey(), LAMPORTS_PER_SOL),
system_instruction::transfer(&alice.pubkey(), &carol.pubkey(), LAMPORTS_PER_SOL),
];
// Send all in one transaction
let result = svm.send_instructions(&instructions, &[&alice]).unwrap();
result.assert_success();
}

TransactionResult

Metode send_instruction dan send_instructions mengembalikan TransactionResult yang membungkus metadata transaksi dengan utilitas pengujian yang berguna.

Tegaskan Keberhasilan

use litesvm_utils::{LiteSVM, Signer, TestHelpers, TransactionHelpers};
use solana_sdk::{native_token::LAMPORTS_PER_SOL, system_instruction};
#[test]
fn test_assert_success() {
let mut svm = LiteSVM::new();
let alice = svm.create_funded_account(10 * LAMPORTS_PER_SOL).unwrap();
let bob = svm.create_funded_account(0).unwrap();
let ix = system_instruction::transfer(&alice.pubkey(), &bob.pubkey(), LAMPORTS_PER_SOL);
let result = svm.send_instruction(ix, &[&alice]).unwrap();
// Panics with detailed logs if the transaction failed
result.assert_success();
}

assert_success() akan panik dengan log transaksi lengkap jika transaksi gagal, sehingga memudahkan proses debugging.

Tegaskan Kegagalan

use litesvm_utils::{LiteSVM, Signer, TestHelpers, TransactionHelpers};
use solana_sdk::{native_token::LAMPORTS_PER_SOL, system_instruction};
#[test]
fn test_assert_failure() {
let mut svm = LiteSVM::new();
let alice = svm.create_funded_account(1 * LAMPORTS_PER_SOL).unwrap();
let bob = svm.create_funded_account(0).unwrap();
// Try to transfer more than Alice has
let ix = system_instruction::transfer(
&alice.pubkey(),
&bob.pubkey(),
100 * LAMPORTS_PER_SOL, // Alice only has 1 SOL
);
let result = svm.send_instruction(ix, &[&alice]).unwrap();
// This should fail
result.assert_failure();
}

Tegaskan Kesalahan Spesifik

use litesvm_utils::{LiteSVM, Signer, TestHelpers, TransactionHelpers};
use solana_sdk::{native_token::LAMPORTS_PER_SOL, system_instruction};
#[test]
fn test_assert_error() {
let mut svm = LiteSVM::new();
let alice = svm.create_funded_account(1 * LAMPORTS_PER_SOL).unwrap();
let bob = svm.create_funded_account(0).unwrap();
let ix = system_instruction::transfer(
&alice.pubkey(),
&bob.pubkey(),
100 * LAMPORTS_PER_SOL,
);
let result = svm.send_instruction(ix, &[&alice]).unwrap();
// Assert a specific error message is present
result.assert_error("insufficient lamports");
}

Tegaskan Kode Kesalahan

Untuk kesalahan program kustom, Anda dapat menegaskan pada kode kesalahan:

// Assert a specific custom error code
result.assert_error_code(6000); // Custom error code from your program

Tegaskan Kesalahan Anchor

Untuk program Anchor, tegaskan pada nama kesalahan:

// Assert an Anchor-specific error
result.assert_anchor_error("InsufficientFunds");

Memeriksa Transaksi

Periksa Log Transaksi

use litesvm_utils::{LiteSVM, Signer, TestHelpers, TransactionHelpers};
use solana_sdk::{native_token::LAMPORTS_PER_SOL, system_instruction};
#[test]
fn test_check_logs() {
let mut svm = LiteSVM::new();
let alice = svm.create_funded_account(10 * LAMPORTS_PER_SOL).unwrap();
let bob = svm.create_funded_account(0).unwrap();
let ix = system_instruction::transfer(&alice.pubkey(), &bob.pubkey(), LAMPORTS_PER_SOL);
let result = svm.send_instruction(ix, &[&alice]).unwrap();
// Check if a specific message is in the logs
if result.has_log("Transfer") {
println!("Found transfer log!");
}
// Find a log matching a pattern
if let Some(log) = result.find_log("Program") {
println!("Found log: {}", log);
}
// Get all logs
let logs = result.logs();
for log in logs {
println!("{}", log);
}
}

Cetak Log untuk Debugging

use litesvm_utils::{LiteSVM, Signer, TestHelpers, TransactionHelpers};
use solana_sdk::{native_token::LAMPORTS_PER_SOL, system_instruction};
#[test]
fn test_print_logs() {
let mut svm = LiteSVM::new();
let alice = svm.create_funded_account(10 * LAMPORTS_PER_SOL).unwrap();
let bob = svm.create_funded_account(0).unwrap();
let ix = system_instruction::transfer(&alice.pubkey(), &bob.pubkey(), LAMPORTS_PER_SOL);
let result = svm.send_instruction(ix, &[&alice]).unwrap();
// Print formatted logs for debugging
result.print_logs();
}

Periksa Unit Komputasi

use litesvm_utils::{LiteSVM, Signer, TestHelpers, TransactionHelpers};
use solana_sdk::{native_token::LAMPORTS_PER_SOL, system_instruction};
#[test]
fn test_compute_units() {
let mut svm = LiteSVM::new();
let alice = svm.create_funded_account(10 * LAMPORTS_PER_SOL).unwrap();
let bob = svm.create_funded_account(0).unwrap();
let ix = system_instruction::transfer(&alice.pubkey(), &bob.pubkey(), LAMPORTS_PER_SOL);
let result = svm.send_instruction(ix, &[&alice]).unwrap();
let compute_units = result.compute_units();
println!("Compute units consumed: {}", compute_units);
// Assert compute usage is within expected bounds
assert!(compute_units < 10_000, "Transaction used too many compute units");
}

Memantau unit komputasi berguna untuk optimasi. Solana membatasi transaksi hingga 1,4 juta unit komputasi, dan penggunaan yang lebih tinggi membutuhkan biaya lebih besar.

Contoh Lengkap

Berikut adalah contoh komprehensif yang mendemonstrasikan helper transaksi:

use litesvm_utils::{AssertionHelpers, LiteSVM, Signer, TestHelpers, TransactionHelpers};
use solana_sdk::{native_token::LAMPORTS_PER_SOL, system_instruction};
#[test]
fn test_transaction_workflow() {
let mut svm = LiteSVM::new();
// Setup accounts
let alice = svm.create_funded_account(10 * LAMPORTS_PER_SOL).unwrap();
let bob = svm.create_funded_account(0).unwrap();
// Test successful transfer
let transfer_ix = system_instruction::transfer(
&alice.pubkey(),
&bob.pubkey(),
2 * LAMPORTS_PER_SOL,
);
let result = svm.send_instruction(transfer_ix, &[&alice]).unwrap();
// Verify success
result.assert_success();
// Check compute usage
let cu = result.compute_units();
println!("Transfer used {} compute units", cu);
// Verify balances
svm.assert_sol_balance(&bob.pubkey(), 2 * LAMPORTS_PER_SOL);
// Test expected failure
let bad_transfer = system_instruction::transfer(
&alice.pubkey(),
&bob.pubkey(),
100 * LAMPORTS_PER_SOL, // More than Alice has
);
let fail_result = svm.send_instruction(bad_transfer, &[&alice]).unwrap();
fail_result.assert_failure();
// Print logs for debugging
fail_result.print_logs();
println!("Transaction workflow test passed!");
}

Jenis Error

Enum TransactionError menyediakan informasi error yang terstruktur:

VariantDeskripsi
ExecutionFailed(String)Eksekusi transaksi gagal dengan pesan
BuildError(String)Gagal membangun transaksi
AssertionFailed(String)Pernyataan pada hasil gagal

Is this page helpful?

© 2026 Yayasan Solana. Semua hak dilindungi.