Pourquoi le minage demande-t-il tant de travail ?
La preuve de travail est une règle : pour ajouter un bloc, il faut trouver un nombre, le nonce, qui donne à l’empreinte un début imposé. Il n’existe aucun raccourci, on essaie encore et encore.
Chercher coûte cher, vérifier ne coûte presque rien. Cet écart rend très coûteux de refaire un vieux bloc.
À la fin de cette leçon
Remarque
Je peux expliquer pourquoi miner un bloc coûte du travail alors que le vérifier est rapide.
Mots-clés
| Mot | Ce que ça veut dire |
|---|---|
| Nonce | un nombre que l’on change à chaque essai pour modifier l’empreinte |
| Difficulté | le nombre de zéros imposés au début de l’empreinte |
| Minage | essayer des nonces jusqu’à trouver une empreinte qui respecte la difficulté |
| Preuve de travail | le nonce gagnant : il prouve qu’on a fait beaucoup d’essais |
| Essai | un calcul d’empreinte avec un nonce donné |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Un nonce se change jusqu’à réussir
La règle dit : l’empreinte du bloc doit commencer par un certain nombre de zéros. Comme on ne peut pas choisir une empreinte, on change une valeur du bloc : le nonce.
On essaie 0, puis 1, puis 2, et ainsi de suite. À chaque essai, on recalcule l’empreinte. On s’arrête dès qu’elle commence par assez de zéros.
Chercher un nonce en Python
import hashlib
donnees = "Camille paie Hugo 5"
difficulte = 2
nonce = 0
# on recalcule l'empreinte jusqu'à obtenir assez de zéros
while not hashlib.sha256((donnees + str(nonce)).encode()).hexdigest().startswith("0" * difficulte):
nonce = nonce + 1
print("nonce trouvé :", nonce)
Pourquoi le résultat est toujours le même
Le programme affiche nonce trouvé : 240. Les données sont les mêmes à chaque fois, donc la première réussite est toujours 240.
Avec la difficulté 1, le même texte donne 11. Avec 3, il donne 1830. Changez la difficulté et relancez pour le voir.
Le labo mine un bloc à quatre difficultés
Le script mine.py du labo mine un bloc avec la difficulté 1, 2, 3 puis 4. Attention : il écrit des mots anglais, comme « difficulty », « nonce » et « tries », qui veut dire essais.
Chaque ligne donne le nonce trouvé, le nombre d’essais, et le début de l’empreinte.
Miner le même bloc à quatre difficultés
docker exec jupyter python3 steps/mine.pyAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Exemple travaillé : chaque zéro coûte seize fois plus
| Difficulté | Essais du labo | Essais attendus en moyenne | Pourquoi |
|---|---|---|---|
| 1 | 15 | 16 | Un chiffre sur 16 est un zéro |
| 2 | 835 | 256 | Deux zéros : 16 fois 16 chances de moins |
| 3 | 7992 | 4096 | Trois zéros : 16 fois 16 fois 16 |
| 4 | 109028 | 65536 | Quatre zéros : un essai sur 65536 réussit |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Calculer 16 puissance 4
docker exec jupyter python3 -c "print(16 ** 4)"Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Erreur fréquente
Attention
On croit qu’un zéro de plus double le travail. En réalité, chaque zéro le multiplie par 16, car il y a seize chiffres hexadécimaux. Passer de la difficulté 3 à 4 fait donc passer de 4096 à 65536 essais en moyenne.
Vérifier une preuve de travail est instantané
Pour contrôler un nonce, il suffit d’un seul calcul d’empreinte. On prend le bloc et son nonce, puis on regarde si l’empreinte commence par les zéros.
Trouver demande des milliers d’essais, vérifier en demande un. C’est ce déséquilibre qui rend utile la preuve de travail.
Pourquoi refaire un vieux bloc coûte cher
Si l’on change le bloc 1, son empreinte change. Le bloc 2 doit donc être miné de nouveau, puis le bloc 3, jusqu’au dernier.
Chaque bloc refait coûte le même nombre d’essais que la première fois. Plus le bloc est ancien, plus il y a de travail à rejouer.