Qu'est-ce qu'un bloc dans la technologie blockchain ?
Un bloc, ou block en anglais, est une ensemble horodaté et validé de transactions. Ces transactions sont généralement des transferts de cryptomonnaies, mais peuvent aussi constituer des interactions avec des contrats ou contenir des données arbitraires. Les blocs sont liés les uns aux autres de sorte à former une structure linéaire appelée la chaîne de blocs, ou blockchain.
Comment sont construits les blocs ?
Comme on le sait, la chaîne de blocs forme le registre de toutes les transactions d'une crypto-monnaie et est partagée entre les membres d'un réseau distribué d'ordinateurs. Cette chaîne est un ensemble linéaire de blocs, commençant par un premier bloc considéré comme valide par défaut, qui est appelé bloc de genèse (genesis block).
Les blocs sont construits et chaînés selon des règles précises, appelées règles de consensus, qui sont définies par le réseau. Par exemple, les blocs ont généralement une taille limitée par ces règles pour empêcher les attaques par déni de service (DDoS) et pour faire en sorte que le réseau reste décentralisé.
Le validateur (appelé « mineur » dans le cas de Bitcoin) prépare son bloc en récupérant les nouvelles transactions, en vérifiant qu'elles suivent les règles et en les incluant dans le bloc. Puis il procède à la validation. Dans Bitcoin et dans les autres systèmes utilisant la preuve de travail, le validateur doit dépenser de l'énergie afin de trouver la solution à un problème mathématique, et cette solution permet de lier le bloc à la chaîne. Dans les systèmes utilisant la preuve d'enjeu ou la preuve d'autorité, la validateur doit seulement produire une signature numérique qui l'authentifie auprès du réseau. Puisque le bloc doit contenir l'identifiant du bloc précédent, le nouveau bloc est chaîné à ce dernier.
Au moment de la validation, il ajoute un horodatage à ce bloc, c'est-à-dire la date et l'heure approximatives auxquelles le bloc a été trouvé. Cela permet au réseau d'avoir son temps propre et de faire en sorte que le temps entre chaque bloc ne soit ni trop court, ni trop long : dans Bitcoin, ce temps doit théoriquement être de 10 minutes en moyenne.
Les données inscrites dans les blocs sont considérées comme très difficiles à changer et elles deviennent infalsifiables au bout d'un certain temps. Une transaction est considérée comme confirmée lorsqu'elle est incluse dans un bloc validé. Lorsqu'un bloc supplémentaire est ajouté à la suite de ce bloc, on parle de deux confirmations, et ainsi de suite. Plus une transaction a de confirmations, plus on peut avoir confiance dans son irréversibilité.
Chaque bloc dispose d'un identifiant, qui est une empreinte cryptographique unique, issue du hachage des données que ce bloc contient : par exemple, 000000000000000000024bead8df69990852c202db0e0097c1a12ea637d7e96d
. On peut également le retrouver grâce à sa position dans la chaîne, qu'on appelle sa hauteur : le bloc de genèse est ainsi considéré comme le bloc 0, le bloc suivant le bloc 1, etc. Le 11 mai 2020, la chaîne de Bitcoin a atteint le bloc numéro 630 000.
La structure d'un bloc dans Bitcoin
Dans Bitcoin, un bloc se compose de deux composantes : un entête (block header) et les transactions, qui permettent de construire un arbre de Merkle (Merkle tree). Concentrons-nous sur les transactions avant de nous attarder sur l'entête.
Les transactions
Les transactions sont placées les unes à la suite des autres dans le bloc. La seule règle à respecter est que la première transaction doit être la transaction de récompense (aussi appelée coinbase transaction) qui rémunère le mineur. Cette transaction crée de nouveaux bitcoins : ce montant est actuellement de 6,25 bitcoins par bloc. Elle récupère aussi les frais de transaction issus des transactions du bloc.
La transaction de récompense contient également un ensemble d'informations supplémentaires. En particulier, les coopératives de minage (mining pools) indiquent souvent leur nom dans un champ spécial de la transaction, pour que les utilisateurs aient une idée de la répartition du minage (cela est une convention et n'est pas obligatoire). Par exemple, puisqu'on retrouve le message Mined by AntPool
dans le bloc 630 000, on peut en déduire qu'il a probablement été miné par la coopérative chinoise Antpool.
L'arbre de Merkle
Les transactions sont placées dans un certain ordre dans le bloc et sont à la base d'une structure appelée arbre de Merkle ou arbre de hachage. Il s'agit de hacher les transactions (les « feuilles »), puis de rassembler les empreintes (hashes) résultantes deux à deux et de les hacher, et ainsi de suite jusqu'à obtenir une empreinte unique appelée la racine de Merkle de l'arbre. La fonction de hachage utilisée pour construire cet arbre est le double SHA-256.
Prenons l'exemple d'un bloc contenant 6 transactions, et utilisons des lettres pour les identifier : txA
, txB
, etc. Tout d'abord, on hache ces transactions pour obtenir leurs empreintes respectives : hA
, hB
, etc. Notez au passage que ces empreintes représentent les identifiants des transactions permettant de les retrouver sur la blockchain.
Puis, on combine (par concaténation) les empreintes obtenues deux à deux et on réutilise la fonction de hachage pour chacune de ces combinaisons : la combinaison de hA
et hB
est hachée pour obtenir l'empreinte hAB
, hCD
est obtenue à partir de hC
et hD
, et hEF
est obtenue à partir de hE
et hF
.
On répète ensuite le processus. Dans le cas où le nombre d'empreintes à combiner est impair, on combine la dernière empreinte avec elle-même : ainsi, dans notre exemple, on doit combiner hEF
avec elle-même pour calculer hEFEF
.
Enfin, une fois qu'il n'y a plus qu'une seule empreinte (la racine de Merkle), cette empreinte est placée dans l'entête du bloc, par exemple b191f5f973b9040e81c4f75f99c7e43c92010ba8654718e3dd1a4800851d300d
.
Si l'une des transactions est modifiée, la racine de Merkle est modifiée. Cette structure permet donc de s'assurer que les transactions ne peuvent pas être changées sans altérer la chaîne de blocs. De plus, elle permet une vérification légère des transactions pour les portefeuilles.
Notez que, depuis l'activation de SegWit le 24 août 2017, chaque bloc est constitué de deux arbres de Merkle : l'arbre des transactions (sans les signatures) décrit ici, et l'arbre des témoins (qui est l'arbre des transactions incluant les signatures des transactions SegWit). La racine de l'arbre des témoins est placée dans la transaction de récompense, de sorte que la racine de Merkle principale dépende d'elle.
? Notre article complet sur les arbres de Merkle
L'entête du bloc
Un bloc commence toujours par un entête de 80 octets. Ce dernier est constitué des données suivantes :
- La version du bloc. Outre son rôle pur de versionnage, ce champ permet aux mineurs de signaler leur approbation (ou non) pour un changement du protocole.
- L'identifiant du bloc précédent, qui permet de chaîner l'entête à l'entête du bloc précédent.
- La racine de Merkle, dont le rôle est de lier l'entête au reste du bloc comme on l'a vu au-dessus.
- L'horodatage : la date et l'heure du minage.
- Une donnée indiquant la difficulté de minage du bloc.
- Le nonce relatif à la preuve de travail.
L'identifiant du bloc
L'identifiant du bloc a un rôle particulier : en plus de servir à retrouver simplement le bloc, il constitue la preuve de travail en elle-même. Cela peut se voir par le nombre de zéros par lesquels il commence : le bloc 630 000 a par exemple pour identifiant 000000000000000000024bead8df69990852c202db0e0097c1a12ea637d7e96d
.
Comment est-il obtenu ? Il s'agit simplement du résultat du hachage de l'entête par le double SHA-256. Néanmoins, cela n'est pas facile à trouver puisque Bitcoin requiert que le nombre obtenu soit inférieur à une valeur cible définie dans l'entête, conformément à la difficulté du réseau. Pour ce faire, le mineur fait varier le nonce (ce champ n'existe que dans ce but) dans l'entête jusqu'à ce qu'il trouve une solution. Cette solution constitue une preuve qu'il a dépensé de l'énergie afin de calculer tous ces hachages.
Notez que le nonce prévu par Satoshi Nakamoto n'est codé que sur 4 octets et ne permet que de tester que 4,3 milliards de possibilités, ce qui est trop peu pour la puissance de calcul actuelle. C'est pour cela que les mineurs font également varier nonce supplémentaire au sein de la transaction de récompense.
Récapitulatif
Voici un schéma récapitulatif de ce que contient un bloc de Bitcoin (depuis l'activation de SegWit) :
En bleu est représenté l'identifiant du bloc précédent qui est le résultat de deux hachages par la fonction SHA-256 de l'entête du bloc précédent. C'est ceci qui permet de rattacher les blocs entre eux, de sorte à obtenir une chaîne de preuve de travail.
En rouge est représenté l'arbre de Merkle des transactions munies de leur témoin (signature). Les empreintes de ces transactions sont leur identifiant SegWit (wtxid
ou witness transaction identifier). La racine de cet arbre de Merkle est écrite dans la transaction de récompense du bloc (tx0
), de sorte à lier les signatures au reste du bloc.
En vert est représenté l'arbre de Merkle des transactions sans leur témoin. Les empreintes de ces transactions sont leur identifiant classique (txid
). La racine de cet arbre de Merkle est écrite au sein de l'entête du bloc. Puisque tout est lié, il est impossible de modifier une transaction ou sa signature sans modifier l'entête, et donc sans altérer la chaîne de preuve de travail.
Conclusion
Un bloc est donc un ensemble organisé de transactions, qui contient un horodatage (l'heure et la date de validation) et une preuve (de travail, d'enjeu, d'autorité) inclus par le validateur. Les blocs sont liés entre eux à partir d'un premier bloc de référence, de sorte à former une chaîne, la chaîne de blocs.
La chaîne de blocs est, grâce à sa structure, un registre réputé infalsifiable : une fois qu'une transaction est incluse dans un bloc et qu'un certain nombre d'autres blocs sont ajoutés à la suite, elle peut être considérée comme irréversible.
Nous espérons que cet article explicatif sur les blocs vous aura été utile et que vous en savez désormais plus sur le sujet.
Merci à Nicolas Impellizzeri pour avoir contribué à cet article.
Bonjour,
Dans la vidéo de cryptoast qui m'a été très utile !
J'ai compris qu'un block server à inscrire les transaction effectué pour permettre l'échange à travers de la blockchain!
Mais si le dernier block est miné (selon les estimation dans l'an 2140) cela signifie que l'échange de Bitcoin sera impossible après ?
cet article contient des notions précises qui donnent une approche concrète de la création d'un bloc dans une chaine. Merci d'avoir donner un sens à cette notion de blockchain