Je poursuis actuellement l’audit de Duniter v2 en urgence, étant donné que la migration définitive a déjà été annoncée pour dans une dizaine de jours. Ce soir, j’ai identifié un nouveau problème.
Dans l’état actuel du genesis, aucune certification forgeron ne pourra être émise après le bloc genesis.
Conséquence directe : aucun nouveau forgeron ne pourra jamais entrer dans la toile des forgerons.
Explication du bug
Voici ce qui se passe techniquement :
- Lors de la génération du genesis, les 15 smiths initiaux sont organisés en « clique » : chacun certifie tous les autres.
- Cela signifie que chaque smith reçoit 14 certifications (une de chacun des 14 autres).
Le problème vient d’une règle appelée SmithMaxByIssuer :
- Cette règle limite le nombre maximum de certifications qu’un smith peut émettre.
- Or, la construction du genesis ne vérifie pas cette limite (elle interdit seulement l’auto-certification).
- En revanche, dès le bloc 1, l’appel runtime
certify_smithapplique strictement la conditionissued_certs < SmithMaxByIssuer
Résultat :
Les forgerons du genesis ont déjà dépassé la limite autorisée (SmithMaxByIssuer = 12)
Donc à partir du bloc 1, ils ne peuvent plus émettre la moindre certification supplémentaire.
Aucune nouvelle certification possible.
Aucun nouveau smith ne pourra être ajouté.
Le système est verrouillé dès le départ.
Solutions envisagées
Mon plan initial (il y a 8 mois)
Mon idée à l’époque n’était pas de générer automatiquement une clique complète, mais de construire manuellement une toile initiale de forgerons, où chacun déclarerait explicitement qui il souhaite certifier.
La trace de cette intention est visible ici :
Malheureusement, j’ai eu des problèmes de santé peu après, ce qui m’a empêché de mettre ce processus en place. Aujourd’hui, avec la migration imminente, nous n’avons plus le temps d’implémenter une telle procédure proprement.
Proposition alternative (rapide et pragmatique)
Modifier l’algorithme de génération des données de genesis :
Au lieu que chaque forgeron reçoive 14 certifications (une de chacun des autres), chaque forgeron recevrait seulement 3 certifications réparties au hasard.
Cela permettrait :
- De respecter la limite SmithMaxByIssuer
- De laisser de la capacité d’émission de certifications après le bloc 0
- D’éviter le blocage définitif du système
- De corriger le problème sans refonte complète du process de genesis
Issue gitlab: g1 Genesis State Prevents New Smiths After Genesis (#348) · Issues · nodes / rust / Duniter v2S · GitLab