Qui s'occupe de la liste partagée ?
Imagine qu'une classe tienne une page partagée où l'on note qui a payé qui. Comment empêcher quelqu'un d'effacer discrètement une ligne pour y écrire un autre montant ? Une blockchain répond avec des mathématiques plutôt qu'avec un responsable. Ce lab est un jouet : quelques petits fichiers Python qui montrent les idées, sans monnaie, sans réseau et sans valeur.
À la fin de cette leçon
Remarque
Je peux expliquer comment des blocs reliés par des hachages font apparaître un changement dans un ancien enregistrement.
Mots clés
- Hachage (hash) : une empreinte de longueur fixe calculée à partir de données. Change une lettre et l'empreinte est complètement différente.
- Bloc : un groupe d'enregistrements, avec le hachage du bloc précédent.
- Chaîne : des blocs en ordre, chacun contenant le hachage du précédent.
- Nonce : un nombre qu'on change encore et encore jusqu'à ce que le hachage ait l'aspect demandé par les règles.
- Minage : essayer des nonces jusqu'à ce que le hachage d'un bloc commence par assez de zéros.
- Signature : la preuve qu'un message vient de celui qui détient une clé secrète.
Pour commencer : ce que tu sais déjà
Remarque
Réponds dans ta tête. 1. Pourquoi comparer un fichier téléchargé avec sa somme de contrôle ? 2. Si tu changes une lettre d'un long message, son empreinte doit-elle changer un peu ou beaucoup ? 3. Que fait une boucle ? Réponses : pour vérifier que rien n'a changé ; beaucoup ; elle répète une étape.
Avant de commencer
Remarque
Appuie sur Démarrer le lab dans la barre en haut de la leçon et attends qu'il indique qu'il est en marche. Il y a un seul conteneur, jupyter, et le terminal atteint son Python avec docker exec jupyter, qui lance une commande à l'intérieur. Le lien JupyterLab ouvre sa page web, sur le port 8888. Chaque bouton Exécuter ci-dessous tape sa commande dans le terminal de ton lab, l'une après l'autre, dans la même session. Pour suivre les commandes ou taper les tiennes, appuie sur Ouvrir le terminal (nouvel onglet) dans la barre.
Une chaîne, ce sont des blocs qui portent l'empreinte les uns des autres
ls liste le dossier de travail : trois petits fichiers Python, le notebook et le dossier steps. Le premier script construit trois blocs. Chaque ligne montre le numéro du bloc, le hachage du bloc précédent et son propre hachage, raccourcis. Le bloc 0 n'a rien avant lui : son hachage précédent est fait uniquement de zéros. Le hachage précédent de chaque autre bloc est celui de la ligne du dessus. Tous les hachages commencent par 000, ce que le minage les a obligés à faire.
docker exec jupyter lsAffiché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.
docker exec jupyter python3 steps/link.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.
Change un montant et la chaîne le remarque
Le script vérifie la chaîne, change un montant dans le bloc 1, puis vérifie de nouveau. La première réponse est (True, None) : valide, aucun bloc en cause. Après le changement, c'est (False, 1) : non valide, et le bloc 1 est l'endroit. L'empreinte du bloc 1 ne correspond plus à son contenu. Falsifier l'empreinte n'y change rien. Miner de nouveau le bloc 1 le rend juste, mais la réponse devient (False, 2), car le bloc 2 contient toujours l'ancien hachage du bloc 1.
docker exec jupyter python3 steps/tamper.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.
Miner, c'est essayer des nombres jusqu'à ce que le hachage convienne
Pour ajouter un bloc, les règles demandent un hachage qui commence par quelques zéros. Le seul moyen d'en trouver un est d'essayer un nonce, puis le suivant, puis le suivant. Le script mine le même bloc à quatre difficultés. Il a fallu 15 essais pour un zéro, 835 pour deux, 7992 pour trois et 109028 pour quatre. Chaque zéro de plus coûte beaucoup plus de travail, et la réponse est la même à chaque fois, car le bloc et le départ sont fixé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.
Vérifie
Astuce
Pourquoi est-il plus difficile de changer un ancien bloc qu'un nouveau ? Réponse : chaque bloc qui le suit contient l'ancien hachage, donc il faut tous les miner de nouveau, et chacun coûte des essais.
Un registre se calcule à partir des paiements
Personne ne stocke un solde. Le script donne 10 à Asha, 5 à Ben et 0 à Cara, puis rejoue quatre paiements dans l'ordre. La dernière ligne dit que le paiement de 8 de Cara à Asha a été refusé, car Cara n'avait que 6 à ce moment-là. Les soldes sont Asha 6, Ben 0 et Cara 9.
docker exec jupyter python3 steps/balances.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.
Une signature montre qui a envoyé un message
N'importe qui peut écrire « Asha pays Ben 5 ». Une signature montre qu'Asha l'a écrit. Celle-ci n'est faite que de hachages : une clé secrète de 256 paires, une clé publique qui est le hachage de chacune, et une signature qui révèle un secret de chaque paire. Le message signé est vérifié : True. Change une lettre du message, garde la même signature, et la vérification donne False. Une clé comme celle-ci ne signe qu'un seul message : c'est une leçon, pas quelque chose à utiliser.
docker exec jupyter python3 steps/sign.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.
Quand deux chaînes ne sont pas d'accord, le travail tranche
Deux personnes peuvent ajouter des blocs différents à la même chaîne au même moment, et il y a alors deux chaînes. Le script construit les deux à partir des deux mêmes premiers blocs. La chaîne A a 3 blocs et la chaîne B en a 4. Les deux sont valides. La règle est de suivre la chaîne qui a le plus de travail, ici 768 contre 1024 : B gagne et le bloc en plus de A est abandonné.
docker exec jupyter python3 steps/fork.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.
Une erreur fréquente
Attention
Beaucoup pensent qu'une chaîne valide signifie que chaque paiement qu'elle contient est vrai. Elle signifie seulement que personne n'a modifié l'enregistrement depuis qu'il a été écrit. Savoir si un paiement doit y figurer est un autre travail : le registre refuse un dépassement et une signature montre qui l'a envoyé. Garde les trois questions séparées : a-t-il été changé, est-il permis, qui l'a envoyé.
Le même travail dans un notebook
Ouvre JupyterLab depuis la barre et double-clique sur start.ipynb. Il construit une chaîne, la vérifie, change un bloc et vérifie de nouveau. Clique sur une cellule et appuie sur Maj et Entrée pour l'exécuter. La dernière cellule attend ta propre question, et chain.py est assez court pour être lu en entier.
Vérification finale
Astuce
Réponds sans revenir en arrière. 1. Que contient un bloc qui le relie au précédent ? 2. Qu'essaie encore et encore le minage ? 3. Pourquoi la vérification a-t-elle échoué au bloc 2 après un nouveau minage du bloc 1 ? 4. Une chaîne valide prouve-t-elle que chaque paiement est vrai ? Réponses : le hachage du bloc précédent ; des nonces ; le bloc 2 contenait toujours l'ancien hachage du bloc 1 ; non, seulement qu'elle n'a pas été modifiée.
Pour les enseignants
Astuce
Cette leçon est un petit exemple de leçon travaillée dans un lab : les étapes et les boutons Exécuter sont la leçon, et le lab est la copie de chaque élève. Le lab est un seul service, JupyterLab avec une chaîne jouet écrite avec la bibliothèque standard de Python, et rien ici ne se corrige tout seul : l'élève rend un notebook à lui, téléchargé depuis JupyterLab, et une phrase sur ce qu'il a montré. Points clés : 1. Un hachage relie les blocs, donc un changement se voit. 2. Le minage est un essai-erreur dont le coût augmente avec la difficulté. 3. Une chaîne valide, un paiement permis et une signature sont trois vérifications différentes. Erreur fréquente : lire une chaîne valide comme si chaque paiement était vrai. Le lab est un jouet pour les idées et ne parle d'aucune monnaie, d'aucun marché ni d'aucun prix. Matériel : le lab et un navigateur. Conseil : demandez aux élèves de deviner combien d'essais demande la difficulté suivante avant d'exécuter. Copiez-la dans votre propre module et modifiez-la, ou créez-en une de zéro avec le menu Lab du créateur de leçons.