Manejadores de Instrucciones
Los manejadores de instrucciones son funciones públicas dentro de #[program]. Reciben Context<T> donde T es la estructura de cuentas validada, más cualquier argumento deserializado por Borsh.
Busca en todas las páginas de la documentación
Los manejadores de instrucciones son funciones públicas dentro de #[program]. Reciben Context<T> donde T es la estructura de cuentas validada, más cualquier argumento deserializado por Borsh.
pub fn deposit(ctx: Context<Deposit>, amount: u64) -> Result<()> {
require!(amount > 0, VaultError::InvalidAmount);
// business logic
Ok(())
}Cuándo usar esto: Implementas la lógica de negocio para una instrucción en la cadena.
#[program]
pub mod vault {
use super::*;
pub fn deposit(ctx: Context<Deposit>, amount: u64) -> Result<()> {
let vault = &mut ctx.accounts.vault;
vault.total = vault.total.checked_add(amount).ok_or(VaultError::Overflow)?;
emit!(Deposited { amount, vault: vault.key() });
Ok(())
}
}
#[derive(Accounts)]
pub struct Deposit<'info> {
#[account(mut, seeds = [b"vault"], bump = vault.bump)]
pub vault: Account<'info, VaultState>,
#[account(mut)]
pub depositor: Signer<'info>,
}Lo que esto demuestra:
Context<Deposit> envuelve cuentas y program_idResult<()> propaga errores personalizadosctx.bumps expone los bumps canónicos de las semillas| Campo | Uso |
|---|---|
ctx.accounts | Cuentas validadas mutables/inmutables |
ctx.program_id | Clave pública del programa actual |
ctx.bumps | Mapa de semillas de bump de las restricciones |
ctx.remaining_accounts | Cuentas adicionales no incluidas en la estructura |
Mantén los manejadores pequeños; delega a funciones de módulo para lógica compleja.
ctx.bumps - Vuelve a buscar los bumps en CPI. Solución: Usa ctx.bumps.vault del nombre de la semilla.Account<T>. Solución: Los cambios se serializan al soltar si son mutables.Result incorrecto - Los manejadores deben devolver Result para rutas con fallos. Solución: Usa Result<()> o las APIs de retorno de datos.remaining_accounts ciegamente - Ataques de sustitución de cuentas. Solución: Valida el propietario y el discriminador.| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| Ayudantes de módulo | Lógica compartida entre manejadores | En línea para programas pequeños |
APIs return_data | Devolver bytes al llamador | La mayoría de las instrucciones usan cuentas para la salida |
| Brazos de coincidencia de instrucciones nativas | Sin Anchor | Ergonomía del Contexto de Anchor |
0.32.1 en toda esta sección.
No. Usa restricciones de semillas y firma CPI.
En el campo de tu estructura de cuenta, establecido en la inicialización.
Usa @solana/kit 7.0.0 con bytes de semilla coincidentes.
La dirección declare_id de tu programa Anchor.
No en el array de semillas; el bump es un parámetro separado para find_program_address.
Compara las claves registradas; verifica las semillas y el ID del programa en el lado del cliente.
Sí, cuando contienen datos; financia con el pagador en la inicialización.
Sí, con las mismas semillas de firmante para cada CPI.
Consulta los enlaces relacionados para temas más profundos sobre manejadores.
ctx.accounts#[program] - macro de móduloVersiones de Stack: 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.
Revisado por Chris St. John·Última actualización: 19 jul 2026