init & init_if_needed
init cria uma nova conta na mesma instrução. init_if_needed cria apenas quando ausente, o que introduz o risco de reinicialização se as restrições forem fracas.
Receita
#[account(
init,
payer = payer,
space = 8 + MyAccount::INIT_SPACE,
seeds = [b"vault", user.key().as_ref()],
bump
)]
pub vault: Account<'info, Vault>,Quando usar isso: Uma instrução deve alocar estado de propriedade do programa pela primeira vez.
Exemplo de Trabalho
#[derive(Accounts)]
pub struct CreateProfile<'info> {
#[account(
init,
payer = user,
space = 8 + Profile::INIT_SPACE,
seeds = [b"profile", user.key().as_ref()],
bump
)]
pub profile: Account<'info, Profile>,
#[account(mut)]
pub user: Signer<'info>,
pub system_program: Program<'info, System>,
}
// init_if_needed: apenas quando idempotente e seguro
#[account(
init_if_needed,
payer = payer,
space = 8 + Stats::INIT_SPACE,
seeds = [b"stats"],
bump,
)]
pub stats: Account<'info, Stats>,O que isso demonstra:
initfalha se a conta já existirpayerfinancia lamports isentos de aluguelspaceinclui um discriminador de 8 bytesinit_if_neededpode pular a criação quando a conta existe
Análise Profunda
Requisitos do init
- O pagador deve ser um signatário mutável com SOL.
- O programa do sistema é necessário para alocar/atribuir.
- O espaço deve caber no tamanho serializado da conta.
Risco do init_if_needed
Se os dados da conta existente não forem validados, um invasor passará lixo não inicializado que passa em verificações fracas. Prefira init ou valide o discriminador e a autoridade em todos os caminhos.
Armadilhas
- init sem space - Erro de compilação ou aluguel incorreto. Correção: Use
INIT_SPACEouspace = 8 + .... - init_if_needed em dados de propriedade do usuário - Ataques de reinicialização possíveis. Correção: Use
initouconstraintestrito no estado existente. - Esqueceu system_program - A criação da conta CPI falha. Correção: Inclua
Program<System>. - Payer não mut - A transferência de aluguel falha. Correção: Marque o pagador como
#[account(mut)]. - Duplo init com as mesmas seeds - A segunda chamada falha; planeje um fluxo idempotente. Correção: Use
init_if_neededapenas com guardas fortes.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| Instrução de criação separada | Ciclo de vida claro | Experiência de configuração única |
| CPI para o programa do sistema manualmente | Programas nativos | Macros init do Anchor |
| init_if_needed + constraint | Onboarding idempotente | Cofres de alta 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 a IDL vive após o build?
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 do 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 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; 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 init.
Relacionado
- Espaço e Aluguel - dimensionamento
- Seeds e Restrições Bump - init de PDA
- Padrões de Inicialização de Conta - padrões de design
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.