Modelo de Seguridad
Primitivas Criptográficas
| Primitiva | Algoritmo | Uso |
|---|---|---|
| Firmas | Ed25519 (ed25519-dalek) | Firma de transacciones, firma de bloques |
| Hash de bloques | SHA-512 | Hash de bloque con etiqueta de dominio "BLK" |
| Hash de transacciones | SHA-256 | Hash del mensaje de firma |
| Hash de estado | BLAKE3 | Cómputo de raíz de estado |
| Hash de almacenamiento | Keccak256 | Derivación de ranuras de almacenamiento de contratos |
| Compresión | snap, lz4 | Compresión de mensajes P2P |
Seguridad de Transporte
Capa P2P
- Cifrado: Protocolo Noise de libp2p (cifrado autenticado)
- Multiplexación: Yamux
- Identidad: Claves de par Ed25519
- Tamaño máximo de transmisión: 256KB por mensaje
Capa RPC
- TLS: No terminado por el servidor RPC. Los despliegues en producción deben usar un proxy inverso con terminación TLS.
- CORS: Restringido a orígenes localhost. Configurar orígenes permitidos para producción.
- Límite de cuerpo: Cuerpo de solicitud máximo de 1MB.
Limitación de Tasa
| Capa | Límite | Ventana |
|---|---|---|
| RPC global | 200 req/s | Ventana deslizante de 1 segundo |
| RPC por IP | 50 req/s | Ventana deslizante de 1 segundo |
| Tamaño de lote | 100 solicitudes | Por solicitud HTTP |
| Escaneo de hash de bloque | 1000 bloques | Por llamada a chain_getBlockByHash |
Validación de Entradas
RPC
- La versión JSON-RPC debe ser exactamente
"2.0" - Los mensajes de error se sanean antes de devolverlos a los clientes
- Los errores internos devuelven mensajes genéricos (sin trazas de pila ni formatos internos)
- Los detalles de rechazo del mempool se eliminan de las respuestas de error
Mempool
- Validación de nonce: Se requieren nonces secuenciales (tolerancia de brecha de hasta 5000 para recuperación de ráfagas)
- Verificación de saldo: El remitente debe tener saldo suficiente para monto + tarifa
- Verificación de firma: La firma Ed25519 se verifica antes de la admisión
- Sistema de cuotas: Límites por clase (Financiero: 50K, IoT: 100K, Global: 100K)
- Límite por remitente: Máximo 512 transacciones pendientes por remitente
Canal de Transacciones
Guardas sin estado (se ejecutan primero):
- Validación del formato de firma
- Verificación de firma Ed25519
- Verificación de derivación de clave pública a dirección
Guardas con estado (se ejecutan tras pasar las sin estado):
- Nonce >= nonce de cuenta
- Saldo >= monto + tarifa
- Cuenta no en lista negra
Confirmación atómica: la deducción de saldo y el incremento de nonce ocurren de forma atómica.
Seguridad del Consenso
Quórum BFT
- Quórum: 2f+1 (67%) de los validadores deben firmar el Certificado de Aceptación de Bloque
- Tolerancia Bizantina: Hasta f = (n-1)/3 nodos bizantinos
- Verificación de certificados: Los masternodos verifican todas las firmas de atestación
Anti-Manipulación PoU
- Suavizado de puntaje: La media móvil exponencial previene la manipulación del puntaje mediante comportamiento transitorio
- Rotación de proponente: Tras 50 bloques, el proponente debe ceder (previene monopolio)
- Umbral mínimo de puntaje: Puntaje < 300 descalifica de las recompensas
Seguridad Electoral
- IDs de grupo determinísticos: Basados en época, no en tiempo de reloj (previene desacuerdo entre MNs)
- Deduplicación de elecciones: Solo se confirma el primer resultado por ronda
- Rechazo suave de grupos desconocidos: Los masternodos advierten pero continúan procesando IDs de grupo desconocidos
Gestión de Claves
Cartera SDK
- Eliminación segura: Las claves privadas se borran de forma segura al hacer
Drop(mediante el cratezeroize) - Sin persistencia: La cartera SDK no guarda claves en disco
- Cumplimiento de HTTPS: Los endpoints RPC remotos requieren HTTPS por defecto
Faucet
- Claves por turnos: 10 pares de claves rotados para prevenir contención de nonces
- Reclamaciones serializadas: El mutex
faucet_lockpreviene condiciones de carrera TOCTOU - Límites de reclamación: 5 SAVT por reclamación, período de espera de 24 horas por dirección
Seguridad de Nodos
Actividad de Pares
- Keepalive de Gossipsub: El compartir puntajes PoU se publica vía gossipsub para actualizar
last_seen - Tiempo de espera por inactividad: 600 segundos (configurable) antes de eliminar un par
- Desconexión SlowPeer: Los nodos se desconectan si la cola de envío de gossipsub está saturada
Límites de Recursos
- Cola del manejador de conexiones: 50,000 mensajes (LN + MN)
- Malla Gossipsub: mesh_n=8, mesh_n_high=12, mesh_n_low=4
- Tamaño de pila: 8MB para prevenir desbordamiento de pila
- Memoria: Grupos de mempool acotados con contrapresión
Divulgación Responsable
Reportar vulnerabilidades de seguridad mediante el proceso de divulgación responsable del proyecto. No crear incidencias públicas para errores de seguridad.