Pour une poignée de bitcoins : la validation des transactions sur une blockchain… (1/2)

Note : Cet article est très théorique et donc assez long. Cependant il vous permettra de comprendre le protocole de validation des transactions sur une blockchain, ce qui est absolument indispensable si vous vous intéressez au sujet et souhaitez comprendre tous les débats actuels en lien avec les cryptomonnaies et la blockchain.

Il y a une chose que nous avons volontairement omis dans notre premier article de vulgarisation sur la blockchain : cette technologie est en réalité un réseau Peer-to-Peer apportant une solution au “problème des généraux byzantins”.

Concrètement : comment être sûr que l’information transmise est vraie, sans nécessairement faire confiance à celui qui la transmet ?

On s’intéresse donc aujourd’hui au procédé technique qui permet de certifier la validité d’une transaction (que ce soit un échange de monnaie, de données, d’informations…) et de les enregistrer sans passer par un tiers de confiance, puisque c’est le principe même de la blockchain.

Introduction : la fonction de Hachage

Cette introduction sera courte mais essentielle pour comprendre le déroulement d’une transaction.

Une fonction de hachage cryptographique (Hash function en anglais) est une fonction qui, à une donnée de taille arbitraire, associe une image de taille fixe, et dont une propriété essentielle est qu’elle est pratiquement impossible à inverser, c’est-à-dire que si l’image d’une donnée par la fonction se calcule très efficacement, le calcul inverse d’une donnée d’entrée ayant pour image une certaine valeur se révèle impossible sur le plan pratique. Pour cette raison, on dit d’une telle fonction qu’elle est à sens unique. (Wikipédia)

Si la donnée entrée change d’un caractère, alors l’image est totalement différente.

On renseignera les différentes étapes de la “validation” d’une transaction et nous expliquerons pourquoi ces étapes sont nécessaires.

Supposons que A veuille transférer une certaine somme de monnaie cryptographique nommée Futurscoin à B.

L’émission de la transaction

  • A initie une transaction vers B, en certifiant son identité grâce à un système de signature numérique. La transaction acquiert aussi une empreinte numérique qui lui est propre.
Ce système de signature numérique permet de vérifier que personne n’usurpe l’identité de A pour lancer une transaction en son nom.
Cette signature numérique est basée sur une méthode cryptographique nommée ECDSA (en savoir plus ici).
  • B vérifie que c’est bien A qui a envoyé le message grâce à cette même signature, et demande au réseau (à ce que l’on appelle des pairs choisis aléatoirement) si la transaction initiée par A est bien valide.
Les pairs vérifient que les Futurscoins que souhaite dépenser A viennent d’une transaction antérieure enregistrée dans la blockchain, et qu’ils n’ont pas déjà été ré-utilisés pour une autre transaction.

La transaction devient alors “éligible” (ou valide) et rentre dans ce qu’on appelle “pending pool”, ie une liste de transactions en attente d’être enregistrées dans un bloc.

Grâce au système de “Merkle Tree” (en savoir plus ici), il est impossible de modifier une transaction dans cette liste sans que ce soit détecté directement par tous les noeuds.

Cette liste de transactions en attente est diffusée dans tout le réseau. Ainsi chaque noeud du réseau possède une liste locale de transactions en attente.

La constitution d’un bloc

Un bloc est constitué d’un en-tête et de la liste de transactions (le merkle root) qu’il contient (entre autres). Dans l’en-tête, plusieurs informations sont renseignées : la version du bloc (les règles qui le définissent), l’identifiant (ou Hash) du bloc précédent, la date et la difficulté de réaliser la preuve de travail.

C’est ici que l’on voit apparaître le concept de “chaîne” : l’identifiant d’un bloc dépend de celui du bloc précédent. Ainsi, si un élément d’un bloc et modifié, il faudra le re-valider ce qui modifiera son ID : il faudra ainsi re-valider tous les blocs suivant car ils dépendent tous de cet ID. C’est pour cela que l’on dit qu’il est impossible de modifier ce qui est sur la blockchain.

