Détails du « fork de Noël » (nœuds <= 1.6.23)


#1

Voici le détail du bug ayant provoqué le fork du 24/12/2018.

Le fait technique

Un membre ayant rejoint la Ğ1 au même moment que le DU a, en dépensant sa production de Ğ1, séparé le réseau en deux : ceux considérant que sa production de Ğ1 était légitime, et ceux considérant que non.

La cause

Ce bug n’est pas nouveau puisqu’il s’est déjà produit le 26/05/2018 de façon similaire : à cette époque les nœuds étaient majoritairement en dernière version (1.6.21 … 1.6.23) et celle-ci, lors de la synchro, implémentait la règle “un membre lors du DU = 1 DU” tandis que les autres nœuds disaient “= 0 DU”. Du coup à la moindre dépense de ces DU, le réseau se coupait en deux : ceux d’accord avec la dépense, et les autres.

Ce bug a donc été corrigé en version 1.6.24, et tout était rentré dans l’ordre.

Ou presque. :frowning:

Et l’oubli

Le problème, c’est que ces nœuds 1.6.21 … 1.6.23 implémentaient bien la règle “un membre lors du DU = 1 DU” durant la synchro, mais pas lors de leur fonctionnement « normal » en rythme de croisière (ce qui soit dit en passant, était totalement incohérent, un vrai bug). La version corrective 1.6.24 ne s’y est d’ailleurs pas trompée, puisque cette règle “= 1 DU” a été totalement adoptée dans le protocole à la fois lors de la synchro et de la croisière.

Mais donc pour les nœuds en version 1.6.21 … 1.6.23, les nœuds non mis à jour en 1.6.24, dès que cet événement où un membre est arrivé simultanément au DU s’est produit, la bombe à retardement s’y est installée ! Ce qui s’est produit à trois reprises :

  • au bloc#133533, le 03/07/2018 à 11h00m27s GMT
  • au bloc#157453, le 27/09/2018 à 11h00m27s GMT (une vraie horloge Duniter ! à la seconde près ! :smiley: )
  • au bloc#177604, le 09/12/2018 à 11h05m45s GMT

Vous le déduisez certainement : la bombe qui a explosé, c’est la dernière (sinon le réseau aurait été secoué plus tôt bien entendu). C’est donc le membre arrivé au bloc#177604 qui a dépensé son DU d’arrivée la veille de Noël qui a tout déclenché sans s’en rendre compte. :slight_smile:

Notez que cet événement “un membre arrive en même temps que le DU” est un fait assez rare depuis le début de la Ğ1, puisqu’il ne s’est produit que 7 fois sur les 1500 entrées de membres que compte la monnaie à ce jour (~0,47% des membres).

Quelle solution pour remédier définitivement au problème ?

Pour y remédier totalement, il aurait fallu que tous les nœuds 1.6.21 … 1.6.23 aient été mis à jour en version 1.6.24 et qu’ils aient, au choix :

  • resynchronisé totalement la blockchain avec cette version (ou supérieure)
  • été mis à jour en 1.6.24 avant le bloc#133533, où la première “bombe de croisière” s’est installée

Tous ceux qui n’ont pas pu respecter cette condition ont vu leur nœud forker au 24/12/2018.


Historique des difficultés techniques recontrés par la Ğ1
#2

C’est toujours un plaisir de lire les analyses de fork !

Merci @cgeek pour les explications détaillées ^^


#3

J’aime bien les raconter ^^