anchor-lang y anchor-spl
anchor-lang 0.32.1 proporciona macros, validación de cuentas y generación de IDL para programas on-chain. anchor-spl envuelve los programas SPL Token, Associated Token y relacionados con helpers de CPI tipados. Este par es el framework Rust por defecto en Agave 4.1.1 cuando los equipos desean clientes basados en IDL en TypeScript (@solana/kit 7.0.0 vía Codama) y Python (AnchorPy).
Receta
Tarjeta de receta de referencia rápida - lista para copiar y pegar.
[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(())
}
}Cuándo usar esto:
- Programas de producto Greenfield con cambios frecuentes de instrucciones.
- Equipos que desean clientes Anchor IDL + TypeScript/Python.
- CPIs de SPL Token sin empaquetar manualmente datos de instrucción.
- Restricciones de cuenta estándar (signer, mut, seeds, init).
Ejemplo de Trabajo
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>,
}Lo que esto demuestra:
#[program]despacha instrucciones con un discriminador generado.#[derive(Accounts)]codifica la validación y las metadatos.anchor_spl::token::transferrealiza una CPI al programa SPL Token.- Los tipos
Signer,AccountyProgramfuerzan la propiedad.
Inmersión Profunda
Cómo Funciona
- Las macros Proc se expanden a puntos de entrada de
solana-programe iteradores de cuentas. anchor buildemite JSON de IDL y tipos de TypeScript (legado) o alimenta a Codama.anchor-splmapea los layouts de SPL aAccount<'info, T>con comprobaciones de propietario.- Las flags de características (
init-if-needed,idl-build) ajustan la generación de código y el contenido de la IDL.
Tabla de Crates de Rust
| Crate | Rol | Pin |
|---|---|---|
anchor-lang | Macros, cuentas, errores, eventos | 0.32.1 |
anchor-spl | Helpers de CPI de SPL, tipos de metadatos de token | 0.32.1 |
anchor-derive-accounts | Generación de código de validación de cuentas | Transitiva 0.32.1 |
anchor-attribute-* | Macros de instrucción/cuenta/programa | Transitiva 0.32.1 |
Tabla de TypeScript / NPM
| Paquete | Rol | Pin |
|---|---|---|
@coral-xyz/anchor | Cliente TS de Anchor (legado) | Coincidir con CLI 0.32.1 |
@solana/kit | RPC/tx modernos + clientes Codama | 7.0.0 |
| Codama | Generación de código de cliente IDL -> kit | Fijado por proyecto |
Notas de Rust
// Coincidir versiones de CLI y crate exactamente
// Anchor.toml: anchor_version = "0.32.1"
// Espacio para cuentas de inicialización
#[account(init, payer = user, space = 8 + MyState::INIT_SPACE)]
pub state: Account<'info, MyState>,Errores Comunes
- Desajuste de versión CLI vs crate - errores de IDL oscuros. Solución:
avm use 0.32.1yanchor-lang = "0.32.1". - Falta la cuenta
token_programen CPI - fallo en tiempo de ejecución. Solución: incluir todas las cuentas requeridas de SPL en la struct. - Uso excesivo de
UncheckedAccount- agujeros de seguridad. Solución: cuentas tipadas o comprobaciones explícitas de propietario. - IDL no registrada - deriva del cliente. Solución: confirmar
target/idl/*.jsono regenerar en CI. - Init sin cálculo de alquiler - lamports insuficientes. Solución: usar la macro
space+ helpers de sysvarRent.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
solana-program nativo | Mínimo CU/tamaño | Iteración rápida de características |
pinocchio + CPI manual | Optimización extrema | Necesidades pesadas de SPL + IDL |
Framework steel | Estructura con opinión | Equipo estandarizado en Anchor |
Crates mpl directas | Lógica específica de NFT | Vaults de tokens simples |
Preguntas Frecuentes
¿anchor-lang sin anchor-spl?
Sí, para programas que no son de tokens; añade anchor-spl al hacer CPI a programas SPL.
¿Soporte para Token-2022?
Verifica las flags de características de anchor-spl y los IDs de programa para extensiones de Token-2022.
¿declare_program!?
Consume IDLs externas en clientes Rust - ver sección IDL.
¿Pruebas?
anchor test con LiteSVM 0.6.x o validador local según el proveedor de Anchor.toml.
¿Programas actualizables?
Despliega con autoridad de actualización; alinea declare_id! con el ID del programa on-chain.
¿Errores personalizados?
El enum #[error_code] se mapea a errores de IDL para los clientes.
¿Eventos?
emit!(MyEvent { ... }) registra datos estructurados que los clientes pueden parsear.
¿no_std?
Los programas Anchor apuntan a sBPF; usa el subconjunto de std soportado a través de la toolchain de Solana.
¿Compilaciones verificables?
Ejecuta anchor build --verifiable alineado con el flujo de trabajo de solana-verify.
¿Ruta de generación de código del cliente?
IDL -> Codama -> @solana/kit 7.0.0 recomendado para frontends nuevos.
Relacionado
- solana-program y solana-sdk - primitivas subyacentes
- Conceptos Básicos de Anchor - modelo de cuentas
- spl-token y spl-associated-token-account - crates de tokens
- Codama - generación de clientes
Versiones de la Pila: Esta página fue 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, y LiteSVM 0.6.x.