Tu aboutis grosso-modo à un algorithme de vote tel que je l’avais imaginé à mes débuts de uCoin, en bien plus avancé toutefois je dois bien l’avouer
Alors avant de discuter de cet algo, je voudrais juste rappeler les points les plus essentiels auxquels j’ai dû faire face à cette époque dans le cadre d’une chaîne de blocs et qui m’ont fait sélectionner la preuve de travail :
- sélectionner l’instant d’écriture : c’est être capable de se mettre d’accord sur le moment physique où un nouveau bloc doit être ajouté.
Première difficulté : il est tout sauf évident de se mettre d’accord sur l’heure courante : car au-delà de toute considération de physique relativiste (on suppose ici un fonctionnement sur référentiel galiléen), toutes les machines n’ont pas précisément la même horloge à la seconde près, parfois on a carrément des minutes de décalage (je constate régulièrement 1 minute de décalage entre 2 smartphones pourtant identiques).
Alors comment se mettre d’accord sur le fait qu’il faut émettre un bloc toutes les 5 minutes, si déjà soi-même on a très certainement des décalages de 1, 2 ou 3 minutes avec de nombreux nœuds ?
- sélectionner qui parle : déjà il faut définir qui est ce « qui », c’est-à-dire l’ensemble des éléments qui ont le droit de causer (cela n’a rien d’évident : sont-ce juste ceux que je vois sur le réseau, ou est-ce plus large ?), et ensuite parmi ceux-là il faut gérer les nombreux cas qui peuvent se produire pour chacun : est-ce que tout cet ensemble a parlé ? que se passe-t-il si un élément a dit plusieurs choses à la fois ? que faire s’il est à la bourre pour parler, alors qu’il était le plus légitime ? et qu’arrive-t-il si un élément encore plus légitime arrive quelques secondes plus tard ? quelques secondes plus tard par rapport à l’horloge de qui ? et en cas d’égalité ? et en cas d’un mec à la bourre qui arrive juste après le calcul de l’égalité ?
Alors voilà, je crois que ce sont les 2 problèmes à résoudre. Tout le reste est du détail.
Duniter solutionne ces problèmes de façon extrêmement efficace car grâce à la preuve de travail, car il n’y a le plus souvent qu’un seul point de l’espace-temps qui agit : c’est celui qui a trouvé une preuve valide. Et donc :
- sélectionner l’instant d’écriture : l’instant est sélectionné de fait lorsqu’un bloc valide arrive
- sélectionner qui parle : l’élément est sélectionné de fait lorsqu’un bloc valide arrive
Le bloc venant de la preuve de travail est une sorte de sémaphore spatio-temporelle. Vous ne vous rendez peut-être pas compte, mais c’est un truc vraiment très, très, TRÈS fort ! Et ce n’est pas moi qui l’ai inventé, hein ! Bitcoin m’a révélé cela.
Alors face à cette problématique, les points qui me paraissent vraiment délicats dans la PoP (Proof of Patience) sont :
- l’assurance que les nœuds ont bien, à quelques secondes près, la même heure pour sélectionner l’instant d’écriture
- l’assurance que tout nœud voit bien l’ensemble des participants pour l’écriture du prochain bloc (que faire s’il en manque 1 par exemple ? que faire si finalement il se pointe ?)
Je ne dis pas que c’est mission impossible, mais ça me paraît franchement coton.