Comment fonctionne le minage de Bitcoin ?
September 12, 2019
Une des nombreuses parties techniques composant Bitcoin est le minage. Certaines cryptomonnaies ont du minages, d’autres non. La place occupée par les mineurs et le minage dans le Bitcoin est très importante et très discutée sur internet.
Bitcoin ne fonctionne pas comme les autres moyens de paiements ce qui rend le minage difficile à comprendre au premier abord. Qu’est-ce que le minage de Bitcoin ? Comment fonctionne t-il ? Je vais expliquer cela le plus simplement possible et nous allons même miner manuellement un bloc selon les règles de Bitcoin !
Une chaine de blocs contenant des transactions
Une blockchain est une structure de données (c’est à dire une manière de stocker des données sur un ordinateur). Elle est composé d’une série de blocs liés d’une certaine manière.
Dans Bitcoin, un bloc est composé d’un header et d’une liste de transactions (pour simplifier). En général, une blockchain peut contenir n’importe quelle donnée, pas obligatoirement des transactions ! Je peux créer une blockchain pour stocker une liste de messages au format texte par exemple.
Le header contient des informations à propos du bloc, comme par exemple un horodatage (timestamp), la version du logiciel utilisé et quelques autres champs (la liste complète des champs du header d’un block est ici (en)).
On va regarder deux champs plus en détail : Previous Block Hash (hash du bloc précédent) et Nonce. Mais d’abord, voyons ce qu’est un hash !
Qu’est-ce qu’un hash ?
Dans cette partie nous allons définir des termes mathématiques. Le but n’est pas une rigueur absolue mais plutôt d’intuiter ce qu’est le minage !
Un hash est le résultat d’une fonction de hachage. En mathématiques, on peut dire en utilisant des termes simples qu’une fonction est une espèce de boite qui prend quelque chose en entrée et retourne quelque chose en sortie.
Une fonction de hachage est une fonction qui prends des données de n’importe quelle taille en entrée et les transformes en des données de taille fixe.
Si on prend par exemple une fonction de hachage très connue appelée sha256, on obtient toujours un résultat de la même taille que l’on donne en entrée un seul mot ou bien une phrase complète (comme cette phrase par exemple).
sha256("Salut!") = "E3C18F5C1F8A09F3353E25BDE7BFBBB731209CE72DFFD2720F85EC11A06B9155"
sha256("Si on prend par exemple une fonction de hachage très connue appelée sha256, on obtient toujours un résultat de la même taille que l'on donne en entrée un seul mot ou bien une phrase complète (comme cette phrase par exemple).") = "A6553B834FB75DAEF9211420AA0B4FE21366E8ADC97790FBD94A2235FF9B59BF"
La notation dans cet exemple signifie “j’applique une fonction de hachage sha256 à ce qui est entre parenthèses et j’obtiens ce qui est derrière le signe égal”.
Vous voyez ? Le résultat fait la même longueur !
Les fonctions de hachage ont d’autre propriétés (la liste complète est ici (en)) :
- déterminisme : si on donne la même entrée à la fonction de hachage, on obtient le même résultat (vous pouvez essayer sur ce site avec les exemples que j’ai donné plus haut, vous obtiendrez le même résultat !)
- uniformité : la fonction doit retourner des résultats bien distribués et pas un résultat plus souvent qu’un autre.
- non-inversable : si on vous donne un hash, vous ne devriez pas être capable de retrouver ce qui a permis de le créer.
Les hashes sont très différents pour des données qui sont très proches. Par exemple :
sha256("aaaaaaaaaa") = "BF2CB58A68F684D95A3B78EF8F661C9A4E5B09E82CC8F9CC88CCE90528CAEB27"
sha256("aaaaaaaaab") = "4F1C5F86A4DDD78A007176779E4F4B5A1EC5171D401ED2FBD6E83615184F941F"
Les deux textes ont juste une lettre d’écart, pourtant le second hash n’a rien en commun avec le premier !
Hash du bloc précédent : qu’est-ce que ça signifie ?
Cela signifie qu’on prend les données du header d’un bloc et qu’on le fait passer dans une fonction de hachage, comme nous venons de le faire faire un peu plus haut. Le résultat sera un hash (qui ressemblera exactement à ceux que nous venons juste de voir) et ce hash sera placé dans le header du prochain bloc (et ainsi de suite).
Mais pourquoi ?
Si quelqu’un change les données de n’importe quel bloc avant le dernier bloc, alors le hash du dernier bloc aura l’air totalement différent (comme nous venons de le voir avec le dernier exemple) ! Il sera donc facile de vérifier si quelqu’un a altéré les données quelque part dans la blockchain ! C’est pour cela que le hash du bloc précédent est inclus dans le bloc suivant.
Arrive le minage
Bitcoin est un réseau ouvert avec une blockchain ouverte. Cela signifie que N’IMPORTE QUI peut créer un bloc.
Maintenant, imaginez ce qu’il se passerait s’il été trop facile de créer un bloc ? Le réseau serait inondé par des blocs créés par tout le monde. Vous avez vu qu’il est rapide et facile de créer un hash (on l’a fait en une fraction de seconde avec le générateur dont j’ai mis le lien plus haut) ?
Le protocole de Bitcoin veut rendre la tâche de créer des blocs valides plus compliquée. En fait, il veut qu’un bloc soit créé toute les 10 minutes environ. Un bloc toute les 10 minutes c’est beaucoup moins de spam que beaucoup de blocs toute les secondes. Les blocs doivent être propagés sur tout le réseau et cela prend beaucoup de temps.
Ça doit être difficile de créer des blocs parce que quelqu’un pourrait réécrire les transactions sur la blockchain. Imaginez ce scénario : je donné 1 BTC à quelqu’un en échange d’euros. Quand je reçois les euros, je commence à recréer des blocs datant d’AVANT la transaction où je donne des BTC à l’autre personne. Maintenant j’ai 1 BTC et les euros ! Réécrire le passé doit être difficile !
Pour palier à ce problème, Bitcoin a une règle écrite dans son code : un bloc valide doit commencer par un certain nombre de zéros ! Voici un exemple de hash commençant par sept zéros :
0000000FAA4DA8FC242A391BC5CAD3822F9EEF00D162D7B6C4F8D69C40920C71
Cette règle peut sembler étrange à première vue mais nous allons voir pourquoi elle existe.
Vous vous rappelez du nonce dont j’ai parlé précédemment ? C’est grâce à lui que nous allons obtenir les zéros au début du hash du bloc !
Maintenant, nous allons miner manuellement un faux bloc en utilisant le générateur de sha256 !
Notre bloc va avoir un champ header (un horodatage) et des donnés à l’intérieur:
timestamp: 2019-08-16
Hello Crypto & Coin!
0
Notre contenu est : “Hello Crypto & Coin!”, notre nonce est 0 et le hash est:
2BF858117E3335264EB6D67CFFF827E5B257EF422A6704A479FAA036329FAACA
Le hash ne commence pas par un 0. Maintenant nous allons augmenter le nonce jusqu’à ce que nous trouvions un nombre qui crée un hash commençant par un zéro.
C’est parti !
J’ai trouvé un résultat (et c’était plutôt facile) :
timestamp: 2019-08-16
Hello Crypto & Coin!
1
Le hash résultant est :
0D89DBA3F848095B745C2F69A1FBD1A2FEE07D95B40D910E2F7FF67D64C57291
Ok, c’était facile… Maintenant essayons de trouver un hash commençant par deux zéros.
C’est reparti !
Au bout d’un moment (je plaisante, je n’ai pas essayé tous les nonce manuellement…), j’ai trouvé un nonce qui donne un hash commençant par deux zéros :
timestamp: 2019-08-16
Hello Crypto & Coin!
124
Donne le hash :
0078814A7550778BC24B18C658CDE6225FF1BC28C93ABE0C923135EF407C9AA4
C’était un peu plus difficile… Augmenter le nombre de zéros au début du hash augmente la difficulté de trouver un bloc !
Sur Bitcoin, la difficulté change en fonction de la vitesse à laquelle les blocs sont trouvés. Si les blocs sont trouvés trop rapidement (< 10 min), alors la difficulté s’ajuste pour rendre les blocs plus difficiles à trouver (plus de zéros au début). Si les blocs sont découverts trop lentement (> 10 min), la difficulté s’ajuste pour que les blocs soient plus faciles à trouver (moins de zéros au début).
Voici un vrai exemple sur la blockchain Bitcoin :
Le dernier bloc (au moment de l’écriture de cet article) a un hash commençant par 19 zéros ! C’est beaucoup plus que le bloc de genèse (le premier bloc à avoir été miné sur la blockchain Bitcoin) qui a seulement 10 zéros au début.
Conclusion
- Bitcoin stocks ses transactions sur une blockchain : une chaine de blocs où le bloc suivant contient le hash du bloc précédent
- Les hashes ont des propriétés intéressantes qui vont rendre possible le minage
- Le minage est l’action de chercher un nonce de manière à ce que le hash d’un bloc commence par un certain nombre de zéros
- Cela empêche les personnes mal intentionnées de réécrire le passé trop facilement
Having a question or suggestion about the article?
Tell me on Twitter where I'm @vincentdnl!
Help others understand Bitcoin and cryptocurrencies by sharing this post!