LiteSVM
LiteSVM 0.6.x executa uma VM Solana in-process para testes de programa em sub-segundo sem solana-test-validator. Use para testes unitários, casos negativos de segurança e loops de feedback Rust apertados.
Busque em todas as páginas da documentação
LiteSVM 0.6.x executa uma VM Solana in-process para testes de programa em sub-segundo sem solana-test-validator. Use para testes unitários, casos negativos de segurança e loops de feedback Rust apertados.
Cartão de receita de referência rápida - pronto para copiar e colar.
use litesvm::LiteSVM;
use solana_sdk::{
instruction::{AccountMeta, Instruction},
pubkey::Pubkey,
signature::Keypair,
signer::Signer,
transaction::Transaction,
};
let mut svm = LiteSVM::new();
let payer = Keypair::new();
svm.airdrop(&payer.pubkey(), 10_000_000_000).unwrap();
svm.add_program(program_id, include_bytes!("../target/deploy/my_program.so"));Quando usar:
#[test] Rust puro.anchor test mais lento.use litesvm::LiteSVM;
use solana_sdk::{
instruction::{AccountMeta, Instruction},
pubkey::Pubkey,
signature::Keypair,
signer::Signer,
system_program,
transaction::Transaction,
};
#[test]
fn withdraw_requires_signer() {
let program_id = Pubkey::new_unique();
let mut svm = LiteSVM::new();
svm.add_program(program_id, include_bytes!("../target/deploy/my_program.so"));
let payer = Keypair::new();
svm.airdrop(&payer.pubkey(), 2_000_000_000).unwrap();
let vault = Pubkey::new_unique();
let ix = Instruction {
program_id,
accounts: vec![
AccountMeta::new(vault, false),
AccountMeta::new_readonly(payer.pubkey(), false), // missing signer
],
data: vec![1, 0, 0, 0], // withdraw discriminator stub
};
let tx = Transaction::new_signed_with_payer(
&[ix],
Some(&payer.pubkey()),
&[&payer],
svm.latest_blockhash(),
);
let result = svm.send_transaction(tx);
assert!(result.is_err());
}O que isso demonstra:
.so compilado diretamente no LiteSVM.| Ferramenta | Velocidade | Fidelidade | Linguagem |
|---|---|---|---|
| LiteSVM 0.6.x | Mais rápido | Alta para lógica ix | Rust |
| Mollusk | Rápido | Focado em instrução | Rust |
| Bankrun | Rápido | Ergonomia TS | TypeScript |
| test-validator | Lento | RPC completo | Qualquer |
// Avance clock para testes de obsolescência
svm.set_sysvar(&solana_sdk::clock::Clock {
unix_timestamp: 1_700_000_000,
..Default::default()
});anchor build no CI antes de cargo test.svm.add_program para dependências.svm.expire_blockhash() ou refresh. Correção: Busque latest_blockhash() por tx.Cargo.toml que build de release.| Alternativa | Use quando | Não use quando |
|---|---|---|
| Mollusk | Apenas Rust em nível de instrução | Quer ergonomia completa de simulação de tx |
| Bankrun | Equipe TypeScript | Fluxo Rust puro |
| anchor test | Integração completa | Velocidade inner-loop |
Fixe LiteSVM 0.6.x no manifest; verifique release notes para compatibilidade de syscall.
Sim - carregue programas callee (Token, seu vault) e forneça grafo de contas correto.
svm.airdrop para SOL; defina dados de conta token manualmente para saldos SPL.
Use .so bruto + dados de instrução, ou helpers da comunidade para construir discriminators Anchor.
cargo test após anchor build - sem serviço validador exigido para camada LiteSVM.
Inclua conta PDA correta com is_signer: false; programa invoca CPI assinado internamente.
Txs falhas retornam logs no erro - asserte substrings de log para debug msg! customizado.
Cada teste deve possuir LiteSVM::new() - evite svm mutável compartilhado entre threads.
Use mesmos program IDs do cluster alvo ao testar allowlists CPI.
Ao depender de métodos RPC, ALTs ou comportamento de landing multi-tx.
Versões da stack: Esta página foi escrita para Agave 4.1.1, Solana CLI 3.0.10, Anchor 0.32.1, anchor-lang 0.32.1, Rust 1.91.1, @solana/kit 7.0.0, Surfpool 0.12.0 e LiteSVM 0.6.x.
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026