Le bloc est validé et ajouté à la blockchain seulement si il est associé à une preuve de travail.

On parle de preuve de travail là, mais qu’est-ce que c’est et à quoi ça sert ?

La validation d’un bloc

Un noeud voulant ajouter un bloc à la chaîne sélectionne donc une partie de sa liste de transactions en attente locale pour l’incorporer dans un bloc.

Il existe en revanche une limite : on ne peut pas intégrer un nombre infini de transactions dans un bloc.

La définition de cette limite varie selon les blockchains. Par exemple, sur la blockchain Bitcoin, la taille d’un bloc est limitée à 1 Mo. (24/07/2017)

Chaque noeud peut donc obtenir un bloc différent mais un seul parviendra à valider son bloc : celui qui apportera sa preuve de travail en premier.

Une fois qu’il a son bloc, il ne peut pas le valider (l’envoyer sur la blockchain) en un claquement de doigts…

Si tel était le cas, le nombre de blocs à ajouter en même temps serait bien trop élevé : on ne peut ajouter qu’un bloc à la fois.

Il faut par ailleurs que les mineurs s’accordent sur le bloc à ajouter.

C’est donc le noeud qui fournira une preuve de travail en premier qui validera son bloc.

Cette preuve de travail, c’est la résolution d’une équation très compliquée.

Not really…

Il résout donc une équation complexe comprenant plusieurs variables dont l’identifiant du bloc précédent et l’identifiant de la liste de transaction comprise dans le bloc.

Le seul moyen de la résoudre est de tester comme un bourrin les différentes possibilités jusqu’à tomber sur une solution. Il utilise donc une partie de sa puissance de calcul informatique pour réaliser cette tâche.

Au début, il était seulement possible de “miner” avec un processeur. Il est maintenant possible de le faire avec des cartes graphiques, ce qui s’avère être plus économique/écologique et surtout rentable.

C’est donc un problème difficile à résoudre mais il est simple de vérifier que la solution donnée est bonne : il suffit de vérifier que l’égalité est vérifiée en remplaçant l’inconnue par la solution proposée.

Détails techniques : Vous aimez les maths ? Tant mieux !
C’est en réalité une équation de la forme f(H,T,N)<b avec f une fonction de hashage, H l’identifiant du bloc précédent (son hash), T un hash de la liste de transactions, et N une inconnue : le nonce. Le seul moyen de résoudre cette équation est de tester les différentes possibilités une à une pour N jusqu’à ce qu’on tombe sur une qui marche (et oui souvenez-vous, les fonctions de hachage sont à sens unique ! Même en sachant b, il est impossible de retrouver N directement). Le nonce apparaîtra dans l’en-tête du bloc : c’est la preuve de travail.
b représente ici la difficulté !
Cette dernière s’ajuste en fonction des capacités du réseau pour qu’il y ait toujours un bloc codé à intervalle de temps régulier.

L’identifiant (ou hash) du bloc sera donc f(H,T,N), avec N une solution valide.

Lorsqu’un noeud trouve la solution, il la communique à l’ensemble du réseau qui vérifie sa réponse. Si elle est correcte, alors toutes les copies de la blockchain sont mises à jour avec ce nouveau bloc.

Et ainsi de suite : chaque mineur reprend une nouvelle liste de transactions et tente de valider un nouveau bloc en fournissant sa preuve de travail.

Il y a donc une réelle compétition entre les membres du réseau : à chaque fois qu’un bloc est validé, ils recommencent tous à zéro sur un nouveau bloc.

Cependant pourquoi les noeuds supporteraient-ils des coûts (électricité, puissance informatique..) pour valider les transactions et ainsi faire marcher le réseau ? Une seule raison, pour une poignée de dollars…

Les noeuds parvenant à valider des blocs génèrent une certaine somme de futurscoins qui leur revient.

