anchor-lang & anchor-spl
anchor-lang 0.32.1 fornece macros, validação de contas e geração de IDL para programas on-chain. anchor-spl envolve os programas SPL Token, Associated Token e relacionados com helpers de CPI tipados. Este par é o framework Rust padrão no Agave 4.1.1 quando as equipes desejam clientes baseados em IDL em TypeScript (@solana/kit 7.0.0 via Codama) e Python (AnchorPy).
Receita
Cartão de receita de referência rápida - pronto para copiar e colar.
[dependencies]
anchor-lang = "0.32.1"
anchor-spl = "0.32.1"use anchor_lang::prelude::*;
use anchor_spl::token::{self, Token, TokenAccount, Transfer};
declare_id!("<PROGRAM_ID>");
#[program]
pub mod my_program {
use super::*;
pub fn transfer_tokens(ctx: Context<TransferTokens>, amount: u64) -> Result<()> {
token::transfer(ctx.accounts.transfer_ctx(), amount)?;
Ok(())
}
}Quando usar isso:
- Programas de produto Greenfield com alterações frequentes de instruções.
- Equipes que desejam clientes Anchor IDL + TypeScript/Python.
- CPIs de SPL Token sem empacotar manualmente os dados da instrução.
- Restrições de conta padrão (signer, mut, seeds, init).
Exemplo de Trabalho
use anchor_lang::prelude::*;
use anchor_spl::{
associated_token::AssociatedToken,
token::{Mint, Token, TokenAccount, Transfer},
};
declare_id!("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS");
#[program]
pub mod token_vault {
use super::*;
pub fn deposit(ctx: Context<Deposit>, amount: u64) -> Result<()> {
let cpi_accounts = Transfer {
from: ctx.accounts.user_ata.to_account_info(),
to: ctx.accounts.vault_ata.to_account_info(),
authority: ctx.accounts.user.to_account_info(),
};
let cpi_ctx = CpiContext::new(ctx.accounts.token_program.to_account_info(), cpi_accounts);
anchor_spl::token::transfer(cpi_ctx, amount)?;
Ok(())
}
}
#[derive(Accounts)]
pub struct Deposit<'info> {
#[account(mut)]
pub user: Signer<'info>,
#[account(mut)]
pub user_ata: Account<'info, TokenAccount>,
#[account(mut)]
pub vault_ata: Account<'info, TokenAccount>,
pub token_program: Program<'info, Token>,
}O que isso demonstra:
#[program]despacha instruções com discriminador gerado.#[derive(Accounts)]codifica validação e metadados.anchor_spl::token::transferexecuta CPI para o programa SPL Token.- Os tipos
Signer,AccounteProgramimpõem a propriedade.
Mergulho Profundo
Como Funciona
- Macros Proc expandem para pontos de entrada
solana-programe iteradores de conta. anchor buildemite IDL JSON e tipos TypeScript (legado) ou alimenta o Codama.anchor-splmapeia layouts SPL paraAccount<'info, T>com verificações de proprietário.- Flags de recursos (
init-if-needed,idl-build) ajustam a geração de código e o conteúdo da IDL.
Tabela de Crates Rust
| Crate | Papel | Pin |
|---|---|---|
anchor-lang | Macros, contas, erros, eventos | 0.32.1 |
anchor-spl | Helpers de CPI SPL, tipos de metadados de token | 0.32.1 |
anchor-derive-accounts | Geração de código de validação de conta | Transitivo 0.32.1 |
anchor-attribute-* | Macros de instrução/conta/programa | Transitivo 0.32.1 |
Tabela de TypeScript / NPM
| Pacote | Papel | Pin |
|---|---|---|
@coral-xyz/anchor | Cliente Anchor TS legado | Corresponder CLI 0.32.1 |
@solana/kit | RPC/tx moderno + clientes Codama | 7.0.0 |
| Codama | Geração de código de cliente IDL -> kit | Fixado pelo projeto |
Notas de Rust
// Corresponder exatamente às versões da CLI e do crate
// Anchor.toml: anchor_version = "0.32.1"
// Espaço para contas de inicialização
#[account(init, payer = user, space = 8 + MyState::INIT_SPACE)]
pub state: Account<'info, MyState>,Armadilhas
- Discrepância entre CLI e versão do crate - erros obscuros de IDL. Correção:
avm use 0.32.1eanchor-lang = "0.32.1". - Conta
token_programausente na CPI - falha em tempo de execução. Correção: incluir todas as contas SPL necessárias na struct. - Uso excessivo de
UncheckedAccount- buracos de segurança. Correção: contas tipadas ou verificações explícitas de proprietário. - IDL não commitada - desvio do cliente. Correção: commitar
target/idl/*.jsonou regenerar em CI. - Init sem cálculo de aluguel - lamports insuficientes. Correção: usar a macro
space+ helpers de sysvarRent.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
solana-program nativo | CU/tamanho mínimo | Iteração rápida de recursos |
pinocchio + CPI manual | Otimização extrema | Necessidades pesadas de SPL + IDL |
framework steel | Estrutura opinativa | Equipe padronizada no Anchor |
Crates mpl diretos | Lógica específica de NFT | Cofres de token simples |
FAQs
anchor-lang sem anchor-spl?
Sim para programas não-token; adicione anchor-spl ao fazer CPI de programas SPL.
Suporte a Token-2022?
Verifique as flags de recursos do anchor-spl e os IDs de programa para extensões do Token-2022.
declare_program!?
Consumir IDLs externas em clientes Rust - veja a seção IDL.
Testes?
anchor test com LiteSVM 0.6.x ou validador local por provedor do Anchor.toml.
Programas atualizáveis?
Implantar com autoridade de atualização; alinhar declare_id! com o ID do programa on-chain.
Erros personalizados?
O enum #[error_code] mapeia para erros de IDL para clientes.
Eventos?
emit!(MyEvent { ... }) registra dados estruturados analisáveis por clientes.
no_std?
Programas Anchor visam sBPF; use o subconjunto std suportado através da toolchain Solana.
Builds verificáveis?
Execute anchor build --verifiable alinhado com o fluxo de trabalho solana-verify.
Caminho de geração de código do cliente?
IDL -> Codama -> @solana/kit 7.0.0 recomendado para novos frontends.
Relacionados
- solana-program & solana-sdk - primitivas subjacentes
- Anchor Basics - modelo de contas
- spl-token & spl-associated-token-account - crates de token
- Codama - geração de cliente
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.