Mejores Prácticas de Rust para Solana
Hábitos que mantienen los programas de Solana seguros, baratos de ejecutar y fáciles de auditar. Repasa esta lista antes del despliegue en mainnet y durante la revisión del código.
Cómo Usar Esta Lista
- Úsala como una lista de verificación de PR para cualquier cambio en las instrucciones o en el diseño de las cuentas.
- Combínala con pruebas de LiteSVM 0.6.x: las reglas aquí deberían tener una prueba o lint siempre que sea posible.
- Vuelve a revisarla después de las actualizaciones de Agave o de la cadena de herramientas; los costos y límites de CU pueden cambiar.
A - Seguridad y Validación
- Valida el propietario, firmante y las banderas de escritura de cada cuenta antes de usarla. Previene la escalada de privilegios y la sustitución de cuentas.
- Usa aritmética con verificación (checked arithmetic) para todas las matemáticas de tokens y lamports. Elimina los ataques de drenaje basados en desbordamiento (wrap-based).
- Rechaza claves de cuenta duplicadas en instrucciones financieras. Detiene confusiones del tipo doble gasto.
- Almacena los bumps canónicos de PDA y verifica las semillas en la cadena. Bloquea la caza de bumps y la falsificación de PDA.
- Devuelve
ProgramErroren lugar de entrar en pánico. Falla limpiamente con códigos decodificables.
B - Datos y Diseño
- Prefija las cuentas con un discriminador único o un byte de versión. Previene ataques de confusión de tipos.
- Precalcula las constantes
LENy verificadata_len()en tiempo de ejecución. Evita escrituras parciales y pánicos de análisis. - Prefiere diseños de tamaño fijo para rutas críticas; usa Borsh para colas variables. Equilibra CU y flexibilidad.
- Documenta y prueba las migraciones de esquemas antes de actualizar los programas. Protege los fondos de los usuarios en vivo.
- Pone a cero los datos de la cuenta al cerrarla y envía el alquiler a un destinatario definido. Detiene los ataques de resurrección.
C - Rendimiento
- Limita los límites de los bucles según la longitud de la entrada del usuario. Previene el agotamiento de CU.
- Minimiza
msg!y el formato de cadenas en las rutas de producción. Los logs son costosos. - Audita
cargo treepara dependencias que no seanno_std. Mantiene los binarios compilando y pequeños. - Mide la CU con simulación en CI para instrucciones críticas. Detecta regresiones temprano.
- Agrupa las CPI cuando la semántica lo permita. Reduce la sobrecarga por invocación.
Preguntas Frecuentes
¿En qué se diferencia esto de Clippy?
Clippy cubre los modismos de Rust; esta lista es específica de seguridad y operaciones de Solana.
¿Anchor o nativo?
Muchas reglas se aplican a ambos; nativo requiere aplicación manual.
¿Pruebas mínimas?
Al menos un camino feliz y uno de fallo por instrucción.
¿Cuándo usar zero-copy?
Cuando el perfilado muestra que la deserialización domina la CU.
¿Prioridad de auditoría?
Enfócate primero en la validación, aritmética, CPI y firma de PDA.
¿Programas inmutables?
Sigue siendo importante: los clientes y los indexadores dependen de errores estables.
¿Usar rustfmt?
Sí, el diseño consistente ayuda a los revisores.
¿Documentar el orden de las cuentas?
Requerido para nativo; generar a partir de la IDL de Anchor cuando sea posible.
¿Compilación en CI?
cargo build-sbf en cada PR.
¿Surfpool en CI?
Recomendado para pruebas de integración rápidas con el comportamiento de Agave 4.1.1.
¿semver para programas?
Versiona la IDL y las tablas de errores con el ID del programa desplegado.
¿Código abierto?
Publica hashes de compilación verificables con el despliegue.
Relacionados
- Conceptos Básicos de Rust para Solana - Introducción a la sección
- Mejores Prácticas para Programas Nativos - Reglas específicas para nativos
- Auditoría de Seguridad de Programas - Preparación pre-auditoría
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.