Anatomia da Conta
Toda conta Solana compartilha os mesmos campos estruturais. Entender cada campo diz quem pode escrever, se código ou dados vivem lá, e quanta SOL está bloqueada para aluguel.
Receita
import { createSolanaRpc, address } from "@solana/kit";
const rpc = createSolanaRpc("https://api.devnet.solana.com");
const { value: acct } = await rpc
.getAccountInfo(address("PUBKEY"), { encoding: "base64" })
.send();Quando usar isto:
- Depurando erros de permissão (proprietário incorreto ou signatário ausente)
- Determinando se um endereço é uma conta de programa vs. dados
- Calculando aluguel a partir de
data.length - Verificando a existência da conta antes de construir transações
Exemplo de Trabalho
solana account 11111111111111111111111111111111use anchor_lang::prelude::*;
pub fn inspect(ctx: Context<Inspect>) -> Result<()> {
let acct = &ctx.accounts.target;
msg!("lamports: {}", acct.lamports());
msg!("owner: {}", acct.owner);
msg!("data len: {}", acct.data_len());
msg!("executable: {}", acct.executable);
Ok(())
}
#[derive(Accounts)]
pub struct Inspect<'info> {
/// CHECK: inspeção bruta
pub target: UncheckedAccount<'info>,
}O que isto demonstra:
- Todos os cinco campos são legíveis por qualquer programa que receba a conta
executabledistingue contas de programa de contas de dadosdata_len()retorna o tamanho do buffer de bytes excluindo os campos de metadados
Mergulho Profundo
Referência de Campo
| Campo | Tipo | Significado |
|---|---|---|
lamports | u64 | Saldo de SOL em lamports |
data | &[u8] | Carga útil bruta de bytes |
owner | Pubkey | Programa autorizado a escrever data |
executable | bool | true se a conta contém um programa BPF |
rent_epoch | u64 | Rastreamento legado; contas isentas de aluguel usam u64::MAX |
Como Funciona
- Campos de metadados (
lamports,owner,executable,rent_epoch) são gerenciados em tempo de execução - Apenas o
ownerpode redimensionar ou escreverdata(além do System Program para alocação) - Contas de programa têm
owner = BPF Loadereexecutable = true
Armadilhas
- Confundir lamports com saldo de token - Saldo SPL vive nos
datada conta de token, não emlamports. Correção: leia o layout da conta de token para saldos. - Assumir que
dataé texto UTF-8 - são bytes brutos (Borsh, bincode ou customizado). Correção: desserializar com o esquema correto. - Ignorar o sinalizador
executable- passar uma conta de programa onde dados são esperados falha. Correção: verifique o sinalizador antes da desserialização. - Semântica de
rent_epochmudou - contas modernas são isentas de aluguel; o campo de época é legado. Correção: usegetMinimumBalanceForRentExemptionpara financiamento. - Proprietário vs. autoridade - proprietário é o programa; autoridade é frequentemente uma pubkey dentro de
data. Correção: valide ambos em suas restrições.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
RPC getAccountInfo | Inspeção off-chain | Caminho crítico em programas (passe contas) |
Anchor Account<T> | Desserialização tipada | Layouts desconhecidos ou variáveis |
UncheckedAccount | Leitura de bytes brutos com verificações manuais | Escolha padrão (prefira tipado) |
FAQs
Quais são os cinco campos da conta?
Lamports, data, owner, executable, rent_epoch. Toda conta tem todos os cinco.
Quem pode mudar o campo owner?
Apenas o programa proprietário atual (via assign) ou o System Program durante a criação. Não programas arbitrários.
Qual é o tamanho máximo de dados da conta?
10 MB por conta no Agave 4.1.1. Limites práticos são menores devido aos custos de aluguel e CU.
Lamports e dados podem mudar na mesma instrução?
Sim. Programas frequentemente deduzem lamports enquanto atualizam dados em uma instrução atômica.
O que significa executable=true?
A conta contém bytecode BPF implantado carregado por um programa BPF loader.
Owner é o mesmo que upgrade authority?
Não. Upgrade authority é metadado na conta de dados do programa, separado do campo owner em contas individuais.
Como verifico se uma conta existe?
getAccountInfo retorna null se a conta nunca foi financiada/criada.
O que vive nos dados de uma conta de carteira?
Geralmente vazio (0 bytes). A SOL da carteira está apenas em lamports.
Dois programas podem co-possuir uma conta?
Não. Exatamente um programa proprietário por conta.
Qual codificação o RPC deve usar para dados binários?
base64 ou base58 para getAccountInfo. jsonParsed para layouts de programa conhecidos como SPL Token.
rent_epoch afeta a validade da transação?
Não para contas modernas isentas de aluguel. É informativo/legado.
Como os dados da conta são dispostos no Anchor?
Discriminador de 8 bytes + campos de struct serializados em Borsh.
Relacionado
- Noções Básicas do Modelo de Conta - exemplos de visão geral
- Aluguel e Isenção de Aluguel - requisitos de lamports
- Contas de Dados e Layout - design de buffer de bytes
Versões da Stack: 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.