Estado de Propriedade do Programa
Programas Solana são executáveis sem estado. Todo estado durável vive em contas de propriedade do programa - endereços separados cujo campo owner é o ID do seu programa.
Busque em todas as páginas da documentação
Programas Solana são executáveis sem estado. Todo estado durável vive em contas de propriedade do programa - endereços separados cujo campo owner é o ID do seu 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>,Quando usar isso:
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);
// transfere lamports via 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,
}O que isso demonstra:
escrow_programamount - apenas a conta de escrow o faz| Padrão | Seeds | Uso |
|---|---|---|
| PDA por usuário | [b"user", pubkey] | Perfis, posições |
| Configuração global | [b"config"] | Configurações do administrador |
| Cofre por mint | [b"vault", mint] | Custódia de tokens |
seeds::program com bump.init do Anchor define o proprietário automaticamente.close quando o ciclo de vida termina.| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| PDA por entidade | Estado mutável específico do usuário | Pequenas flags globais |
| Conta de configuração única | Configurações de todo o protocolo | Dados de usuário com muitas escritas |
| Conta zero-copy | Dados de conta grandes | Estruturas pequenas |
| Compressão de estado | Mints / reivindicações em massa | Registros atualizados com frequência |
Em uma conta de propriedade do programa (geralmente um PDA) - não dentro do binário do programa.
Sim, se passadas na transação e a desserialização for conhecida. A escrita ainda requer lógica do programa proprietário.
Endereços distintos ilimitados. Cada um é uma conta separada on-chain.
Uma conta contendo todos os registros de usuários. Causa limites de tamanho, explosões de CU e falha na paralelização.
Sim. PDAs são contas pertencentes ao programa derivado.
As contas de estado persistem entre os upgrades do programa. Apenas o bytecode muda.
Sim, via realloc, novas contas ou versionamento de desserialização em manipuladores de instrução.
O payer em init - usuário ou protocolo subsidiador.
O programa possui a conta; o usuário controla por meio de verificações de signatário nas instruções que a modificam.
RPC getProgramAccounts com filtros memcmp nos discriminadores.
Sim - campo lamports. Comum em padrões de escrow e cofre.
Macro de derivação que calcula o tamanho serializado Borsh para o atributo space.
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