Noções Básicas de Programas
9 exemplos para você começar com programas Solana no runtime Sealevel - 6 básicos e 3 intermediários.
Pré-requisitos
cargo install --git https://github.com/coral-xyz/anchor --tag v0.32.1 anchor-cli
anchor --versionExemplos Básicos
1. Programa Anchor Mínimo
use anchor_lang::prelude::*;
declare_id!("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS");
#[program]
pub mod hello {
use super::*;
pub fn initialize(_ctx: Context<Initialize>) -> Result<()> {
msg!("Hello from Agave 4.1.1");
Ok(())
}
}
#[derive(Accounts)]
pub struct Initialize {}- Programas são compilados para bytecode sBPF deployado em contas executáveis
#[program]gera o dispatcher de instruções e o entrypoint
Relacionado: O Entrypoint do Programa
2. Deploy no Devnet
anchor build
anchor deploy --provider.cluster devnet
solana program show <PROGRAM_ID>- Deploy envia bytecode via BPF Upgradeable Loader
- Program ID vem do keypair de
declare_id!
Relacionado: Loaders de Programa e Upgradeability
3. Invocar um Programa pela CLI
anchor run test
# Ou: solana program invoke <PROGRAM_ID> --data <BYTES>- Clients enviam transações com instruções direcionadas ao seu program ID
- Dados da instrução selecionam qual handler executa
4. Programas São Stateless
#[account]
pub struct Counter { pub value: u64 }
// Estado em conta Counter, não no binário do programa- Lógica na conta executável; dados em contas owned separadas
Relacionado: Programas Stateless
5. Passar Contas para Instruções
#[derive(Accounts)]
pub struct Increment<'info> {
#[account(mut)]
pub counter: Account<'info, Counter>,
}- Toda conta que o programa lê/escreve deve aparecer na transação
6. Ler Compute Units nos Logs
solana confirm -v <SIG> | grep "consumed"- Cada instrução consome CU do orçamento da transação
Relacionado: Compute Units e Orçamentos
Exemplos Intermediários
7. Cross-Program Invocation (CPI)
use anchor_lang::system_program;
pub fn fund(ctx: Context<Fund>, lamports: u64) -> Result<()> {
system_program::transfer(
CpiContext::new(ctx.accounts.system_program.to_account_info(), /* ... */),
lamports,
)?;
Ok(())
}- Programas chamam outros programas via CPI com contas declaradas
8. Design de Contas Seguro para Paralelismo
#[account(seeds = [b"user", user.key().as_ref()], bump)]
pub position: Account<'info, Position>,- Contas não sobrepostas permitem que Sealevel execute txs em paralelo
Relacionado: Execução Paralela Sealevel
9. Testar com Surfpool
npx surfpool@0.12.0 run anchor test- Surfpool 0.12.0 oferece testes locais rápidos compatíveis com Agave
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.