Criando e Fechando Contas
A criação de conta aloca espaço, atribui um proprietário e financia a isenção de aluguel. O fechamento recupera lamports. realloc aumenta ou diminui os dados no local.
Busque em todas as páginas da documentação
A criação de conta aloca espaço, atribui um proprietário e financia a isenção de aluguel. O fechamento recupera lamports. realloc aumenta ou diminui os dados no local.
// Criar
#[account(init, payer = payer, space = 8 + MyData::INIT_SPACE)]
pub data: Account<'info, MyData>,
// Aumentar
#[account(mut, realloc = new_size, realloc::payer = payer, realloc::zero = false)]
pub data: Account<'info, MyData>,
// Fechar
#[account(mut, close = receiver)]
pub data: Account<'info, MyData>,Quando usar isso:
use anchor_lang::prelude::*;
#[program]
pub mod lifecycle {
use super::*;
pub fn create(ctx: Context<Create>, label: String) -> Result<()> {
ctx.accounts.data.authority = ctx.accounts.payer.key();
ctx.accounts.data.label = label;
Ok(())
}
pub fn expand(ctx: Context<Expand>, extra: u32) -> Result<()> {
ctx.accounts.data.extra = extra;
Ok(())
}
pub fn close_account(ctx: Context<CloseData>) -> Result<()> {
Ok(())
}
}
#[account]
#[derive(InitSpace)]
pub struct MyData {
pub authority: Pubkey,
#[max_len(20)]
pub label: String,
pub extra: u32,
}
#[derive(Accounts)]
pub struct Create<'info> {
#[account(init, payer = payer, space = 8 + MyData::INIT_SPACE)]
pub data: Account<'info, MyData>,
#[account(mut)]
pub payer: Signer<'info>,
pub system_program: Program<'info, System>,
}
#[derive(Accounts)]
pub struct Expand<'info> {
#[account(
mut,
realloc = 8 + MyData::INIT_SPACE,
realloc::payer = payer,
realloc::zero = false,
)]
pub data: Account<'info, MyData>,
#[account(mut)]
pub payer: Signer<'info>,
pub system_program: Program<'info, System>,
}
#[derive(Accounts)]
pub struct CloseData<'info> {
#[account(mut, close = receiver, has_one = authority)]
pub data: Account<'info, MyData>,
pub authority: Signer<'info>,
#[account(mut)]
pub receiver: SystemAccount<'info>,
}O que isso demonstra:
init para o System Program para alocação + transferência de aluguelrealloc pode exigir lamports adicionais de realloc::payerclose zera os dados e envia todos os lamports para receiverspace bytesclose do Anchor define os lamports para 0 e atribui a propriedade ao System Programinit sem system_program - falha de compilação/tempo de execução. Correção: sempre inclua Program<'info, System>.realloc perdendo dados - trunca bytes. Correção: migre os dados antes de reduzir ou apenas aumente.mut no pagador para realloc - financiamento insuficiente. Correção: marque o pagador como mut quando realloc puder custar lamports.| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
init_if_needed | Integração de usuário idempotente | Segurança estrita de criação única |
| CPI Manual do Sistema | Programas nativos sem Anchor | Projetos Anchor (use macros) |
| Migração de conta nova | Mudanças de layout que quebram compatibilidade | Adições de campo menores |
realloc | Crescimento modesto de tamanho | Grandes alterações de conjunto de dados (novo PDA) |
CPI para o System Program create_account com espaço, proprietário e lamports do pagador.
Seu programa via restrição close - tipicamente exigindo um signatário de autoridade.
A conta especificada em close = receiver.
Quando os dados da conta crescem além do space originalmente alocado.
Sim, se um tamanho maior exigir um mínimo mais alto de isenção de aluguel. O pagador financia a diferença.
Sim. O programa assina, se necessário; os lamports vão para o receptor.
Cria a conta apenas se ela não existir - útil para padrões semelhantes a ATAs com cuidado.
O mesmo endereço pode ser reinicializado se recriado com init - trate como uma nova conta.
Múltiplas restrições close em uma instrução - observe os limites de CU.
Não automaticamente. Adicione emit! para indexadores.
Contas vazias de propriedade do sistema podem ser drenadas; contas de propriedade do programa exigem instrução do programa.
Se os novos bytes são zerados. false preserva os dados existentes durante o crescimento.
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.
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026