Tolleranza ai Guasti e Finalità
Garanzie BFT
Il consenso Savitri utilizza un protocollo di voto BFT (Byzantine Fault Tolerant) con un quorum 2f+1 (soglia del 67%).
Tolleranza ai Guasti
| Nodi Totali (n) | Max Bizantini (f) | Quorum Richiesto |
|---|---|---|
| 3 | 0 | 2 |
| 5 | 1 | 4 |
| 7 | 2 | 5 |
| 10 | 3 | 7 |
| 15 | 4 | 11 |
Formula: f = floor((n-1) / 3), quorum = 2f + 1
Sicurezza
Un blocco viene finalizzato solo quando viene prodotto un Certificato di Accettazione del Blocco (BAC) con firme da 2f+1 validatori. Questo garantisce:
- Nessun blocco conflittuale può essere finalizzato alla stessa altezza
- Nessun rollback una volta emesso un BAC (finalità deterministica, non probabilistica)
- I nodi bizantini non possono falsificare certificati senza la partecipazione al quorum
Liveness
La rete può produrre blocchi finché n - f nodi onesti sono online:
- Rotazione del proposer: Dopo 50 blocchi, il proposer si ritira per prevenire il punto singolo di guasto
- Watchdog delle elezioni: Ri-attiva l'elezione se non c'è progressione dei blocchi per 60 secondi
- Rilassamento progressivo del quorum: Dopo 3+ fallimenti consecutivi delle elezioni, il numero minimo di candidati scende a 2
Struttura DAG
Le intestazioni dei blocchi supportano la struttura DAG multi-genitore per la produzione concorrente di blocchi:
pub struct BlockHeader {
pub parent_hash: Vec<u8>, // genitore primario (compatibilità con versioni precedenti)
pub parent_hashes: Vec<Vec<u8>>, // genitori aggiuntivi per il DAG
// ...
}
Rilevamento dei Conflitti
Il ConflictDetector identifica:
- Conflitti di doppia spesa: Stesso UTXO referenziato in più rami
- Conflitti di stato: Transizioni di stato conflittuali
- Rilevamento fork: Più blocchi alla stessa altezza da proposer diversi
Risoluzione dei Conflitti
Quando vengono rilevati conflitti:
- Scegliere il ramo con punteggio PoU cumulativo più alto
- Annullare le transazioni conflittuali
- Riapplicare le transazioni non conflittuali dal ramo perdente
Consenso Consapevole dei Gruppi
Formazione dei Gruppi
I Masternodes organizzano i lightnodes in gruppi:
- Ordinare i lightnodes per punteggio PoU
- Assegnare a gruppi di
group_size(3 dev, 7 prod) - Pubblicare le assegnazioni di gruppo tramite gossipsub
- ID di gruppo deterministici basati sull'epoch (non sull'orario di sistema)
Elezione Intra-Gruppo
All'interno di ciascun gruppo:
- I membri condividono i punteggi PoU
- Il punteggio PoU più alto diventa proposer (spareggio per peer_id)
- Minimo
(total+1)/2candidati richiesti - Dopo 3+ fallimenti: rilassamento a minimo 2 candidati
Accettazione del Blocco
- Il proposer del gruppo produce un blocco
- I membri del gruppo verificano e firmano
- BAC prodotto con 2f+1 firme
- I Masternodes verificano il BAC e finalizzano
Meccanismi di Ripristino
Ripristino Elezioni
| Meccanismo | Trigger | Azione |
|---|---|---|
| Timer watchdog | Nessun blocco per 60s | Ri-attiva PoU + elezione |
| Rilassamento progressivo | 3+ fallimenti | Abbassa quorum a 2 |
| Rotazione proposer | 50 blocchi | Ritiro, ri-elezione |
| Ri-elezione immediata | Re-inizializzazione gruppo | Avvia task PoU + elezione |
Ripristino Peer
| Meccanismo | Trigger | Azione |
|---|---|---|
| Keepalive gossipsub | Intervallo 60s | Pubblicazione punteggio PoU |
| Watchdog ripristino mesh | Nessun mesh per 60s | Ri-connessione ai peer del gruppo |
| Disconnessione SlowPeer | Coda saturata | Disconnessione e riconnessione |
| Reset nonce | Locale > storage + 200 | Reset al nonce di storage |
Ripristino Gruppo
Quando un gruppo viene re-inizializzato:
- Punteggi PoU mantenuti per i membri continuativi
- I nuovi membri partono con punteggi predefiniti
- Flag
intra_group_startedresettato - PoU + elezione immediata avviata (senza attendere i timer periodici)
Slashing (Produzione)
| Infrazione | Penalità | Cooldown |
|---|---|---|
| Doppio voto | 50% stake | N/A |
| Downtime | 10% stake | Graduale |
| Proposta non valida | 25% stake | N/A |
Lo slashing è disabilitato su devnet, abilitato su mainnet (config/production.toml).
Configurazione del Consenso
| Parametro | Sviluppo | Produzione |
|---|---|---|
| Timeout | 15s | 10s |
| Massimo round | 5 | 10 |
| Soglia quorum | 0.67 | 0.67 |
| Ottimizzazioni BFT | Disabilitate | Abilitate |
| Slashing | Disabilitato | Abilitato |
| Tempo di blocco | 2s | 5s |
| Dimensione gruppo | 3 | 7 |