Trabalhando com Pubkeys e Contas
Pubkey identifica contas e programas. AccountInfo é o handle do runtime para lamports, dados, owner e flags de signer. Slicing e validação corretos previnem escalação de privilégio.
Busque em todas as páginas da documentação
Pubkey identifica contas e programas. AccountInfo é o handle do runtime para lamports, dados, owner e flags de signer. Slicing e validação corretos previnem escalação de privilégio.
use solana_program::{account_info::AccountInfo, pubkey::Pubkey};
fn assert_signer(ai: &AccountInfo) -> ProgramResult {
if !ai.is_signer { return Err(ProgramError::MissingRequiredSignature); }
Ok(())
}Quando usar:
next_account_info.use solana_program::{
account_info::{next_account_info, AccountInfo},
program_error::ProgramError,
pubkey::Pubkey,
};
pub fn process_transfer(accounts: &[AccountInfo], expected_owner: &Pubkey) -> ProgramResult {
let iter = &mut accounts.iter();
let payer = next_account_info(iter)?;
let vault = next_account_info(iter)?;
if !payer.is_signer {
return Err(ProgramError::MissingRequiredSignature);
}
if vault.owner != expected_owner {
return Err(ProgramError::IncorrectProgramId);
}
if !vault.is_writable {
return Err(ProgramError::InvalidAccountData);
}
Ok(())
}O que isso demonstra:
next_account_info avança o iterador de contas na ordem do cliente.| Campo | Significado |
|---|---|
key | Endereço da conta |
lamports | Ref de saldo SOL |
data | Ref de payload de bytes |
owner | Programa que pode escrever dados |
is_signer | Assinou esta tx |
is_writable | Mutável nesta tx |
== em referências.is_on_curve == false off-chain; on-chain trate como chaves normais.let (pda, bump) = Pubkey::find_program_address(&[b"vault", owner.as_ref()], program_id);key quando quis dizer owner permite impersonação. Correção: Nomeie variáveis claramente e faça lint em reviews.**lamports.| Alternativa | Use quando | Não use quando |
|---|---|---|
Anchor Account<'info, T> | Checagens auto de owner/discriminador | Controle manual |
Pinocchio AccountView | Parse de conta com CU menor | Maturidade do ecossistema |
| Maps de conta off-chain | Cliente monta account metas | On-chain ainda deve verificar |
Amarrado à instrução - não armazene referências através de CPI.
Sim - PDAs são pubkeys fora da curva ed25519.
Use ==; sem requisito constant-time para pubkeys.
Use **account.lamports ou helpers de borrow.
Construtor da transação - programa deve fazer assert por segurança.
Contas não inicializadas podem ter comprimento zero até alocadas.
Contas novas pertencem ao System Program até atribuídas.
Apenas via PDAs com invoke_signed.
Off-chain Pubkey::from_str - on-chain receba como account key.
Use padrão iterator; evite len hard-coded sem checagens.
Contas de programa são executáveis; contas de dados não.
Verifique Rent::get()?.is_exempt ao criar contas.
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