Discriminadores de Conta
Discriminadores identificam qual tipo de struct possui o layout de bytes de uma conta. Eles bloqueiam ataques de confusão de tipo onde uma conta maliciosa é interpretada como o tipo errado.
Receita
if data[..8] != Account::DISCRIMINATOR { return Err(ProgramError::InvalidAccountData); }Quando usar isso:
- Múltiplos tipos de conta em um programa.
- Migrando layouts entre versões.
- Correspondendo ao comportamento de validação de conta do Anchor.
Exemplo de Trabalho
pub const VAULT_DISC: [u8; 8] = *b"vault___";
pub fn load_vault(data: &[u8]) -> Result<Vault, ProgramError> {
if data.len() < 8 || data[..8] != VAULT_DISC { return Err(ProgramError::InvalidAccountData); }
Vault::deserialize(&mut &data[8..]).map_err(|_| ProgramError::InvalidAccountData)
}O que isso demonstra:
- Prefixo de 8 bytes verificado antes do corpo Borsh.
- Discriminador constante por tipo.
- Discriminador errado rejeitado precocemente.
Mergulho Profundo
Discriminadores do Anchor
SHA256("account:TypeName")[:8] em 0.32.1.
Nativo
Escolha constantes únicas; documente no IDL.
Notas Rust
// Incluir disc em ESPAÇO: 8 + corpoArmadilhas
- Sem discriminador - Conta de token analisada como estado personalizado. Correção: Sempre prefixe os tipos.
- Discriminadores duplicados - Dois tipos colidem. Correção: Único por struct.
- Disco esquecido no ESPAÇO - Serialização trunca. Correção: Adicione 8 bytes a LEN.
- Cliente inicializa tipo errado - O manipulador de inicialização deve gravar o disco. Correção: Defina apenas na criação.
- Alteração do disco de atualização - Quebra contas. Correção: Nunca altere o disco ativo.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| Digitação apenas do proprietário | Tipo de conta única por programa | Programas multitarefa |
| Byte de versão apenas | Mais simples | Segurança de tipo mais fraca |
| Disco automático do Anchor | Padrão | Manual nativo |
FAQs
8 bytes necessários?
Convenção do Anchor; nativo pode diferir se for consistente.
Disco em Borsh?
Geralmente antecipado manualmente ou wrapper Anchor.
Init define disco?
Sim, primeira escrita.
Close limpa o disco?
Zera todos os dados.
Disco em IDL?
Anchor inclui nomes de conta.
Força bruta do disco?
Não é um limite de segurança - a correspondência do layout é importante.
Disco da conta de token?
O programa de token tem seu próprio layout - diferente.
Múltiplas versões do mesmo tipo?
Use o campo de versão após o disco.
Testar disco errado?
Teste negativo LiteSVM.
Hash disc?
Interno do Anchor - reproduzível.
Pub em SDK?
Exporte constantes para clientes.
Disco zero?
Bytes válidos, mas evite ambiguidade de todos os zeros.
Relacionado
- Structs Borsh - Layouts
- Padrões de Inicialização de Conta - Init
- Ataques de Reinicialização - Ataques de confusã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.