As Restrições #[account]
Atributos de campo em membros de structs de contas compõem regras de validação. Anchor as avalia em uma ordem definida antes que seu manipulador de instruções seja executado.
Receita
#[account(
mut,
has_one = authority,
constraint = amount > 0 @ MyError::InvalidAmount,
)]
pub vault: Account<'info, Vault>,Quando usar isso: Você expressa propriedade, relacionamentos ou invariantes personalizados declarativamente.
Exemplo de Trabalho
#[derive(Accounts)]
pub struct SetFee<'info> {
#[account(
mut,
seeds = [b"config"],
bump = config.bump,
has_one = admin,
constraint = new_fee_bps <= 10_000 @ ConfigError::FeeTooHigh,
)]
pub config: Account<'info, Config>,
pub admin: Signer<'info>,
}O que isso demonstra:
mutmarca contas graváveishas_oneverifica a igualdade da chave pública com o campo aninhadoconstraintexecuta expressões booleanas arbitrárias- O erro após
@mapeia para uma variante de enum de erro personalizada
Análise Detalhada
Atributos Comuns
| Atributo | Propósito |
|---|---|
mut | A conta é gravável |
signer | Deve ser signatário (em tipos não-Signer) |
has_one = field | O campo da conta é igual à chave de outra conta |
address = expr | Correspondência exata da chave pública |
owner = prog | Verificação do programa proprietário |
constraint = expr | Invariante personalizado |
Combine atributos; todos devem passar.
Armadilhas
- constraint sem @ erro - Mensagem genérica de violação de restrição. Correção: Adicione
@ MyError::Variantpara clareza. - erro de digitação em has_one - Falha silenciosa na compilação ou campo incorreto. Correção: O nome do campo deve existir na struct da conta.
- address = chave incorreta - Quebra a mainnet se uma chave de teste for codificada. Correção: Use constantes
pubkey!por sinalizadores de recursos do cluster. - mut ausente no destino de has_one - Somente leitura quando você precisa escrever. Correção: Adicione
mutnas contas que você persiste. - Restrição e verificação do manipulador sobrepostas - Lógica duplicada se desvia. Correção: Escolha declarativa ou manipulador, não ambos para a mesma regra.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| require! no manipulador | Lógica dinâmica entre contas | Verificações de relacionamento estáticas |
| Tokens de restrição personalizados (0.32) | Padrões reutilizáveis | Regras simples únicas |
| Verificações nativas manuais | Sem Anchor | Você usa Anchor para segurança |
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. Solana CLI 3.0.10 lida com keypairs, airdrops e inspeção de solana program.
Onde vive o IDL 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 de 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 Anchor; não o remova ao dimensionar space.
Devo confirmar o IDL gerado?
Sim, ou publique o IDL on-chain para que os clientes tenham uma fonte canônica.
Como depurar falhas de restrição?
Execute com logs; 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 restrições de conta.
Relacionados
- Restrições Personalizadas - expressões avançadas
- Ordem de Validação de Conta - ordem de avaliação
- init & init_if_needed - restrições de ciclo de vida
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.