CPIs en las mejores prácticas de Anchor
Llamadas entre programas tipadas, seguras y mínimas para programas de Anchor 0.32.1 en producción.
Cómo usar esta lista
- Revisa cada CPI nuevo en las PR de seguridad.
- Fija las IDL externas usadas por
declare_program!. - Simula instrucciones con muchas CPI en devnet.
A - Validación
- Usa
Program<T>para cada objetivo de CPI, nunca cuentas de programa sin verificar. - Valida
remaining_accountsantes de reenviar propietario, discriminador, frescura. - Limita el recuento de cuentas restantes para prevenir el griefing de CU.
- Fija la versión de la IDL llamada en el repositorio con etiquetas de lanzamiento.
B - Firma
- Usa
with_signersolo con PDAs validados, semillas forzadas en la estructura. - Prefiere
ctx.bumpssobre recalcular el bump canónico. - Evita las CPI en expresiones de restricciones, mantén los efectos secundarios en los manejadores.
Preguntas frecuentes
¿Formato de error de Anchor 0.32.1?
Códigos personalizados en la IDL más cadenas #[msg].
¿`emit!` vs `emit_cpi!`?
emit_cpi! cuesta más CU pero mejora la fiabilidad de la captura.
¿Debo usar `msg!` en mainnet?
Evítalo excepto si está detrás de flags de características.
¿Cómo obtienen los clientes los códigos de error?
Desde la IDL a través de la generación de código de Anchor o Codama.
¿Aparecen los eventos en la IDL?
Sí, los tipos #[event] se listan.
¿Pueden las restricciones devolver errores personalizados?
Sí, con @MyError::Variant.
¿Qué usa CU en el registro?
Cada línea de registro y cada cadena formateada.
¿Cómo probar errores?
anchor test esperando códigos de error.
¿Son los registros datos de consenso?
Sí, pero no un contrato de API; usa eventos.
¿Próxima lectura?
Ver Relacionados para bp de cpi.
Relacionados
- Conceptos básicos de CPI en Anchor - introducción
- Seguridad de CPI - amenazas
- Mejores prácticas de instrucciones - manejadores
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.