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
| Classe | Priorità | Caso d'uso |
|---|---|---|
FederatedUpdate | 1.0 (massima) | Aggiornamenti modello FL |
Financial | 0.8 | Trasferimenti di token |
Governance | 0.7 | Voti, proposte |
IoTData | 0.5 | Dati sensore |
Quote di Ammissione
| Classe | Max in Attesa | Limite per Mittente |
|---|---|---|
| Financial | 50.000 | 512 |
| IoT | 100.000 | 512 |
| Globale | 100.000 | 512 |
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
| Architettura | Intrinsics | Corsie | Batch Min |
|---|---|---|---|
| x86_64 (AVX2+FMA) | _mm256_set1_pd, _mm256_fmadd_pd | 4 double | 32 |
| ARM (NEON) | vdupq_n_f64, vfmaq_f64 | 2 double | 32 |
| Fallback | Loop scalare | 1 | Sempre |
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:
| Parametro | Sviluppo | Produzione |
|---|---|---|
| Dimensione cache | 100 voci | 10.000 voci |
| TTL | 60 secondi | 300 secondi |
Gestione del Nonce
Flusso Standard
- La TX arriva con nonce N
- Verifica:
N >= account.storage_nonce - Tracciamento in
pending_noncesHashMap durante lo svuotamento - 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à
| Flag | Descrizione |
|---|---|
simd | Valutazione ottimizzata SIMD (predefinito) |
cache | Cache dei punteggi (predefinito) |
adaptive_weights | Regolazione dinamica dei pesi |