La preuve de travail est actuellement la méthode la plus éprouvée et la plus efficace pour obtenir un consensus entre plusieurs machines ayant toutes les même droits d’écriture, ce qui permet donc la création de systèmes non-pyramidaux (nommés aussi holomidaux).
Mais la preuve de travail à aussi de nombreux inconvénients, dont la course au calcul que nous contournons dans Duniter grâce a un système de difficulté personnalisée. Difficulté personnalisée indispensable sans laquelle un membre propriétaire d’une très grosse ferme de calcul pourrait prendre le contrôle total de la blockchain et donc de la monnaie.
Cependant nous disposons d’un outil incroyable que les autres projets avec blockchain n’ont pas : une toile de confiance intégrée. Et il me semble que grâce a cette toile de confiance nous pourrions créer un protocole de synchronisation des données sans preuve de travail.
C’est en réfléchissant sur le projets de nouvelle API WS2P hier que m’est venu c’est idée folle, sauf que plus je l’analyse plus elle me semble applicable :
Le besoin c’est d’avoir un processus déterministe qui fixera qui sera l’écrivain du prochain block, afin que tout les noeuds du réseau suivant ce même processus soit forcément d’accord entre eux, et donc synchronisés.
Voici l’idée d’algorithme qui m’est venu :
C’est un algorithme pour lequel chaque nœud membre aurait 2 types de HEAD : le HEAD de sa chaîne locale et le HEADp d’un bloc pending qu’il soumet au réseau.
Chaque nœud chercherai d’abord a se construire une vision complété du réseau (possible a seulement 3 degrés de profondeur d’après les discutions sur le thread WS2P), puis lorsqu’il a connaissance de l’ensemble des HEADp soumis au réseau il en sélectionnerai 1 et un seul selon le processus déterministe suivant :
Si tout les HEADp correspondent a des membres ayant déjà écrit au moins 1 bloc :
choisir le HEADp du membre dont le numéro du dernier bloc écrit est le plus faible
Sinon
Sélectionner parmi les membres n’ayant jamais écrit de block ceux dont la date d’entrée dans la toile est la plus récente et choisir parmi ces membres celui dont la clé publique est la plus “petite” dans l’ordre alphabétique.
Si le membre sélectionné a soumis plusieurs HEADp différents, choisir celui dont le hash est le plus “petit” dans l’ordre alphabétique.
Vérifier la validité du block correspondant au HEADp finalement retenu. Et s’il n’est pas valide tester avec le 2ème HEADp puis le 3ème (donc il faudrait stocker par exemple les 5 ou 10 HEADp les mieux classés)
L’atout majeur de cet algo c’est que pour un groupe de HEADp donné on en arrive toujours a la même conclusion.
Et donc en cas de fork, le noeud duniter peut lorsqu’il détecte un autre branche dont le HEAD est mieux classé que le sien selon cet algo, switcher automatiquement sur cette branche là, et donc naturellement tout les noeuds swithceront sur la même branche.
Plus besoin de critère comme le nombre de blocks d’avance ou quoi, c’est sur le contenu de la branche elle même que la sélection se ferai
L’idée c’est qu’au lieu de passer 5 min a calculer, les noeuds qui estiment avoir une chance d’être sélectionnes soumettrais tous leur HEADp au réseau (qui correspondrait au numéro-hash d’un block au meme format qu’actuellement sans le champ nonce, donc générer sans délai).
Puis les nœuds qui n’ont pas de soumis de HEADp sectionnerait parmis les HEADp qu’il ont reçu le mieux classé, vérifierai la validité du block correspondant, et s’il est valide propagerai ce seul HEADp (inutile de faire rebondir les HEADp moins bien classés ils flood le réseau pour rien).
Et si aucun HEADp n’est soumis car tout les nœuds actifs estiment avoir écrit récemment, il pourrait au bout d’une certaine durée sans recevoir de HEADp (par exemple 4min) décider de baisser la limite et donc de soumettre le leur.
Il reste un problème de spam a gérer :
Un même membre pourrait soumettre plein de HEADp différents a différent nœud du réseau pour empêcher la monnaie de fonctionner, il faut donc que tout les HEADp soumis soit systématiquement signés par le nœud membre qui le soumet ce qui permettrait d’avoir une preuve incontestable du nombre de HEADp différents soumis par un même membre.
Le protocole pourrait alors fixer que si un nœud récolte plus de 10 HEADp différents d’un même membre il écrit cette preuve en blockchain et l’écriture de cette preuve entraînerai de facto l’exclusion du membre concerné pour 500 blocs. (Les valeurs 10 et 500 sont adaptables, ce sont des paramètres libres a choisir).
Il y aussi la gestion du temps : afin de garder un temps régulier entre deux block l’on pourrai imposer qu’un nouveau HEADp ne peut être soumis que s’il fait avancer medianTime d’au moins 4 ou 5 min, ce que laisserai des trou ou le réseau serait inactif dans ce domaine et ou la charge serait assignée a la gestion des requêtes de l’API publique (BMA puis future api client?) ainsi qu’a la résolution des fork, (tien ce nœud est sur une autre branche et le point de bifurcation correspond a un bloc plus prioritaire que le mien d’après l’algo si-dessus → je switch sur sa branche).
Pour éviter des rolling back trop long (genre dépiler 300 blocs…) il faudrait que les nœuds duniter légitimes (cad qui ne contiennent pas de code modifié) se refuse a empiler un block supplémentaire tant qu’il ne se sont pas fait remonter la vision du réseau à profondeur 3 selon le process décrit par cgeek pour l’api WS2P.
Et pour les nœuds miroirs ils pourraient décider de ne pas empiler de bloc supplémentaire tant qu’il n’ont pas reçu les HEAD de tout les blocs membres qu’il connaissent et qui sont UP ou l’ont été dans les 5 dernières minutes.
Il y a sans doute d’autres petits problèmes techniques d’implémentation mais là n’est pas la question pour le moment, la question est de savoir est ce que j’ai louper un point théorique fondamental qui fait que ça ne peut pas fonctionner ? Et si oui merci de m’expliquer en détail lequel, par ce que j’y est réfléchi toute la nuit en franchement je ne voit rien qui soit insurmontable.
Si je ne me trompe pas, alors cela signifierai que nous pourrions avoir un consensus absolu dans un réseau duniter sans qu’il n’y est aucun centre ni aucune preuve de travail, ce qui serait considérablement plus écologique, et permettrait a de simples téléphones d’être des nœuds du réseau !
Peut-être qu’il existe déjà des concepts similaires mais je n’ai rien trouver de semblable sur internet, je pense qu’il y a deux barrières fondamentales qui empêchent les gens qui réfléchissent a ces sujets d’avoir cette idée :
- Ils n’ont pas de toile confiance intégré et ne projette pas d’en mettre en place.
- Ils restent bloqués dans la croyance que l’écriture d’un block doit être accompagnée d’une “récompense” ou/et d’une “création de monnaie”.
Si’l faut donner un nom a cet algo, je proposerai Preuve de Patience (PoP), car c’est le membre le plus patient (celui qui n’a pas écrit depuis le plus longtemps) qui est retenu.