Estado Propiedad del Programa
Los programas de Solana son ejecutables sin estado. Todo el estado duradero reside en cuentas propiedad del programa - direcciones separadas cuyo campo owner es tu ID de programa.
Busca en todas las páginas de la documentación
Los programas de Solana son ejecutables sin estado. Todo el estado duradero reside en cuentas propiedad del programa - direcciones separadas cuyo campo owner es tu ID de programa.
#[account]
pub struct Escrow {
pub maker: Pubkey,
pub amount: u64,
}
#[account(
init,
payer = maker,
space = 8 + Escrow::INIT_SPACE,
seeds = [b"escrow", maker.key().as_ref()],
bump,
)]
pub escrow: Account<'info, Escrow>,Cuándo usar esto:
mapping(address => Data).use anchor_lang::prelude::*;
declare_id!("Escrow1111111111111111111111111111111111111");
#[program]
pub mod escrow_program {
use super::*;
pub fn initialize(ctx: Context<Initialize>, amount: u64) -> Result<()> {
let escrow = &mut ctx.accounts.escrow;
escrow.maker = ctx.accounts.maker.key();
escrow.amount = amount;
Ok(())
}
pub fn release(ctx: Context<Release>) -> Result<()> {
let escrow = &ctx.accounts.escrow;
require!(escrow.amount > 0, EscrowError::Empty);
// transferir lamports vía CPI...
Ok(())
}
}
#[derive(Accounts)]
pub struct Initialize<'info> {
#[account(
init,
payer = maker,
space = 8 + Escrow::INIT_SPACE,
seeds = [b"escrow", maker.key().as_ref()],
bump,
)]
pub escrow: Account<'info, Escrow>,
#[account(mut)]
pub maker: Signer<'info>,
pub system_program: Program<'info, System>,
}
#[account]
#[derive(InitSpace)]
pub struct Escrow {
pub maker: Pubkey,
pub amount: u64,
}Lo que esto demuestra:
escrow_program.amount - solo la cuenta de depósito en garantía lo hace.| Patrón | Semillas | Uso |
|---|---|---|
| PDA por usuario | [b"user", pubkey] | Perfiles, posiciones |
| Configuración global | [b"config"] | Ajustes de administrador |
| Bóveda por token | [b"vault", mint] | Custodia de tokens |
seeds::program con bump.init de Anchor establece el propietario automáticamente.close cuando finaliza el ciclo de vida.| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| PDA por entidad | Estado mutable específico del usuario | Banderas globales pequeñas |
| Cuenta de configuración única | Configuración de todo el protocolo | Datos de usuario con escrituras frecuentes |
| Cuenta sin copia (Zero-copy) | Datos de cuenta grandes | Estructuras pequeñas |
| Compresión de estado | Emisiones / reclamaciones masivas | Registros actualizados frecuentemente |
En una cuenta propiedad del programa (a menudo una PDA), no dentro del binario del programa.
Sí, si se pasan en la transacción y se conoce la deserialización. La escritura todavía requiere la lógica del programa propietario.
Direcciones distintas ilimitadas. Cada una es una cuenta separada en la cadena.
Una cuenta que contiene todos los registros de usuario. Causa límites de tamaño, explosiones de CU y fallos de paralelización.
Sí. Las PDAs son cuentas propiedad del programa que las deriva.
Las cuentas de estado persisten a través de las actualizaciones del programa. Solo cambia el bytecode.
Sí, a través de realloc, nuevas cuentas o versionado de deserialización en los manejadores de instrucciones.
El payer en init - el usuario o el protocolo que subsidia.
El programa posee la cuenta; el usuario la controla mediante comprobaciones de firma en las instrucciones que la mutan.
RPC getProgramAccounts con filtros memcmp en los discriminadores.
Sí - campo lamports. Común en patrones de depósito en garantía y bóvedas.
Macro de derivación que calcula el tamaño serializado de Borsh para el atributo space.
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