Programas Solana
Crie programas Solana on-chain com Anchor - restrições de conta, instruções e invocação entre programas em Rust.
Receita
use anchor_lang::prelude::*;
declare_id!("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS");
#[program]
pub mod hello_anchor {
use super::*;
pub fn initialize(ctx: Context<Initialize>) -> Result<()> {
ctx.accounts.counter.count = 0;
Ok(())
}
}
#[derive(Accounts)]
pub struct Initialize<'info> {
#[account(init, payer = user, space = 8 + 8)]
pub counter: Account<'info, Counter>,
#[account(mut)]
pub user: Signer<'info>,
pub system_program: Program<'info, System>,
}
#[account]
pub struct Counter {
pub count: u64,
}Quando usar isso:
- Lógica DeFi, NFT ou de jogos de alta vazão na Solana
- Equipes que desejam clientes TypeScript/Rust gerados por IDL
- Protocolos componíveis via CPI para SPL Token e outros programas
Exemplo de Trabalho
Instrução de incremento com restrições de signatário e de conta:
use anchor_lang::prelude::*;
declare_id!("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS");
#[program]
pub mod counter {
use super::*;
pub fn increment(ctx: Context<Increment>) -> Result<()> {
ctx.accounts.counter.count = ctx.accounts.counter.count
.checked_add(1)
.ok_or(ProgramError::InvalidArgument)?;
Ok(())
}
}
#[derive(Accounts)]
pub struct Increment<'info> {
#[account(mut, has_one = authority)]
pub counter: Account<'info, Counter>,
pub authority: Signer<'info>,
}
#[account]
pub struct Counter {
pub authority: Pubkey,
pub count: u64,
}O que isso demonstra:
has_onevincula o signatário à chave pública da autoridade armazenada- Adição verificada mapeia overflow para erro de programa
- Mutabilidade da conta declarada explicitamente no derive
Análise Profunda
Como Funciona
- Transações invocam programas com metadados de conta (graváveis, signatário).
- Macros
#[account(...)]do Anchor validam proprietários, sementes e aluguel. - IDL descreve instruções para SDKs de cliente.
- CPI permite que seu programa chame
transferdo SPL Token com sementes de signatário invocadas.
Tipos de Conta
| Tipo | Uso |
|---|---|
Account<T> | Dados desserializados de propriedade do Anchor |
Signer | Deve assinar a transação |
UncheckedAccount | Apenas validação manual |
Armadilhas
- Espaço da conta muito pequeno - upgrade falha silenciosamente ou rejeita init. Correção:
space = 8 + sizeof(T)mais discriminador. - Signatário ausente em conta mut - simulação de transação falha. Correção: marque
Signeremutcorretamente na structAccounts. - Orçamento de computação excedido - lógica pesada em loops falha na mainnet. Correção: profile CU no validador local, otimize ou divida instruções.
- Colisões de sementes PDA - contas brickadas. Correção: namespace de sementes com ID do programa e tags de domínio.
- Contas externas não verificadas - alvos CPI arbitrários drenam fundos. Correção: liste IDs de programa em restrições.
Alternativas
| Alternativa | Use Quando | Não Use Quando |
|---|---|---|
| Rust Nativo Solana (sem Anchor) | Tamanho mínimo do binário | Equipe quer IDL e macros de segurança |
| Ethereum Solidity | Liquidez e ferramentas EVM | Precisa de vazão da Solana |
| Pallet Substrate | Cadeia L1 personalizada | App em cluster Solana existente |
| Rust Off-chain + oracle | Computação pesada | Estado deve ser on-chain confiavelmente |
FAQs
Como testar localmente?
solana-test-validator mais anchor test executa migrações e testes de integração contra o cluster local.
Qual é o prefixo de 8 bytes?
Discriminador de conta do Anchor - não o esqueça no cálculo de space.
Programas atualizáveis?
Implante com autoridade de atualização, então transfira a autoridade para multisig ou queime para imutabilidade quando auditado.
Integração com SPL Token?
CPI para programa de token com sementes de signatário PDA para o padrão de autoridade de cofre.
Geração de cliente?
anchor build emite IDL; use @coral-xyz/anchor ou anchor-client em testes de integração Rust.
Isenção de aluguel?
Contas precisam de lamports mínimos para o tamanho; financie no init ou recupere no close.
Códigos de erro?
Defina o enum #[error_code] para erros visíveis ao usuário em vez de falhas genéricas.
Mainnet vs devnet?
Airdrops da Devnet não são confiáveis; use validador local para CI, devnet para QA manual.
Revisão de segurança?
Leia Segurança e Auditoria antes de implantar na mainnet.
Gerenciamento de chaves?
Chaves de implantação fora de laptops quentes - veja Carteiras e Gerenciamento de Chaves.
Relacionado
- Fundamentos de Blockchain em Rust - primitivas
- Carteiras e Gerenciamento de Chaves - signatários
- Segurança e Auditoria - vulnerabilidades
- Criptografia Aplicada - hashes e curvas
Versões da Stack: Esta página foi escrita para Rust 1.97.0 (edição 2024), Tokio 1.x, Axum 0.8, serde 1.0, sqlx 0.8, clap 4, e Polars 0.46+.