Arquitectura del Mempool
El mempool gestiona las transacciones pendientes desde la admisión, pasando por la puntuación, hasta el drenaje para la producción de bloques.
Pipeline
Red (gossipsub /savitri/tx/1)
│
▼
Prevalidación (sin estado)
│ formato de firma, límites de tamaño
▼
Control de Admisión
│ verificación de cuota, límite por remitente
▼
Validación con Estado
│ nonce, saldo, límites de comisión
▼
Puntuación por Lote SIMD
│ fee * 0.7 + clase * 0.3
▼
Caché de Puntuaciones (LRU)
│
▼
Pool Pendiente
│
▼
drain_for_block_production()
│ top-N por puntuación, final_validation
▼
Proponer Bloque
Clases de Transacciones
| Clase | Prioridad | Caso de Uso |
|---|---|---|
FederatedUpdate | 1.0 (más alta) | Actualizaciones de modelo FL |
Financial | 0.8 | Transferencias de tokens |
Governance | 0.7 | Votos, propuestas |
IoTData | 0.5 | Datos de sensores |
Cuotas de Admisión
| Clase | Máx. Pendientes | Límite por Remitente |
|---|---|---|
| Financial | 50,000 | 512 |
| IoT | 100,000 | 512 |
| Global | 100,000 | 512 |
La función drain_fair_batch() llama a record_removal() para decrementar correctamente los conteos de clase cuando se drenan transacciones (corregido en la Ronda 6).
Puntuación SIMD
Fórmula de Puntuación
score = fee_normalized * fee_weight + class_priority * class_weight
Por defecto: fee_weight = 0.7, class_weight = 0.3.
Implementación Específica por Arquitectura
| Arquitectura | Intrínsecos | Carriles | Lote Mínimo |
|---|---|---|---|
| x86_64 (AVX2+FMA) | _mm256_set1_pd, _mm256_fmadd_pd | 4 doubles | 32 |
| ARM (NEON) | vdupq_n_f64, vfmaq_f64 | 2 doubles | 32 |
| Fallback | Bucle escalar | 1 | Siempre |
Para lotes con menos de 32 transacciones se usa cómputo escalar, porque el costo inicial de SIMD supera el beneficio.
Pesos Adaptativos (Opcional)
Con el indicador de característica adaptive_weights, los pesos se ajustan según:
- Distribución de comisiones: Si las comisiones están agrupadas en valores altos, aumenta fee_weight
- Diversidad de clases: Si hay muchas clases distintas, aumenta class_weight
- Rendimiento histórico: Ajuste basado en bloques recientes
Parámetros:
base_fee_weight = 0.7
base_class_weight = 0.3
adaptation_rate = 0.1 (suavizado)
fee_threshold_high = 2,000,000,000
fee_threshold_low = 500,000,000
class_diversity_threshold = 0.5
Caché de Puntuaciones
La caché LRU evita recalcular puntuaciones:
| Parámetro | Desarrollo | Producción |
|---|---|---|
| Tamaño de caché | 100 entradas | 10,000 entradas |
| TTL | 60 segundos | 300 segundos |
Gestión de Nonce
Flujo Estándar
- La TX llega con nonce N
- Verificación:
N >= account.storage_nonce - Seguimiento en el HashMap
pending_noncesdurante el drenaje - Confirmación del nonce tras la finalización del bloque
Tolerancia a Brechas
Se acepta una brecha de nonce de hasta 5000 para la recuperación tras paros prolongados (aumentado de 1000 en la Ronda 11).
Corrección de Arranque en Frío
Cuando storage_nonce=0 AND pending_nonces=0, se acepta el nonce disponible más bajo como punto de partida. Esto maneja el caso en que las TX fueron drenadas pero el bloque nunca fue confirmado por un proponente anterior.
Restablecimiento de Nonce
El generador de TX restablece el nonce local cuando local_nonce > storage_nonce + 200 (MAX_NONCE_AHEAD). Anteriormente, los nonces locales podían derivar hasta 2000+ mientras el almacenamiento estaba en 84, haciendo que todas las TX fueran rechazadas.
Prevención de Repetición
Los hashes de transacciones se rastrean para prevenir ataques de repetición. Una vez que se ha visto un hash de TX, los envíos duplicados son rechazados.
Validación de Comisiones
FeeLimits {
min_fee: 100_000_000_000_000, // 0.0001 SAVT
max_fee: 1_000_000_000_000_000_000, // 1.0 SAVT
}
Indicadores de Característica
| Indicador | Descripción |
|---|---|
simd | Puntuación optimizada con SIMD (por defecto) |
cache | Caché de puntuaciones (por defecto) |
adaptive_weights | Ajuste dinámico de pesos |