Buenas Prácticas Fundamentales de Solana
Los fundamentos a interiorizar antes de escribir programas, clientes o infraestructura en Agave 4.1.1.
Cómo Usar Esta Lista
- Recorre A, B y C antes de desplegar tu primer programa
- Revisa D al incorporar nuevos miembros del equipo con experiencia en EVM
- Trata E como una puerta de entrada previa a la red principal: cada elemento debe pasar
A - Modelo Mental
- El estado vive en las cuentas, no en los programas. Los programas son ejecutables sin estado que leen/escriben las cuentas que se les pasan.
- Cada entidad es una cuenta. Las billeteras, los programas, las acuñaciones de tokens y las estructuras de datos son todas cuentas con campos de lamports, propietario y datos.
- Las transacciones declaran todas las cuentas por adelantado. Sealevel utiliza esta lista para la programación paralela y la aplicación de bloqueos.
- Solo el programa propietario escribe los datos de la cuenta. La seguridad proviene de las reglas de propiedad, no de ocultar direcciones.
B - Moneda y Precisión
- Almacena y transmite lamports como enteros. Usa
biginten TypeScript; evita las conversionesf64en programas Rust. - Convierte SOL a lamports en el límite de la interfaz de usuario. Analiza cadenas decimales con aritmética de enteros, no de punto flotante.
- Lee los decimales de SPL por separado de SOL. Las cantidades de tokens usan decimales específicos de la acuñación, no 1e9.
- Financia nuevas cuentas al mínimo exento de alquiler. Consulta
getMinimumBalanceForRentExemptionantes deinit.
C - Clústeres y Entorno
- Por defecto, usa
devnetpara el desarrollo de aplicaciones. Usa un validador local (Surfpool 0.12.0 osolana-test-validator) para CI. - Fija la URL RPC, la configuración de la CLI y la red de la billetera al mismo clúster. Las discrepancias producen errores de "cuenta no encontrada".
- Nunca uses airdrop ni pruebes con keypairs de mainnet. Usa archivos keypair separados por entorno.
- Verifica el hash de génesis al depurar problemas del clúster.
solana genesis-hashconfirma que estás en la red deseada.
D - Claves y Firma
- Nunca incluyas el JSON del keypair en el control de versiones. Añade los archivos de clave
*.jsona.gitignore; usa gestores de secretos en producción. - Marca cada cuenta firmante con
isSigner: true. Las marcas de firmante faltantes causan rechazo en tiempo de ejecución. - Usa PDAs para direcciones controladas por programas. Los usuarios firman; los programas firman para PDAs a través de semillas.
- Mantén la billetera del pagador de tarifas financiada pero no sobre-financiada. Las billeteras de servicio solo contienen SOL mínimo para las tarifas.
E - Transacciones y Confirmación
- Usa el compromiso
confirmedpara la mayoría de las acciones de dapp. Reservafinalizedpara liquidaciones de alto valor. - Actualiza el blockhash en cada reintento. Los blockhashes caducados causan caídas silenciosas.
- Simula antes de enviar durante el desarrollo. Decodifica errores del programa a partir de los registros de simulación.
- Suscríbete a notificaciones de firma en lugar de sondeos. Los WebSockets reducen la carga y la latencia de RPC.
- Lee los registros del explorador para transacciones fallidas. Los errores en la cadena están en los registros del programa, no solo en los códigos de error de RPC.
Preguntas Frecuentes
¿Cuál es el cambio de modelo mental más importante?
El estado vive en las cuentas, no dentro de los programas. Diseña los diseños de las cuentas antes de escribir la lógica de las instrucciones.
¿Debo usar devnet o localnet para CI?
Localnet. Surfpool 0.12.0 o solana-test-validator evita los límites de tasa y la inestabilidad del clúster.
¿Por qué los flotantes son peligrosos para las cantidades de SOL?
El number de JavaScript no puede representar todos los valores de lamports exactamente. Usa bigint de extremo a extremo.
¿Qué nivel de compromiso debe usar una interfaz de intercambio?
confirmed para visualización. Considera finalized antes de liberar fondos de un fideicomiso.
¿Cómo comparto de forma segura una transacción con un compañero de equipo?
Enlace del explorador con el parámetro ?cluster= que coincida con la red donde se envió la tx.
¿Cuándo debo leer la página de comparación de EVM?
Antes de diseñar cualquier patrón de "un contrato almacena todo". Solana necesita un diseño de cuenta por entidad.
¿Qué versiones de herramientas debo fijar?
Agave 4.1.1, Solana CLI 3.0.10, Anchor 0.32.1, @solana/kit 7.0.0 según el manifiesto de este sitio.
¿Es seguro el compromiso procesado para la UX?
No. Las transacciones pueden ser descartadas o reordenadas en processed. Espera un mínimo de confirmed.
¿Cómo valido la configuración de un nuevo compañero de equipo?
solana config get, solana balance, solana airdrop 2, envía 0.001 SOL, confirma en el explorador con el parámetro de clúster correcto.
¿Debería usar web3.js v1 para nuevos proyectos?
No. Usa @solana/kit 7.0.0 para nuevos clientes TypeScript. web3.js v1 es obsoleto.
¿Cuál es el primer comando CLI que todo desarrollador debería ejecutar?
solana config set --url devnet && solana airdrop 2¿Cómo se relacionan las ranuras con la latencia visible para el usuario?
Las ranuras (~400 ms) impulsan la producción de bloques. La confirmación del usuario debe seguir los niveles de compromiso, no los recuentos de ranuras.
Relacionados
- Conceptos Básicos de Solana - ejemplos de orientación práctica
- El Modelo Mental de Solana vs. EVM - el cambio de modelo más profundo
- Cómo Fluye una Transacción - mejores prácticas de confirmación en contexto
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.