Comment la « blockchain » se constitue-t-elle ?


La « blockchain » c’est le journal des transactions Bitcoin. Ce registre est formé d’une suite de chapitres (blocs) qui s’enchaînent, chacun regroupant les transactions effectuées dans une certaine période.

Gérard Dréan explique ainsi la formation de cette chaîne de blocs :

« La blockchain est un ensemble de blocs, protégés contre toute modification, dont chacun contient l’identificateur de son prédécesseur […]. Elle peut avoir la forme d’un arbre doté de plusieurs branches. La plus longue de ces branches, appelée branche principale, est identifiée par l’identificateur de son bloc terminal. À partir de cet identificateur, il est possible de remonter cette branche principale jusqu’au bloc d’origine « Genesis », créé par « Satoshi Nakamoto » le 3 janvier 2009, et de retrouver ainsi toutes les transactions enregistrées depuis.

Chaque nœud du réseau reçoit en permanence toutes sortes de messages, dont certains proposent de nouveaux blocs à ajouter à la blockchain. Un principe de sécurité fondamental est de faire l’hypothèse que les autres nœuds du système peuvent être défectueux ou frauduleux. Chaque nœud doit donc considérer tout ce qu’il reçoit des autres nœuds comme suspect par principe, en déterminer lui-même la nature et le valider de façon indépendante avant de l’utiliser.

Si un message contient un bloc, celui-ci est soumis à un protocole qui l’ajoutera ou non à la blockchain locale, et dont la complexité tient à ce qu’il doit traiter tous les cas particuliers, même ceux qui semblent a priori les plus improbables.

Outre des transactions, chaque bloc contient une somme de contrôle (« hash ») qui le protège contre les modifications, et lui sert également d’identificateur. Il contient également l’identificateur du bloc qui le précède dans la blockchain du mineur qui l’a créé, ainsi qu’une mesure de la quantité de travail qui a été utilisée pour le produire. La première étape consiste donc à éliminer le nouveau bloc s’il est mal formé (syntaxe incorrecte) ou s’il a déjà été reçu, et donc a déjà été traité.

Un objectif fondamental du protocole de construction de la blockchain est que tous ses exemplaires soient identiques, bien que construits indépendamment. Il vise donc à obtenir un consensus sur une même version du journal des transactions pour tous les ordinateurs du réseau. Le principe retenu est de choisir, parmi les versions possibles de la blockchain, celle dont la construction a demandé la plus grande somme de travail, ce qui vise notamment à dissuader les fraudeurs éventuels en exigeant d’eux un travail supérieur à celui des nœuds « honnêtes ».

Si le nouvel arrivant est conservé, la suite dépend du bloc qu’il indique comme son prédécesseur. Si celui-ci n’est pas indiqué, le nouveau bloc est conservé parmi les blocs « orphelins ». S’il est indiqué mais n’existe pas dans la blockchain locale, le nouveau bloc est également rangé parmi les blocs « orphelins », mais de plus son prédécesseur est réclamé aux nœuds voisins. Cette étape permet par exemple la reconstitution de la blockchain d’un nœud qui a été arrêté pendant un certain temps. Dans les deux cas, le programme se remet en attente d’un nouveau bloc. En effet, tous les blocs reçus sont traités de la même façon quelle que soit leur origine.

Si le prédécesseur indiqué est l’extrémité actuelle de la branche principale, le programme tente d’y ajouter le nouveau bloc. Pour cela, il vérifie que chaque transaction du bloc est valide syntaxiquement, n’est pas déjà présente dans la blockchain et satisfait la condition de validité indiquée par son code « version » . Dès qu’une transaction est invalide, le processus est abandonné. Sinon, l’identificateur du nouveau bloc remplace l’identificateur de l’extrémité de la blockchain, toutes les transactions de ce bloc sont éliminées du pool des transactions en attente et ce bloc est envoyé aux nœuds voisins, qui exécuteront le même processus.

Si le prédécesseur indiqué est un autre bloc que le bloc terminal de la blockchain courante, deux cas peuvent se présenter selon que la séquence de blocs qui aboutit au nouveau bloc a demandé plus ou moins de travail que la branche principale actuelle. Si elle a demandé moins de travail, la blockchain courante n’est pas modifiée, et le nouveau bloc est simplement conservé en mémoire, formant l’amorce d’une branche secondaire. Si cette nouvelle branche a demandé plus de travail, c’est elle qui doit devenir la blockchain de référence. Pour cela, le programme remonte à la bifurcation, et à partir de là, essaie d’ajouter successivement chacun des blocs de la nouvelle branche qui ont été mis en attente sans être validés, en vérifiant comme ci-dessus la validité et la légitimité des transactions qu’il contient.

S’il y parvient sans rencontrer de bloc ou de transaction illégitime, il met à jour le pool des transactions en attente (en en retirant les transactions qui sont maintenant dans la nouvelle branche principale et en y remettant celles qui étaient dans l’ancienne branche principale et ne sont pas dans la nouvelle), il remplace l’identificateur de l’extrémité de la blockchain et diffuse le bloc aux nœuds voisins. Sinon, il laisse la blockchain en l’état, tout en conservant le nouveau bloc en attente comme précédemment.

Enfin, si le nouveau bloc est indiqué par un ou plusieurs blocs orphelins comme leur prédécesseur, le protocole tente de rattacher à travers lui les blocs orphelins à la blockchain en lui appliquant de façon récursive le protocole ci-dessus.

Le protocole en fonctionnement normal

