Saltar al contenido principal

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

ClasePrioridadCaso de Uso
FederatedUpdate1.0 (más alta)Actualizaciones de modelo FL
Financial0.8Transferencias de tokens
Governance0.7Votos, propuestas
IoTData0.5Datos de sensores

Cuotas de Admisión

ClaseMáx. PendientesLímite por Remitente
Financial50,000512
IoT100,000512
Global100,000512

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

ArquitecturaIntrínsecosCarrilesLote Mínimo
x86_64 (AVX2+FMA)_mm256_set1_pd, _mm256_fmadd_pd4 doubles32
ARM (NEON)vdupq_n_f64, vfmaq_f642 doubles32
FallbackBucle escalar1Siempre

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ámetroDesarrolloProducción
Tamaño de caché100 entradas10,000 entradas
TTL60 segundos300 segundos

Gestión de Nonce

Flujo Estándar

  1. La TX llega con nonce N
  2. Verificación: N >= account.storage_nonce
  3. Seguimiento en el HashMap pending_nonces durante el drenaje
  4. 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

IndicadorDescripción
simdPuntuación optimizada con SIMD (por defecto)
cacheCaché de puntuaciones (por defecto)
adaptive_weightsAjuste dinámico de pesos