Passa al contenuto principale

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
302
514
725
1037
15411

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:

  1. Scegliere il ramo con punteggio PoU cumulativo più alto
  2. Annullare le transazioni conflittuali
  3. Riapplicare le transazioni non conflittuali dal ramo perdente

Consenso Consapevole dei Gruppi

Formazione dei Gruppi

I Masternodes organizzano i lightnodes in gruppi:

  1. Ordinare i lightnodes per punteggio PoU
  2. Assegnare a gruppi di group_size (3 dev, 7 prod)
  3. Pubblicare le assegnazioni di gruppo tramite gossipsub
  4. ID di gruppo deterministici basati sull'epoch (non sull'orario di sistema)

Elezione Intra-Gruppo

All'interno di ciascun gruppo:

  1. I membri condividono i punteggi PoU
  2. Il punteggio PoU più alto diventa proposer (spareggio per peer_id)
  3. Minimo (total+1)/2 candidati richiesti
  4. Dopo 3+ fallimenti: rilassamento a minimo 2 candidati

Accettazione del Blocco

  1. Il proposer del gruppo produce un blocco
  2. I membri del gruppo verificano e firmano
  3. BAC prodotto con 2f+1 firme
  4. I Masternodes verificano il BAC e finalizzano

Meccanismi di Ripristino

Ripristino Elezioni

MeccanismoTriggerAzione
Timer watchdogNessun blocco per 60sRi-attiva PoU + elezione
Rilassamento progressivo3+ fallimentiAbbassa quorum a 2
Rotazione proposer50 blocchiRitiro, ri-elezione
Ri-elezione immediataRe-inizializzazione gruppoAvvia task PoU + elezione

Ripristino Peer

MeccanismoTriggerAzione
Keepalive gossipsubIntervallo 60sPubblicazione punteggio PoU
Watchdog ripristino meshNessun mesh per 60sRi-connessione ai peer del gruppo
Disconnessione SlowPeerCoda saturataDisconnessione e riconnessione
Reset nonceLocale > storage + 200Reset al nonce di storage

Ripristino Gruppo

Quando un gruppo viene re-inizializzato:

  1. Punteggi PoU mantenuti per i membri continuativi
  2. I nuovi membri partono con punteggi predefiniti
  3. Flag intra_group_started resettato
  4. PoU + elezione immediata avviata (senza attendere i timer periodici)

Slashing (Produzione)

InfrazionePenalitàCooldown
Doppio voto50% stakeN/A
Downtime10% stakeGraduale
Proposta non valida25% stakeN/A

Lo slashing è disabilitato su devnet, abilitato su mainnet (config/production.toml).

Configurazione del Consenso

ParametroSviluppoProduzione
Timeout15s10s
Massimo round510
Soglia quorum0.670.67
Ottimizzazioni BFTDisabilitateAbilitate
SlashingDisabilitatoAbilitato
Tempo di blocco2s5s
Dimensione gruppo37