Lab blockchain : une chaîne jouet en Python à lire, casser, miner et signer

Ce lab donne à chaque élève un JupyterLab à lui, avec une blockchain jouet écrite en Python simple, assez courte pour être lue en entier : des blocs qui contiennent le hachage du précédent, le minage, un registre qui calcule les soldes à partir des paiements, une signature faite uniquement de hachages, et deux chaînes qui ne sont pas d'accord. Six petits scripts affichent ce que fait chaque idée, toujours pareil.

C'est un jouet qui sert à comprendre les idées. Il n'y a ni monnaie, ni réseau, ni marché, ni prix, aucun conseil sur l'argent, et il n'est pas assez sûr pour un vrai usage. Ce n'est pas non plus un lab d'attaque : chaque copie n'a aucun accès à internet ni à aucun autre élève, et rien n'y est téléchargé.

Ce que les élèves apprennent

Comment un hachage est l'empreinte de données, et comment un bloc qui contient le hachage du précédent forme une chaîne. Ils cassent une chaîne en changeant un montant et voient la vérification échouer au bloc modifié, puis ils minent ce bloc de nouveau et la voient échouer au bloc suivant. Ils voient le minage comme un essai-erreur, 15 essais pour un zéro au début et 109028 pour quatre, donc le travail augmente très vite avec la difficulté. Ils calculent des soldes à partir de paiements et voient un dépassement refusé, vérifient une signature fondée sur des hachages et voient une lettre changée la casser, et tranchent une bifurcation en suivant la chaîne qui a le plus de travail. Il convient aux introductions à la sécurité informatique, aux systèmes répartis et aux structures de données ; vérifiez la formulation exacte dans l'unité de votre propre organisme certificateur, aucune n'est citée ici.

Le lancer dans votre navigateur

Le lab démarre un seul service, jupyter, qui écrit chain.py, ledger.py, lamport.py, un notebook de départ et les petits scripts dans son dossier de travail, sans rien télécharger. JupyterLab ne demande aucun jeton, car la porte de la plateforme sait déjà qui l'ouvre. Le terminal à côté du lab n'a pas de Python à lui : il atteint celui du lab avec docker exec jupyter, suivi de la commande à lancer à l'intérieur.

  1. Ouvrir la page Conteneur. Ouvrez « Créer » dans la barre et choisissez « Lancer un conteneur ». Tout le monde peut ouvrir la page, et le lab Git et le lab SQL se lancent sans compte. Tous les autres labs demandent un compte gratuit : créez-en un, connectez-vous, puis appuyez sur « Démarrer ».
  2. Trouver le lab. La carte « Laboratoires d’exemple » liste tous les exemples. Trouvez Blockchain : une chaîne jouet en Python.
  3. Appuyer sur Démarrer. « Démarrer » le lance tel quel, en un clic. « Modifier le fichier d’abord » ouvre le fichier compose pour que vous puissiez le changer avant de démarrer.
  4. L’ouvrir. Sur la page du lab, la barre du lab a un lien nommé JupyterLab : appuyez dessus pour ouvrir JupyterLab dans votre navigateur et lire chain.py dans l'éditeur de fichiers. Appuyez ensuite sur « Ouvrir le terminal » et tapez docker exec jupyter python3 steps/link.py pour voir trois blocs, chacun avec le hachage du précédent.

Que demander aux élèves de rendre

Un notebook à eux qui utilise chain.py pour répondre à une question qu'ils ont choisie, par exemple comment le nombre d'essais augmente avec la difficulté, ce qu'il faut pour modifier un ancien bloc et garder une chaîne valide, ou ce qui arrive à une bifurcation quand un côté a une difficulté plus haute, téléchargé depuis JupyterLab avec File, Download. Puis une ou deux phrases, de leurs propres mots, sur ce qu'ils ont trouvé. Rien n'est noté automatiquement : la phrase montre si c'était compris. Pour un travail plus poussé, demandez d'expliquer pourquoi une chaîne valide ne prouve pas que chaque paiement est vrai.

Une leçon de base sur ce lab