En fonctionnement normal, la blockchain est identique sur tous les nœuds, et le nouveau bloc désigne comme prédécesseur le bloc terminal de la blockchain existante. Chaque nœud va donc ajouter à l’extrémité de sa branche principale le premier bloc valide qu’il reçoit. Or les mineurs travaillent en parallèle et il n’existe pas de règle générale concernant la sélection des transactions à incorporer dans un bloc. À partir d’un même pool de transactions brutes, les mineurs peuvent donc proposer des blocs différents, que chaque nœud va continuer à recevoir après celui qu’il a ajouté à son exemplaire de la blockchain, qui désigneront le même prédécesseur et contiendront en partie les mêmes transactions. Il les conservera donc sans les vérifier, en en faisant l’amorce de branches latérales secondaires.

Si tous les nœuds du réseau reçoivent les blocs des mineurs dans le même ordre, la blockchain reste la même sur tous les noeuds, bien que chacun en ait construit sa propre version indépendamment. Mais il peut arriver que deux ou plusieurs mineurs émettent des blocs différents en un temps inférieur au temps de propagation des blocs dans le réseau. Ces blocs arrivent alors dans un ordre différent selon les nœuds récepteurs, qui retiendront chacun dans sa branche principale le premier arrivé, les blocs suivants étant greffés tel quel sur le côté. Les nœuds se séparent alors en deux populations (voire plus) et il y a bifurcation (« fork ») de la blockchain. En particulier, les mineurs de chaque population travaillent maintenant à partir de blockchains différentes.

Cette situation est généralement résolue par les blocs suivants. En effet, la situation qui a donné naissance à cette bifurcation est très improbable, et il est de moins en moins probable qu’elle se renouvelle à l’étape suivante. Il arrivera un moment où le premier bloc reçu sera le même pour tous, et l’application du protocole décrit ci-dessus fera que lui et ses prédécesseurs deviendront alors la branche principale pour tous. À ce moment, des transactions qui figuraient dans l’ancienne branche principale, et qui ont donc été considérées comme définitives, peuvent ne plus figurer dans la nouvelle. C’est pourquoi il est recommandé de ne considérer une transaction comme définitive que si le bloc dans lequel elle figure est à une certaine distance du bloc courant (6 blocs pour les transactions normales importantes, 100 pour les transactions de « minage » créatrices de nouveaux bitcoins).

Les cas de fraude

Normalement tous les acteurs de ce processus ont le même objectif : assurer le bon fonctionnement du système. Mais n’importe qui peut librement émettre des transactions, devenir mineur ou nœud du système, y compris avec l’intention de nuire ou avec des versions non standard des logiciels. Aucun participant ne peut donc écarter l’hypothèse que ce qu’il reçoit est erroné voire carrément frauduleux ou dangereux, et chacun doit en vérifier la validité à toutes les étapes. Les transactions ou les blocs erronés ou frauduleux n’ont pratiquement aucune chance d’échapper à ces contrôles et de parvenir jusqu’à la blockchain, et le fraudeur se retrouve très vite isolé.

Un nœud peut créer des transactions frauduleuses. Mais la seule façon possible de les introduire dans les multiples exemplaires de la blockchain est de les incorporer dans un bloc et de soumettre ce nouveau bloc aux autres nœuds du réseau par la voie normale. En l’absence de modifications tout aussi frauduleuses dans les protocoles de construction des blocs et dans les processus de validation des transactions, ces transactions ne seront pas validées et incorporées dans des blocs légitimes, ni acceptées par les autres nœuds. Les blockchains des nœuds « honnêtes » ne seront donc pas affectées et la fraude sera sans conséquences autres que locales au nœud fraudeur.

Pour modifier un bloc existant dans le registre, la seule façon est de créer un nouveau bloc contenant éventuellement une partie des transactions de l’ancien, et de tenter de le greffer à sa place. Ce nouveau bloc sera bien greffé (sans vérification) à côté du bloc qu’il cherche à remplacer, mais la branche principale restera inchangée.

Pour qu’il devienne partie de la branche principale, il faudrait lui greffer de nouveaux blocs plus vite qu’à la vraie branche principale pour que cette nouvelle branche finisse par la dépasser. Or, pendant ce temps, le reste du réseau continue à allonger la branche principale. Chacun des nouveaux blocs devant être recalculé ex nihilo y compris sa somme de contrôle, il faudrait que le(s) fraudeur(s) mobilise(nt) une puissance totale de validation supérieure à celle de tout le reste du réseau. De plus, chacun de ces blocs, ainsi que la validité et la légitimité des transactions qu’il contient, seraient vérifiés par rapport à la partie de la blockchain située en amont de la bifurcation. On voit mal quelles modifications frauduleuses pourraient échapper à ces contrôles, sachant de plus que toutes les transactions doivent obligatoirement être signées cryptographiquement par l’utilisateur débité.

Au final, même si un fraudeur parvenait à introduire des modifications de ce type dans certains nœuds, il créerait ainsi un petit groupe d’utilisateurs isolés du reste du réseau et qui ne pourraient échanger qu’entre eux, ce dont on voit mal l’intérêt. Le reste du réseau ne serait pas affecté. De plus, la manœuvre serait forcément visible, d’autant plus que le bloc remplacé est plus ancien, puisqu’elle consisterait en la création anormalement rapide de blocs venant se greffer en amont de l’extrémité courante. Le fraudeur aurait toutes chances d’être éliminé, et les blockchains atteintes seraient réparées à partir de celles qui sont restées intactes.

Source : contrepoints.org