Mollusk
Mollusk SVM é um harness Rust leve para executar instruções únicas contra programas BPF compilados. Use quando quiser testes em nível de instrução sem a API completa de transação do LiteSVM ou um validador em execução.
Receita
Cartão de receita de referência rápida - pronto para copiar e colar.
use mollusk_svm::Mollusk;
use solana_sdk::instruction::{AccountMeta, Instruction};
let mollusk = Mollusk::new(&program_id, "target/deploy/my_program.so");
let result = mollusk.process_instruction(&ix, &account_store);
assert!(result.program_result.is_ok());Quando usar:
- Desenvolvimento de programa Rust nativo sem Anchor TS.
- Benchmark de uso de CU de instrução em testes.
- Validar ordenação de contas independente do SDK cliente.
- Regressão rápida em parsing de dados de instrução.
Exemplo prático
use mollusk_svm::{Mollusk, result::Check};
use solana_sdk::{
account::Account,
instruction::{AccountMeta, Instruction},
pubkey::Pubkey,
};
#[test]
fn process_deposit() {
let program_id = Pubkey::new_unique();
let mollusk = Mollusk::new(&program_id, "target/deploy/my_program.so");
let user = Pubkey::new_unique();
let vault = Pubkey::new_unique();
let accounts = vec![
(user, Account::default()),
(vault, Account::default()),
];
let ix = Instruction {
program_id,
accounts: vec![
AccountMeta::new(user, true),
AccountMeta::new(vault, false),
],
data: vec![0], // deposit discriminator
};
mollusk.process_and_validate_instruction(
&ix,
&accounts,
&[Check::success()],
);
}O que isso demonstra:
process_and_validate_instructionexecuta ix e asserta checks de sucesso.- Account store é lista explícita de tuplas pubkey + estado Account.
- Caminho do programa aponta para artefato
target/deploydecargo build-sbf.
Mergulho profundo
Como funciona
- Mollusk carrega ELF e invoca entrypoint com contas fornecidas.
- Retorna resultado de execução detalhado incluindo consumo de CU.
- Enum
Checkvalida sucesso, códigos de erro e padrões de log. - Compõe com tipos Solana SDK - sem camada RPC.
Mollusk vs LiteSVM
| Aspecto | Mollusk | LiteSVM 0.6.x |
|---|---|---|
| Nível API | Instrução | Transação |
| Métricas CU | Checks built-in | Disponível em erros |
| Suporte CPI | Sim | Sim |
| Controle de clock | Contas manuais | Helpers sysvar |
Notas Rust
use mollusk_svm::result::Check;
mollusk.process_and_validate_instruction(
&ix,
&accounts,
&[
Check::success(),
Check::compute_units(45_000..=60_000),
],
);Erros comuns
- Dados de conta vazios - Contas padrão sem discriminator. Correção: Serialize dados de conta Anchor em
Account::data. - Caminho de programa errado - Mismatch .so debug vs release. Correção: Perfil
cargo build-sbfconsistente no CI. - Apenas flags signer -
is_signerno meta sem verificação de assinatura no contexto mollusk. Correção: Combine com testes tx LiteSVM para caminhos de assinatura. - Owner ausente - Owner de conta deve corresponder ao programa esperado para deserialização. Correção: Defina
account.owner = program_id. - CPI Token - Precisa token program carregado na config mollusk. Correção: Adicione bytes SPL program conforme docs mollusk.
- Check CU muito rígido - Upgrades mudam CU. Correção: Use ranges, não valores exatos.
Alternativas
| Alternativa | Use quando | Não use quando |
|---|---|---|
| LiteSVM | Fluxos de transação completos | Só precisa nível ix |
| anchor test | Clientes IDL Anchor | Devs só Rust |
| Trident fuzz | Inputs aleatórios | Regressão determinística |
FAQs
Preciso de validador para Mollusk?
Não - execução puramente in-process.
Mollusk suporta programas Anchor?
Sim - carregue .so Anchor e passe bytes discriminator nos dados de instrução.
Como assertar erros customizados?
Use Check::err(solana_sdk::program_error::ProgramError::Custom(code)).
Posso medir CU?
Sim - Check::compute_units com limites inclusivos.
Como testar cadeias CPI?
Inclua contas de programa callee e carregue ELFs de programa dependente no mollusk.
Mollusk vs crate program-test?
Mollusk é mantido para testes focados em instrução; prefira para novos projetos só Rust.
Setup CI?
cargo test após anchor build ou cargo build-sbf - camada rápida no pipeline.
Rent de conta?
Defina lamports suficientes nas contas para mínimos rent-exempt.
Blockhash necessário?
Não para process_instruction - preocupações de nível transação usam LiteSVM.
Compatibilidade Agave 4.1.1?
Mantenha crate mollusk-svm atualizado junto com pins toolchain Solana SDK 2.x / Agave.
Relacionados
- LiteSVM - testes em nível de transação
- Testando CPIs e PDAs - grafos de conta
- Tamanho de programa e disciplina CU - orçamentos CU
- Noções básicas de testes - posição na pirâmide
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.