Passa al contenuto principale

Architettura del Mempool

Il mempool gestisce le transazioni in attesa dall'ammissione, attraverso la valutazione, fino allo svuotamento per la produzione dei blocchi.

Pipeline

Rete (gossipsub /savitri/tx/1)


Pre-validazione (stateless)
│ formato firma, limiti di dimensione

Controllo di Ammissione
│ verifica quota, limite per mittente

Validazione con Stato
│ nonce, saldo, limiti commissione

Valutazione Batch SIMD
│ fee * 0.7 + class * 0.3

Cache dei Punteggi (LRU)


Pool in Attesa


drain_for_block_production()
│ top-N per punteggio, final_validation

Proposer del Blocco

Classi di Transazione

ClassePrioritàCaso d'uso
FederatedUpdate1.0 (massima)Aggiornamenti modello FL
Financial0.8Trasferimenti di token
Governance0.7Voti, proposte
IoTData0.5Dati sensore

Quote di Ammissione

ClasseMax in AttesaLimite per Mittente
Financial50.000512
IoT100.000512
Globale100.000512

La funzione drain_fair_batch() chiama record_removal() per decrementare correttamente i conteggi per classe quando le transazioni vengono svuotate (risolto nel Round 6).

Valutazione SIMD

Formula del Punteggio

score = fee_normalized * fee_weight + class_priority * class_weight

Predefinito: fee_weight = 0.7, class_weight = 0.3.

Implementazione Specifica per Architettura

ArchitetturaIntrinsicsCorsieBatch Min
x86_64 (AVX2+FMA)_mm256_set1_pd, _mm256_fmadd_pd4 double32
ARM (NEON)vdupq_n_f64, vfmaq_f642 double32
FallbackLoop scalare1Sempre

Per batch con meno di 32 transazioni si utilizza il calcolo scalare, perché il costo di inizializzazione SIMD supera il beneficio.

Pesi Adattativi (Opzionale)

Con il flag di funzionalità adaptive_weights, i pesi si adattano in base a:

  • Distribuzione delle commissioni: Se le commissioni sono concentrate in alto, aumenta fee_weight
  • Diversità delle classi: Se ci sono molte classi diverse, aumenta class_weight
  • Throughput storico: Adattamento basato sui blocchi recenti

Parametri:

base_fee_weight = 0.7
base_class_weight = 0.3
adaptation_rate = 0.1 (smorzamento)
fee_threshold_high = 2.000.000.000
fee_threshold_low = 500.000.000
class_diversity_threshold = 0.5

Cache dei Punteggi

La cache LRU evita il ricalcolo dei punteggi:

ParametroSviluppoProduzione
Dimensione cache100 voci10.000 voci
TTL60 secondi300 secondi

Gestione del Nonce

Flusso Standard

  1. La TX arriva con nonce N
  2. Verifica: N >= account.storage_nonce
  3. Tracciamento in pending_nonces HashMap durante lo svuotamento
  4. Commit del nonce dopo la finalizzazione del blocco

Tolleranza alle Lacune

Un gap di nonce fino a 5000 è accettato per il ripristino dopo stalli prolungati (aumentato da 1000 nel Round 11).

Correzione Cold-Start

Quando storage_nonce=0 E pending_nonces=0, il nonce disponibile più basso viene accettato come punto di partenza. Gestisce il caso in cui le TX siano state svuotate ma il blocco non sia mai stato confermato da un proposer precedente.

Reset del Nonce

Il generatore TX resetta il nonce locale quando local_nonce > storage_nonce + 200 (MAX_NONCE_AHEAD). In precedenza i nonce locali potevano scivolare fino a 2000+ mentre lo storage era a 84, causando il rifiuto di tutte le TX.

Prevenzione dei Replay

Gli hash delle transazioni vengono tracciati per prevenire attacchi di replay. Una volta visto un hash di TX, le richieste duplicate vengono rifiutate.

Validazione delle Commissioni

FeeLimits {
min_fee: 100_000_000_000_000, // 0.0001 SAVT
max_fee: 1_000_000_000_000_000_000, // 1.0 SAVT
}

Flag di Funzionalità

FlagDescrizione
simdValutazione ottimizzata SIMD (predefinito)
cacheCache dei punteggi (predefinito)
adaptive_weightsRegolazione dinamica dei pesi