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 |
|---|---|---|
| 3 | 0 | 2 |
| 5 | 1 | 4 |
| 7 | 2 | 5 |
| 10 | 3 | 7 |
| 15 | 4 | 11 |
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 :
- Choisir la branche avec le score PoU cumulatif le plus élevé
- Annuler les transactions conflictuelles
- 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 :
- Trier les lightnodes par score PoU
- Affecter aux groupes de
group_size(3 en dev, 7 en prod) - Publier les affectations de groupes via gossipsub
- Identifiants de groupe déterministes basés sur l'époque (pas l'heure réelle)
Élection intra-groupe
Au sein de chaque groupe :
- Les membres partagent leurs scores PoU
- Le score PoU le plus élevé devient proposeur (tiebreaker par peer_id)
- Minimum
(total+1)/2candidats requis - Après 3 échecs ou plus : relâchement à un minimum de 2 candidats
Acceptation de bloc
- Le proposeur de groupe produit un bloc
- Les membres du groupe vérifient et signent
- BAC produit avec 2f+1 signatures
- Les masternodes vérifient le BAC et finalisent
Mécanismes de récupération
Récupération d'élection
| Mécanisme | Déclencheur | Action |
|---|---|---|
| Minuteur chien de garde | Aucun bloc pendant 60s | Redéclenchement PoU + élection |
| Relaxation progressive | 3 échecs ou plus | Réduction du quorum à 2 |
| Rotation du proposeur | 50 blocs | Cession, réélection |
| Réélection immédiate | Réinitialisation du groupe | Lancement de la tâche PoU + élection |
Récupération des pairs
| Mécanisme | Déclencheur | Action |
|---|---|---|
| Maintien en vie Gossipsub | Intervalle de 60s | Publication du score PoU |
| Chien de garde de maillage | Aucun maillage pendant 60s | Recomposition des pairs du groupe |
| Déconnexion SlowPeer | File saturée | Déconnexion et reconnexion |
| Réinitialisation de nonce | Local > stockage + 200 | Réinitialisation au nonce de stockage |
Récupération de groupe
Lors de la réinitialisation d'un groupe :
- Les scores PoU sont conservés pour les membres continuant
- Les nouveaux membres démarrent avec des scores par défaut
- L'indicateur
intra_group_startedest réinitialisé - Lancement immédiat de PoU + élection (sans attendre les minuteurs périodiques)
Pénalités (Production)
| Infraction | Pénalité | Délai de récupération |
|---|---|---|
| Double vote | 50 % de mise | N/A |
| Temps d'arrêt | 10 % de mise | Progressif |
| Proposition invalide | 25 % de mise | N/A |
Les pénalités sont désactivées sur le devnet, activées sur le mainnet (config/production.toml).
Configuration du consensus
| Paramètre | Développement | Production |
|---|---|---|
| Délai d'expiration | 15s | 10s |
| Rounds maximum | 5 | 10 |
| Seuil de quorum | 0,67 | 0,67 |
| Optimisations BFT | Désactivées | Activées |
| Pénalités | Désactivées | Activées |
| Temps de bloc | 2s | 5s |
| Taille du groupe | 3 | 7 |