A Estrutura de Contas
Toda instrução declara uma estrutura de contas com #[derive(Accounts)]. O Anchor executa as restrições antes que seu manipulador seja executado, aplicando propriedade, mutabilidade e relacionamentos de forma falha e fechada.
Receita
#[derive(Accounts)]
pub struct Transfer<'info> {
#[account(mut)]
pub from: Signer<'info>,
#[account(mut, constraint = to.owner == from.key())]
pub to: Account<'info, TokenAccount>,
pub token_program: Program<'info, Token>,
}Quando usar isso: Você projeta qualquer instrução que toque em contas on-chain.
Exemplo de Trabalho
#[derive(Accounts)]
pub struct UpdateMetadata<'info> {
#[account(
mut,
seeds = [b"meta", authority.key().as_ref()],
bump = metadata.bump,
has_one = authority,
)]
pub metadata: Account<'info, Metadata>,
pub authority: Signer<'info>,
}
#[account]
pub struct Metadata {
pub authority: Pubkey,
pub bump: u8,
pub uri: String,
}O que isso demonstra:
- Tipos de campo (
Signer,Account<T>,Program<T>) implicam verificações básicas - Restrições de atributo adicionam seeds, init, has_one e expressões personalizadas
- O mapa
bumpsestá disponível nos manipuladores para bumps canônicos armazenados - A ordem de validação é importante para segurança de init e CPI
Mergulho Profundo
Tipos Comuns de Conta
| Tipo | Valida |
|---|---|
Signer<'info> | Conta assinou a transação |
Account<'info, T> | O proprietário é o programa, desserializa como T |
Program<'info, T> | O endereço corresponde ao ID do programa para T |
SystemAccount<'info> | Pertence ao programa do sistema |
UncheckedAccount<'info> | Nenhuma verificação automática (use com cuidado) |
Categorias de Restrição
- Mutabilidade -
mutpara contas graváveis. - Propriedade -
owner,has_one, restrições de token. - Endereço -
address = expr, seeds/bump para PDAs. - Ciclo de Vida -
init,init_if_needed,close.
Armadilhas
- UncheckedAccount sem restrições - Qualquer conta passa na validação. Correção: Adicione
address,ownerouconstraint. - Falta de
mutem conta gravável - Falha em tempo de execução na escrita. Correção: Marque toda conta escrita comomut. has_oneno campo errado - Relacionamento não imposto. Correção: Corresponda o nome do campo ao campo da estrutura nos dados da conta.initsem pagador - Criação da conta falha. Correção: Definapayer = signere inclua o programa do sistema.- Confiar em PDAs fornecidos pelo cliente - Seeds incorretas drenam fundos. Correção: Sempre use restrições
seeds+bump.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| Validação manual no manipulador | Verificações dinâmicas difíceis de expressar | Prefira restrições declarativas para regras estáticas |
remaining_accounts | Conjuntos de contas variáveis | Layout fixo conhecido em tempo de compilação |
AccountLoader para zero-copy | Contas grandes | Estruturas pequenas com Borsh |
FAQs
Qual versão do Anchor este site usa?
0.32.1 para anchor-lang, Anchor CLI e exemplos nesta seção.
Preciso do Solana CLI junto com o Anchor?
Sim. O Solana CLI 3.0.10 lida com keypairs, airdrops e inspeção de solana program.
Onde a IDL fica após a compilação?
target/idl/<program>.json em seu workspace.
Posso misturar UncheckedAccount com Signer?
Sim, mas cada campo não verificado precisa de restrições explícitas ou verificações no manipulador.
Como testar sem devnet?
Use anchor test com Surfpool 0.12.0 ou LiteSVM 0.6.x em CI.
Qual é o prefixo de 8 bytes nos dados da conta?
Discriminador de conta do Anchor; não o remova ao dimensionar space.
Devo commitar a IDL gerada?
Sim, ou publique a IDL on-chain para que os clientes tenham uma fonte canônica.
Como depurar falhas de restrição?
Execute com logs; o Anchor imprime o nome da restrição e o índice da conta.
O Anchor funciona no Agave 4.1.1?
Sim. Esta pilha tem como alvo validadores Agave com Solana CLI 3.0.10.
O que devo ler a seguir nesta seção?
Veja artigos irmãos vinculados em Relacionados para tópicos mais aprofundados sobre a estrutura de contas.
Relacionado
- Tipos de Conta - referência de tipo
- As Restrições #[account] - catálogo de restrições
- Ordem de Validação de Conta - sequência de verificação
Versões da pilha: 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.