Creación y Cierre de Cuentas
La creación de cuentas asigna espacio, designa un propietario y financia la exención de alquiler. El cierre recupera lamports. realloc aumenta o reduce los datos en el lugar.
Busca en todas las páginas de la documentación
La creación de cuentas asigna espacio, designa un propietario y financia la exención de alquiler. El cierre recupera lamports. realloc aumenta o reduce los datos en el lugar.
// Crear
#[account(init, payer = payer, space = 8 + MyData::INIT_SPACE)]
pub data: Account<'info, MyData>,
// Ampliar
#[account(mut, realloc = new_size, realloc::payer = payer, realloc::zero = false)]
pub data: Account<'info, MyData>,
// Cerrar
#[account(mut, close = receiver)]
pub data: Account<'info, MyData>,Cuándo usar esto:
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>,
}Lo que esto demuestra:
init al Programa del Sistema para asignación + transferencia de alquilerrealloc puede requerir lamports adicionales del realloc::payerclose pone los datos a cero y envía todos los lamports a receiverspace bytes.close establece los lamports a 0 y asigna la propiedad al Programa del Sistema.init sin system_program: fallo de compilación/tiempo de ejecución. Solución: incluir siempre Program<'info, System>.realloc pierde datos: trunca bytes. Solución: migrar datos antes de reducir o solo aumentar.mut en el pagador para realloc: financiación insuficiente. Solución: marcar el pagador como mut cuando realloc pueda costar lamports.| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
init_if_needed | Incorporación idempotente | Seguridad estricta de creación única |
| CPI Manual del Sistema | Programas nativos sin Anchor | Proyectos Anchor (usar macros) |
| Migración de cuentas nuevas | Cambios de diseño importantes | Adiciones menores de campos |
realloc | Crecimiento modesto del tamaño | Cambios grandes en conjuntos de datos (nuevo PDA) |
CPI al Programa del Sistema create_account con espacio, propietario y lamports del pagador.
Tu programa a través de la restricción close, que normalmente requiere la firma de la autoridad.
A la cuenta especificada en close = receiver.
Cuando los datos de la cuenta crecen más allá del space asignado originalmente.
Sí, si un tamaño mayor requiere un mínimo de exención de alquiler más alto. El pagador financia la diferencia.
Sí. El programa firma si es necesario; los lamports van al receptor.
Crea la cuenta solo si no existe; útil para patrones similares a ATAs con cuidado.
La misma dirección se puede reinicializar si se recrea con init; trátela como una cuenta nueva.
Múltiples restricciones close en una instrucción; ten en cuenta los límites de CU.
No automáticamente. Añade emit! para los indexadores.
Las cuentas vacías propiedad del sistema se pueden vaciar; las propiedad del programa requieren una instrucción del programa.
Si los nuevos bytes se ponen a cero. false preserva los datos existentes durante el crecimiento.
Versiones de la Pila: Esta página fue 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, y LiteSVM 0.6.x.
Revisado por Chris St. John·Última actualización: 16 jul 2026