Aller au contenu principal

Tolérance aux pannes et finalité

Garanties BFT

Le consensus Savitri utilise un protocole de vote BFT (Byzantine Fault Tolerant) avec un quorum 2f+1 (seuil de 67 %).

Tolérance aux pannes

Nœuds totaux (n)Byzantins max (f)Quorum requis
302
514
725
1037
15411

Formule : f = floor((n-1) / 3), quorum = 2f + 1

Sécurité

Un bloc n'est finalisé que lorsqu'un Certificat d'acceptation de bloc (BAC) est produit avec des signatures de 2f+1 validateurs. Cela garantit :

  • Aucun bloc conflictuel ne peut être finalisé à la même hauteur
  • Aucun retour en arrière une fois qu'un BAC est émis (finalité déterministe, non probabiliste)
  • Les nœuds byzantins ne peuvent pas forger des certificats sans participation au quorum

Vivacité

Le réseau peut produire des blocs tant que n - f nœuds honnêtes sont en ligne :

  • Rotation des proposeurs : Après 50 blocs, le proposeur cède sa place pour éviter les points de défaillance uniques
  • Chien de garde d'élection : Redéclenche l'élection si aucune progression de bloc pendant 60 secondes
  • Relaxation progressive du quorum : Après 3 échecs d'élection consécutifs ou plus, le nombre minimum de candidats descend à 2

Structure DAG

Les BlockHeaders prennent en charge une structure DAG multi-parents pour la production de blocs concurrente :

pub struct BlockHeader {
pub parent_hash: Vec<u8>, // parent principal (rétrocompatible)
pub parent_hashes: Vec<Vec<u8>>, // parents supplémentaires pour DAG
// ...
}

Détection de conflits

Le ConflictDetector identifie :

  • Conflits de double dépense : Même UTXO référencé dans plusieurs branches
  • Conflits d'état : Transitions d'état conflictuelles
  • Détection de fourches : Plusieurs blocs à la même hauteur de proposeurs différents

Résolution des conflits

Lorsque des conflits sont détectés :

  1. Choisir la branche avec le score PoU cumulatif le plus élevé
  2. Annuler les transactions conflictuelles
  3. Réappliquer les transactions non conflictuelles de la branche perdante

Consensus tenant compte des groupes

Formation des groupes

Les masternodes organisent les lightnodes en groupes :

  1. Trier les lightnodes par score PoU
  2. Affecter aux groupes de group_size (3 en dev, 7 en prod)
  3. Publier les affectations de groupes via gossipsub
  4. Identifiants de groupe déterministes basés sur l'époque (pas l'heure réelle)

Élection intra-groupe

Au sein de chaque groupe :

  1. Les membres partagent leurs scores PoU
  2. Le score PoU le plus élevé devient proposeur (tiebreaker par peer_id)
  3. Minimum (total+1)/2 candidats requis
  4. Après 3 échecs ou plus : relâchement à un minimum de 2 candidats

Acceptation de bloc

  1. Le proposeur de groupe produit un bloc
  2. Les membres du groupe vérifient et signent
  3. BAC produit avec 2f+1 signatures
  4. Les masternodes vérifient le BAC et finalisent

Mécanismes de récupération

Récupération d'élection

MécanismeDéclencheurAction
Minuteur chien de gardeAucun bloc pendant 60sRedéclenchement PoU + élection
Relaxation progressive3 échecs ou plusRéduction du quorum à 2
Rotation du proposeur50 blocsCession, réélection
Réélection immédiateRéinitialisation du groupeLancement de la tâche PoU + élection

Récupération des pairs

MécanismeDéclencheurAction
Maintien en vie GossipsubIntervalle de 60sPublication du score PoU
Chien de garde de maillageAucun maillage pendant 60sRecomposition des pairs du groupe
Déconnexion SlowPeerFile saturéeDéconnexion et reconnexion
Réinitialisation de nonceLocal > stockage + 200Réinitialisation au nonce de stockage

Récupération de groupe

Lors de la réinitialisation d'un groupe :

  1. Les scores PoU sont conservés pour les membres continuant
  2. Les nouveaux membres démarrent avec des scores par défaut
  3. L'indicateur intra_group_started est réinitialisé
  4. Lancement immédiat de PoU + élection (sans attendre les minuteurs périodiques)

Pénalités (Production)

InfractionPénalitéDélai de récupération
Double vote50 % de miseN/A
Temps d'arrêt10 % de miseProgressif
Proposition invalide25 % de miseN/A

Les pénalités sont désactivées sur le devnet, activées sur le mainnet (config/production.toml).

Configuration du consensus

ParamètreDéveloppementProduction
Délai d'expiration15s10s
Rounds maximum510
Seuil de quorum0,670,67
Optimisations BFTDésactivéesActivées
PénalitésDésactivéesActivées
Temps de bloc2s5s
Taille du groupe37