Noções Básicas de Anchor
10 exemplos para você começar com Anchor no Solana - 7 básicos e 3 intermediários.
Busque em todas as páginas da documentação
10 exemplos para você começar com Anchor no Solana - 7 básicos e 3 intermediários.
anchor --version)solana --version) com um keypair financiado para deployanchor init my_program ou um workspace existente com Anchor.tomlAnchor cria programas, testes e configuração em uma única árvore.
anchor init counter --no-git
cd counter
cat programs/counter/Cargo.tomlprograms/ contém crates Rust on-chaintests/ contém testes de integração TypeScriptAnchor.toml fixa o cluster, ID do programa e scriptsanchor-lang = "0.32.1" em Cargo.tomlRelacionado: Estrutura do Projeto - layout de pastas
O endereço do programa deve corresponder ao deploy on-chain.
use anchor_lang::prelude::*;
declare_id!("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS");
#[program]
pub mod counter {
use super::*;
pub fn initialize(_ctx: Context<Initialize>) -> Result<()> {
Ok(())
}
}declare_id! define a chave pública do programaanchor keys sync após anchor deploy atualizar o IDDeclaredProgramIdMismatch em tempo de execuçãoRelacionado: O Módulo #[program]
Anchor valida cada conta antes que seu manipulador seja executado.
#[derive(Accounts)]
pub struct Initialize<'info> {
#[account(mut)]
pub payer: Signer<'info>,
pub system_program: Program<'info, System>,
}Signer prova que a conta assinou a transaçãoProgram<System> verifica o endereço do programa do sistemaRelacionado: A Struct de Contas
Manipuladores recebem Context<T> com contas validadas.
pub fn increment(ctx: Context<Increment>) -> Result<()> {
ctx.accounts.counter.count += 1;
Ok(())
}Result<()> para instruções falíveisctx.accountsrequire! para verificações personalizadas dentro dos manipuladoresRelacionado: Manipuladores de Instrução
anchor build compila SBF e emite o JSON da IDL.
anchor build
cat target/idl/counter.json | headtarget/idl/<program>.jsonRelacionado: Construindo e Implantando
Testes TypeScript exercitam o programa em um validador local.
anchor testtests/*.ts@coral-xyz/anchor ou @solana/kit nos testesRelacionado: O Fluxo de Trabalho do Anchor
Combine as versões da CLI e dos crates para evitar desvios de macro.
[dependencies]
anchor-lang = "0.32.1"
anchor-spl = "0.32.1"anchor-lang e Anchor CLI na mesma versão menorCargo.lock do workspace deve ser commitadoEndereços derivados do programa armazenam estado de propriedade do programa.
#[account(
init,
payer = payer,
space = 8 + Counter::INIT_SPACE,
seeds = [b"counter", payer.key().as_ref()],
bump
)]
pub counter: Account<'info, Counter>,
pub payer: Signer<'info>,
pub system_program: Program<'info, System>,init cria a conta na mesma instruçãoseeds + bump derivam um PDA determinísticospace para dimensionamento isento de aluguelRelacionado: PDAs em Anchor
Eventos estruturados ajudam os indexadores a observar mudanças de estado.
#[event]
pub struct CountChanged {
pub new_count: u64,
}
pub fn increment(ctx: Context<Increment>) -> Result<()> {
ctx.accounts.counter.count += 1;
emit!(CountChanged { new_count: ctx.accounts.counter.count });
Ok(())
}#[event] registra um tipo na IDLemit! escreve uma entrada de log self-CPImsg! para saída legível por máquinaRelacionado: Eventos com emit!
Erros tipados decodificam de forma limpa nos clientes.
#[error_code]
pub enum CounterError {
#[msg("Count cannot exceed maximum")]
CountOverflow,
}
require!(ctx.accounts.counter.count < 100, CounterError::CountOverflow);#[error_code] mapeia para códigos de erro Anchor na IDLrequire! é a macro de guarda idiomáticaRelacionado: #[error_code] & require!
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