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.
Receta
#[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.
Ejemplo Funcional
#[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:
- El orden de los argumentos en el manejador coincide con la serialización del cliente.
#[instruction]expone los argumentos a las restricciones.- Valida rangos con
require!temprano. - Los argumentos
Pubkeya menudo duplican las claves de cuenta para las semillas de PDA.
Análisis Profundo
Serialización
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.
Consejos de Validación
- Rechaza cantidades cero y
Pubkeycentinela. - Mantén la lista de argumentos pequeña para reducir las CU (unidades de cómputo) y los errores del cliente.
- Prefiere las cuentas sobre los argumentos cuando la
Pubkeydeba firmar o contener datos.
Errores Comunes
- Desajuste en el orden de los argumentos del cliente - La deserialización falla. Solución: Genera clientes a partir de la IDL.
- Falta
#[instruction]en la estructura - No se pueden usar argumentos en las semillas. Solución: Añade el atributo con los mismos nombres. - Confiar en argumentos en lugar de cuentas - La
Pubkeydel argumento no está vinculada al firmante. Solución: Requiere una cuentaSignercoincidente. Vecgrande en argumentos - Desbordamiento de CU y tamaño. Solución: Usaremaining_accountso un patrón de carga separado.- Desbordamiento de
feeoamount- Matemáticas sin verificar en el manejador. Solución: Usachecked_add/checked_mul.
Alternativas
| 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 |
Preguntas Frecuentes
¿Qué versión de Anchor se asume?
0.32.1 en toda esta sección.
¿Puede una PDA ser un Signer en la estructura de cuentas?
No. Usa restricciones de semillas y firma CPI.
¿Dónde se almacena el bump?
En el campo de tu estructura de cuenta, establecido en la inicialización.
¿Cómo derivan las PDAs los clientes?
Usa @solana/kit 7.0.0 con bytes de semilla coincidentes.
¿Qué ID de programa se usa para las PDAs?
La dirección declare_id de tu programa Anchor.
¿Las semillas incluyen el bump?
No en el array de semillas; el bump es un parámetro separado para find_program_address.
¿Cómo depurar fallos de PDA?
Compara las claves registradas; verifica las semillas y la ID del programa en el lado del cliente.
¿Las PDAs están exentas de alquiler?
Sí, cuando contienen datos; fináncialas con el pagador en la inicialización.
¿Puede una PDA firmar múltiples CPIs en una ix?
Sí, con las mismas semillas de firmante para cada CPI.
¿Qué leer a continuación?
Consulta los enlaces relacionados para temas más profundos sobre argumentos.
Relacionado
- Manejadores de Instrucciones - firmas
- Restricciones de Semillas y Bump - argumentos en semillas
- Construcción de Instrucciones - codificación del cliente
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.