Argumentos de Instrucción
Los argumentos después de Context<T> se serializan con Borsh en los datos de la instrucción. Usa #[instruction(...)] en las estructuras de cuentas para referenciar argumentos en las restricciones.
Busca en todas las páginas de la documentación
Los argumentos después de Context<T> se serializan con Borsh en los datos de la instrucción. Usa #[instruction(...)] en las estructuras de cuentas para referenciar argumentos en las restricciones.
#[derive(Accounts)]
#[instruction(amount: u64, recipient: Pubkey)]
pub struct Transfer<'info> { /* usa amount en la restricción */ }
pub fn transfer(ctx: Context<Transfer>, amount: u64, recipient: Pubkey) -> Result<()> {
require!(amount > 0, MyError::InvalidAmount);
Ok(())
}Cuándo usar esto: Cuando los clientes pasan parámetros numéricos o de tipo Pubkey más allá de la lista de cuentas.
#[derive(Accounts)]
#[instruction(id: u64)]
pub struct CreatePool<'info> {
#[account(
init,
payer = payer,
space = 8 + Pool::INIT_SPACE,
seeds = [b"pool", id.to_le_bytes().as_ref()],
bump,
)]
pub pool: Account<'info, Pool>,
#[account(mut)]
pub payer: Signer<'info>,
pub system_program: Program<'info, System>,
}
pub fn create_pool(ctx: Context<CreatePool>, id: u64, fee_bps: u16) -> Result<()> {
require!(fee_bps <= 10_000, PoolError::InvalidFee);
ctx.accounts.pool.fee_bps = fee_bps;
Ok(())
}Qué demuestra esto:
#[instruction] expone los argumentos a las restricciones.require! temprano.Pubkey a menudo duplican las claves de cuenta para las semillas de PDA.Anchor antepone un discriminador de instrucción de 8 bytes y luego codifica Borsh los argumentos en el orden de los parámetros del manejador.
Pubkey centinela.Pubkey deba firmar o contener datos.#[instruction] en la estructura - No se pueden usar argumentos en las semillas. Solución: Añade el atributo con los mismos nombres.Pubkey del argumento no está vinculada al firmante. Solución: Requiere una cuenta Signer coincidente.Vec grande en argumentos - Desbordamiento de CU y tamaño. Solución: Usa remaining_accounts o un patrón de carga separado.fee o amount - Matemáticas sin verificar en el manejador. Solución: Usa checked_add/checked_mul.| Alternativa | Usar cuando | No usar cuando |
|---|---|---|
| API solo con cuentas | Cuando cada entrada es estado en cadena | Escaladores suministrados por el cliente |
| Datos de instrucción manualmente (nativo) | Diseños que no son Borsh | Flujos de trabajo de IDL de Anchor |
| Prefijo de byte de versión en diseño personalizado | Migración del diseño de argumentos | Programas Anchor Greenfield |
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 la ID del programa en el lado del cliente.
Sí, cuando contienen datos; fináncialas 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 argumentos.
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.
Revisado por Chris St. John·Última actualización: 16 jul 2026