Conceptos básicos de programas
9 ejemplos para empezar con programas de Solana en el runtime de Sealevel: 6 básicos y 3 intermedios.
Prerrequisitos
cargo install --git https://github.com/coral-xyz/anchor --tag v0.32.1 anchor-cli
anchor --versionEjemplos básicos
1. Programa mínimo de Anchor
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 {}- Los programas se compilan a bytecode sBPF y se despliegan en cuentas ejecutables
#[program]genera el despachador de instrucciones y el punto de entrada
Relacionado: El punto de entrada del programa
2. Despliegue en Devnet
anchor build
anchor deploy --provider.cluster devnet
solana program show <PROGRAM_ID>- El despliegue carga el bytecode a través del cargador actualizable de BPF
- El ID del programa proviene del par de claves
declare_id!
Relacionado: Cargadores de programas y actualizabilidad
3. Invocación de un programa desde la CLI
anchor run test
# O: solana program invoke <PROGRAM_ID> --data <BYTES>- Los clientes envían transacciones con instrucciones dirigidas a tu ID de programa
- Los datos de la instrucción seleccionan qué manejador se ejecuta
4. Los programas no tienen estado
#[account]
pub struct Counter { pub value: u64 }
// El estado está en la cuenta Counter, no en el binario del programa- La lógica está en la cuenta ejecutable; los datos están en cuentas separadas y de propiedad
Relacionado: Programas sin estado
5. Pasar cuentas a las instrucciones
#[derive(Accounts)]
pub struct Increment<'info> {
#[account(mut)]
pub counter: Account<'info, Counter>,
}- Cada cuenta que el programa lee/escribe debe aparecer en la transacción
6. Leer unidades de cómputo en los logs
solana confirm -v <SIG> | grep "consumed"- Cada instrucción consume CU del presupuesto de la transacción
Relacionado: Unidades de cómputo y presupuestos
Ejemplos intermedios
7. Invocación entre programas (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(())
}- Los programas llaman a otros programas a través de CPI con cuentas declaradas
8. Diseño de cuentas seguro para paralelismo
#[account(seeds = [b"user", user.key().as_ref()], bump)]
pub position: Account<'info, Position>,- Las cuentas no superpuestas permiten a Sealevel ejecutar transacciones en paralelo
Relacionado: Ejecución paralela de Sealevel
9. Probar con Surfpool
npx surfpool@0.12.0 run anchor test- Surfpool 0.12.0 proporciona pruebas locales rápidas compatibles con Agave
Versiones de la pila: Esta página se escribió 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.