Tài liệu SolanaLiteSVMRustThùng Hàng Bổ Sunglitesvm-utils

Bắt Đầu Nhanh

Cài Đặt

Hãy đảm bảo bạn đã có đầy đủ các dependency cần thiết:

cargo add --dev litesvm litesvm-utils

litesvm-utils là gì?

Crate litesvm-utils cung cấp các trait trợ giúp và tiện ích thiết yếu giúp đơn giản hóa việc kiểm thử chương trình Solana. Nó giảm thiểu boilerplate kiểm thử phổ biến từ hơn 30 dòng xuống còn mã tối giản, dễ đọc thông qua các API tiện dụng.

Trait TestHelpers

  • Tạo tài khoản được nạp tiền chỉ với một lần gọi phương thức
  • Thiết lập token mint và token account dễ dàng
  • Derive PDA mà không cần boilerplate
  • Quản lý slot cho kiểm thử dựa trên thời gian

Trait AssertionHelpers - Kiểm tra trạng thái tài khoản (tồn tại, đã đóng, chủ sở hữu) - Xác minh số dư token và nguồn cung mint - Kiểm tra số dư SOL - Xác thực độ dài dữ liệu tài khoản

Trait TransactionHelpers - Thực thi các lệnh với xử lý kết quả phong phú - Kiểm tra thành công hoặc thất bại của giao dịch - Kiểm tra mã lỗi cụ thể - Kiểm tra log giao dịch và đơn vị tính toán

LiteSVMBuilder

  • Mẫu builder linh hoạt để thiết lập môi trường kiểm thử
  • Triển khai chương trình bằng method chaining
  • Các phương thức factory tĩnh tiện lợi

Ví Dụ Nhanh

Đây là một ví dụ hoàn chỉnh thể hiện sức mạnh của litesvm-utils:

use litesvm_utils::{AssertionHelpers, LiteSVM, Signer, TestHelpers, TransactionHelpers};
use solana_sdk::{native_token::LAMPORTS_PER_SOL, system_instruction};
#[test]
fn test_with_utils() {
let mut svm = LiteSVM::new();
// Create funded accounts in one line
let alice = svm.create_funded_account(10 * LAMPORTS_PER_SOL).unwrap();
let bob = svm.create_funded_account(0).unwrap();
// Create a token mint easily
let mint = svm.create_token_mint(&alice, 9).unwrap();
// Create associated token accounts (returns Pubkey)
let alice_ata = svm.create_associated_token_account(&mint.pubkey(), &alice).unwrap();
let bob_ata = svm.create_associated_token_account(&mint.pubkey(), &bob).unwrap();
// Mint tokens
svm.mint_to(&mint.pubkey(), &alice_ata, &alice, 1000).unwrap();
// Assert balances
svm.assert_token_balance(&alice_ata, 1000);
svm.assert_token_balance(&bob_ata, 0);
// Execute a SOL transfer with rich result handling
let transfer_ix = system_instruction::transfer(
&alice.pubkey(),
&bob.pubkey(),
LAMPORTS_PER_SOL,
);
let result = svm.send_instruction(transfer_ix, &[&alice]).unwrap();
result.assert_success();
// Verify the transfer
svm.assert_sol_balance(&bob.pubkey(), LAMPORTS_PER_SOL);
}

Lợi Ích Chính

Trước khi dùng litesvm-utils

// Creating a funded account manually
let keypair = Keypair::new();
let airdrop_tx = Transaction::new_signed_with_payer(
&[system_instruction::transfer(
&payer.pubkey(),
&keypair.pubkey(),
lamports,
)],
Some(&payer.pubkey()),
&[&payer],
svm.latest_blockhash(),
);
svm.send_transaction(airdrop_tx).unwrap();

Sau khi dùng litesvm-utils

// One line to create a funded account
let keypair = svm.create_funded_account(lamports).unwrap();

Tổng Quan về Trait

TestHelpers

Phương thứcTrả vềMô tả
create_funded_account(lamports)Result<Keypair>Tạo một keypair và nạp tiền vào
create_funded_accounts(count, lamports)Result<Vec<Keypair>>Tạo nhiều keypair đã được nạp tiền
create_token_mint(authority, decimals)Result<Keypair>Tạo một SPL token mint
create_token_account(mint, owner)Result<Keypair>Tạo một token account thông thường
create_associated_token_account(mint, owner)Result<Pubkey>Tạo một ATA, trả về địa chỉ của nó
mint_to(mint, account, authority, amount)Result<()>Mint token vào một tài khoản
derive_pda(seeds, program_id)(Pubkey, u8)Dẫn xuất một PDA với bump seed
get_pda(seeds, program_id)PubkeyChỉ lấy địa chỉ PDA
get_pda_with_bump(seeds, program_id)(Pubkey, u8)Bí danh cho derive_pda
get_current_slot()u64Trả về slot hiện tại
advance_slot(slots)()Tiến thêm N slot

AssertionHelpers

Phương thứcMô tả
assert_account_exists(pubkey)Báo lỗi nếu tài khoản không tồn tại
assert_account_closed(pubkey)Báo lỗi nếu tài khoản tồn tại và có dữ liệu/lamports
assert_token_balance(account, amount)Xác minh số dư token
assert_sol_balance(pubkey, lamports)Xác minh số dư SOL
assert_mint_supply(mint, supply)Xác minh tổng cung của mint
assert_account_owner(pubkey, owner)Xác minh chủ sở hữu tài khoản
assert_account_data_len(pubkey, len)Xác minh độ dài dữ liệu

TransactionHelpers

Phương thứcTrả vềMô tả
send_instruction(ix, signers)Result<TransactionResult, TransactionError>Gửi một lệnh đơn lẻ
send_instructions(ixs, signers)Result<TransactionResult, TransactionError>Gửi nhiều lệnh trong một giao dịch
send_transaction_result(tx)Result<TransactionResult, TransactionError>Gửi một Transaction thô

Khắc phục sự cố

Các lỗi thường gặp

LỗiNguyên nhânGiải pháp
AccountNotFoundCố sử dụng tài khoản không tồn tạiDùng create_funded_account trước
InsufficientFundsKhông đủ lamports cho giao dịchTăng số tiền nạp ban đầu
OwnerMismatchTài khoản thuộc sở hữu của chương trình saiXác minh đúng program ID
AssertionFailedSố dư hoặc trạng thái không khớp với kỳ vọngKiểm tra logic kiểm thử của bạn

Is this page helpful?

Mục lục

Chỉnh sửa trang