A titre d’exemple, un noeud parvenant à valider un bloc sur la blockchain bitcoin crée 12.5 bitcoins soit… 33 000$ qui arrivent directement dans sa poche (“wallet”). Au cours du 20/07/2017 à 17h30, soit 2460$/BTC. C’est d’ailleurs la seule façon de créer des bitcoins. La somme de bitcoins créée par un mineur est divisée par 2 tous les 4 ans.

C’est pour cela que l’on appelle les noeuds qui valident les blocs les “mineurs” en référence aux mineurs de la ruée vers l’or qui minaient le métal pour s’enrichir et venaient en réalité augmenter la masse monétaire existante.

Les mineurs sont donc incités à valider des blocs de transactions car ils sont rémunérés pour cette action.

Une question devrait vous venir à l’esprit : et si DEUX mineurs tombent sur la solution en même temps ie valident chacun leur bloc simultanément, comment est-ce régulé dans le réseau ?

Les bifurcations de chaîne, ou “forks” : la théorie des six blocs

Si vous avez déjà passé des transaction à l’aide de monnaies cryptographiques, vous savez qu’il faut attendre (en moyenne) que six blocs soient validés après l’enregistrement de votre transaction pour la considérer effectuée. Mais savez-vous pourquoi ?

Il est possible que deux mineurs valident leur bloc en même temps. Ainsi, les deux seront considérés comme valides dans la blockchain, et la règle d’or s’appliquera.

Règle d’or : c’est toujours la chaîne la plus longue qui sera finalement validée.

Exemple de bifurcation

Ici, la chaîne verte est finalement devenue plus courte que la bleue. C’est donc la chaîne bleue qui a été incorporée dans la blockchain, les blocs (et donc les transactions) de la chaîne vertes étant invalidés.

Ainsi il est possible, si le bloc dans lequel se trouve votre transaction fait partie d’une bifurcation, qu’elle soit enregistrée à un moment donné puis invalidée après : par exemple si votre transaction se trouvait dans le bloc 92bis.

Cela signifie que votre bloc se trouvait dans la chaîne devenue la plus courte.

C’est pour cette raison qu’il est conseillé d’attendre six blocs après celui où le paiement a été enregistré pour le considérer comme effectif.

Six blocs, c’est une heure sur la blockchain Bitcoin et un peu plus d’une minute sur la blockchain Ethereum.

Et voilà, la transaction de A a bien été enregistrée dans la blockchain, et les futurscoins sont passés de A à B.

Résumons les différentes étapes :

  • Émission de la transaction par A avec sa signature numérique
  • Vérification de la validité de la transaction de A par un pair du réseau (fonds disponibles, vérification de l’identité)
  • Transaction de A en attente d’être enregistrée
  • Transaction de A enregistrée dans un bloc par un mineur (preuve de travail etc..) → Création de nouveaux Futurscoins revenant au mineur
  • Attente de B de la validation de six blocs pour être sûr que la transaction est enregistrée dans la blockchain et qu’elle ne sera pas invalidée par la suite
Non… Fermez cet onglet sur les meilleurs techniques de minage de bitcoins... Quoi ? 33 000$ c’est pas rien ? Et vous pensiez être les premiers à le comprendre…

Les pools de mineurs, fermes à bitcoins et attaques contre le réseau

Aujourd’hui il existe de grandes usines à bitcoins, qui ont à peu près cette tête là :

Une usine à bitcoins en Chine

Ou encore des coopérations de mineurs (pools) qui centralisent leur puissance de calcul. Autant vous dire que la probabilité que vous miniez un bloc avec votre petit laptop aussi puissant soit-il, est très très faible voire nulle.

Le problème, c’est que que cela pourrait rendre certaines attaques possibles contre le réseau, voire même instaurer une certaine forme d’autorité centrale, ce qui est contraire au principe même de la blockchain.

Alexandre Capetta, Fondateur de la communauté “La Baleine

A suivre…