Blockchain Basics est une petite leçon qui se fait dans ce lab. L'élève y relie trois blocs, change un montant et voit la vérification échouer, mine un bloc à quatre difficultés, calcule des soldes et voit un dépassement refusé, signe un message et casse la signature avec une seule lettre, puis tranche une bifurcation par la chaîne qui a le plus de travail.

Un compte personnel gratuit la reçoit dans le module Basics, qui se trouve sur « Accueil », et chaque établissement peut la copier depuis le dossier Basics de la Bibliothèque. Elle est volontairement petite : elle montre à un enseignant ce qu'est une leçon qui se fait dans un lab, et le lab fait le reste. Copiez-la dans un module à vous pour la modifier.

Le code sur GitHub

Le fichier compose n'a pas de Dockerfile : il lance une seule image publique, scipy-notebook des Jupyter Docker Stacks, figée sur une étiquette datée, avec son propre compte sans privilèges et 512 Mo de mémoire, et le jouet n'utilise que la bibliothèque standard de Python. L'image est sous licence BSD-3-Clause et n'est pas distribuée par nous. Le fichier écrit chaque fichier Python à partir d'un texte fixe au démarrage, le minage commence toujours au nonce 0 et les clés de signature viennent d'une graine fixe : chaque copie affiche donc la même chose et rien n'est téléchargé. Les limites sont honnêtes : c'est une seule machine et non un réseau, un bloc contient une courte liste de paiements, la clé de signature ne signe qu'un seul message, et rien n'est conservé quand le lab s'arrête : l'élève télécharge son notebook avant.

En faire un travail

Indiquez dans la tâche ce qu'il faut rendre.

  1. Créer le lab. Dans votre module, ajoutez une tâche et choisissez la carte « Lab de conteneurs », puis « Dans un dépôt GitHub ». Indiquez https://github.com/mitsurutech/lab-blockchain-lab avec la branche main. Le fichier compose par défaut est compose.yaml. Faites d’abord un fork du dépôt si vous voulez le modifier, par exemple pour modifier la chaîne jouet.
  2. Publier et l’essayer. « Publier » fige le commit qui vous a été montré : un changement ultérieur dans le dépôt ne modifie donc pas un lab que vous avez déjà proposé. Démarrez d’abord votre propre copie.
  3. Le distribuer. Attribuez-le comme n’importe quelle tâche, avec une échéance si vous le souhaitez, et indiquez dans la tâche ce qu’il faut faire et ce qu’il faut rendre.
  4. Noter ce qui est rendu. Ouvrez la copie d’un élève et le travail rendu, notez-le et renvoyez-le avec un motif s’il demande un complément.

Essayer ce lab, et ce qu’il coûte

Un compte personnel gratuit permet de suivre les leçons de base de ce lab, avec chaque mois assez de crédit gratuit pour suivre la plupart des leçons, sans carte. Pour une classe, un établissement a ses 365 premiers jours gratuits pour 50 élèves au plus, puis paie par élève et par an, tous les labs compris et les enseignants gratuits.

Questions fréquentes

Pourquoi n'y a-t-il ni jeton ni mot de passe à taper ?
La page web d'un lab ne s'atteint que par la porte de la plateforme, qui sait déjà qui vous êtes et ne laisse entrer que vous et les enseignants de votre module. JupyterLab démarre donc sans jeton. Ne le lancez pas ainsi sur une machine que d'autres peuvent atteindre.
Pourquoi le terminal utilise-t-il docker exec jupyter ?
Le terminal du lab contient quelques clients, mais pas Python. docker exec jupyter lance une commande dans le conteneur du lab, qui a Python. JupyterLab a aussi son propre terminal, sous File, New, Terminal.
Est-ce une vraie blockchain ?
C'est un jouet pour comprendre les idées. Il montre comment les hachages relient les blocs, comment le minage est un essai-erreur, comment un registre et une signature s'y ajoutent et comment on tranche une bifurcation. Il n'a ni réseau, ni monnaie, ni valeur, et il n'est pas sûr pour un vrai usage. Rien n'y est un conseil sur l'argent.