Passando Contas para CPIs
Listas de contas de CPI devem espelhar a ordem esperada pelo chamador, flags de signatário e capacidade de escrita. Seu programa é responsável por não elevar privilégios além do que a transação externa pretendia.
Busque em todas as páginas da documentação
Listas de contas de CPI devem espelhar a ordem esperada pelo chamador, flags de signatário e capacidade de escrita. Seu programa é responsável por não elevar privilégios além do que a transação externa pretendia.
let metas = vec![
AccountMeta::new(source, false),
AccountMeta::new(dest, false),
AccountMeta::new_readonly(authority, true),
];Quando usar isto:
// Valida se a origem é gravável apenas se o chamador pretendia mutação
if !source.is_writable { return Err(ProgramError::InvalidAccountData); }
let ix = spl_token::instruction::transfer(...)?;
invoke(&ix, &[source.clone(), dest.clone(), authority.clone(), token_program.clone()])?;O que isto demonstra:
metas.Passar writable + signer para o chamado quando a transação externa não autorizou é um bug crítico.
Siga as definições de origem do chamado (spl-token, system).
// AccountMeta::new_readonly(key, is_signer)| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| Construtores de instrução SPL | Metas corretas | Programas personalizados |
| Módulo cpi do Anchor | Gerado | Manual |
| Clientes Codama | Apenas off-chain | On-chain ainda manual |
O programa chamado revalida.
Signatários da transação externa + apenas invoke_signed.
O chamado gera um erro.
Resolvidos antes do tempo de execução.
Use o padrão de contas restantes no Anchor.
Considerações sobre reentrância.
Geralmente conta de programa somente leitura.
Se o chamado exigir.
Contas de signatário extras.
Mostra o ID do programa chamado.
Barato.
Testes negativos do LiteSVM.
Versões do 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: 19 de jul. de 2026