Noções Básicas do Modelo de Conta
10 exemplos para você começar com o modelo de conta do Solana - 7 básicos e 3 intermediários.
Busque em todas as páginas da documentação
10 exemplos para você começar com o modelo de conta do Solana - 7 básicos e 3 intermediários.
solana config set --url devnet
npm install @solana/kit@7.0.0 @coral-xyz/anchor@0.32.1Anchor 0.32.1 / anchor-lang 0.32.1 para exemplos on-chain. Semânticas do validador Agave 4.1.1 se aplicam em todo o documento.
Cada conta expõe os mesmos cinco campos principais via RPC.
import { createSolanaRpc, address } from "@solana/kit";
const rpc = createSolanaRpc("https://api.devnet.solana.com");
const { value } = await rpc.getAccountInfo(address("YOUR_PUBKEY"), { encoding: "base64" }).send();
console.log({
lamports: value?.lamports,
owner: value?.owner,
executable: value?.executable,
dataLength: value?.data.length,
rentEpoch: value?.rentEpoch,
});lamports é o saldo de SOL; owner é o programa permitido para escrever dataexecutable: true significa que a conta é um programa implantadonull - nenhuma conta existe aindaRelacionado: Anatomia da Conta - detalhamento campo a campo
O tamanho dos dados da conta determina o depósito isento de aluguel.
solana rent 165Relacionado: Aluguel e Isenção de Aluguel - detalhes do cálculo
O campo owner determina quem pode escrever dados.
const SYSTEM_PROGRAM = "11111111111111111111111111111111";
const TOKEN_PROGRAM = "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA";
// Propriedade do Sistema: apenas o Programa do Sistema pode modificar (por exemplo, contas de carteira)
// Propriedade do Token: o programa SPL Token gerencia os dados da conta de tokeninitRelacionado: Contas do Sistema vs. Contas de Programa
A criação de conta aloca espaço e transfere a propriedade.
solana create-account --help
# Geralmente feito via inicialização de programa ou comandos de alocação da CLI// O Anchor lida com isso via #[account(init, payer = ..., space = N)]space é o tamanho do buffer de dados em bytesRelacionado: Criando e Fechando Contas
Programas armazenam o estado da aplicação em contas separadas.
#[account]
pub struct Counter {
pub count: u64,
}
#[derive(Accounts)]
pub struct Increment<'info> {
#[account(mut)]
pub counter: Account<'info, Counter>,
}Counter contém os dados; o binário do programa contém a lógicaAccount<'info, Counter> desserializa o buffer de bytes via BorshRelacionado: Estado de Propriedade de Programa
Apenas o programa proprietário pode escrever; seu programa deve validar os signatários.
#[derive(Accounts)]
pub struct Update<'info> {
#[account(mut, has_one = authority)]
pub data: Account<'info, MyData>,
pub authority: Signer<'info>,
}has_one = authority verifica se uma pubkey armazenada corresponde ao signatárioRelacionado: Propriedade e Permissões de Conta
Dimensionar o buffer de dados antes de init.
#[account]
pub struct Profile {
pub authority: Pubkey, // 32
pub name: String, // 4 + len
}
// space = 8 (discriminator) + 32 + (4 + 32) para o comprimento máximo do nomeString e Vec precisam de um prefixo de comprimento de 4 bytes mais o tamanho máximo do conteúdoRelacionado: Contas de Dados e Layout
PDAs são contas sem chave privada, de propriedade do seu programa.
#[derive(Accounts)]
pub struct InitVault<'info> {
#[account(
init,
seeds = [b"vault", user.key().as_ref()],
bump,
payer = user,
space = 8 + 8,
)]
pub vault: Account<'info, Vault>,
#[account(mut)]
pub user: Signer<'info>,
pub system_program: Program<'info, System>,
}bump é armazenado para evitar recalcular o bump canônicoseeds e bumpRelacionado: Estado de Propriedade de Programa
O fechamento retorna lamports para uma conta de destino.
#[derive(Accounts)]
pub struct CloseAccount<'info> {
#[account(mut, close = receiver)]
pub data: Account<'info, MyData>,
#[account(mut)]
pub receiver: SystemAccount<'info>,
}close transfere todos os lamports para receiverRelacionado: Criando e Fechando Contas
Decodificar estado on-chain de um cliente.
import { createSolanaRpc, address } from "@solana/kit";
const rpc = createSolanaRpc("https://api.devnet.solana.com");
const account = await rpc
.getAccountInfo(address("COUNTER_ACCOUNT_PUBKEY"), { encoding: "base64" })
.send();
if (account.value) {
const data = Buffer.from(account.value.data[0], "base64");
const discriminator = data.subarray(0, 8);
const count = data.readBigUInt64LE(8);
console.log("Count:", count);
}Relacionado: Contas de Dados e Layout
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.
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026