Comment une chaîne de blocs montre une modification ?
Une chaîne de blocs, ou blockchain, est une liste de blocs où chacun contient l’empreinte du bloc précédent. Si quelqu’un change un ancien bloc, la chaîne le montre aussitôt.
Aucun chef n’a besoin de surveiller la liste. Vous allez relier des blocs, puis casser la chaîne pour voir où elle se brise.
À la fin de cette leçon
Remarque
Je peux relier des blocs par leur empreinte pour qu’une modification soit détectable.
Mots-clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Bloc | un paquet d’enregistrements, avec l’empreinte du bloc précédent | |
| Empreinte | le résumé de taille fixe qu’un hachage calcule à partir de données | SHA-256 |
| Chaîne de blocs | des blocs rangés dans l’ordre, chacun relié au précédent | |
| Bloc de genèse | le premier bloc : il n’a rien avant lui | |
| Vérifier | recalculer chaque empreinte et chaque lien pour voir s’ils tiennent |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Un bloc garde l’empreinte du précédent
Imaginez un cahier de comptes d’un club sportif. Chaque page note des paiements, comme « Camille paie Hugo 5 € ».
En bas de chaque page, on recopie l’empreinte de la page d’avant. Cette empreinte est le lien. Elle colle chaque page à la précédente.
Le labo construit trois blocs reliés
Le labo est un petit programme Python qui construit une chaîne. Attention : ses scripts affichent des mots anglais, comme « block », « previous » et « hash ». Le sens est celui de ce cours.
Le script link.py affiche, pour chaque bloc, son numéro, le début de l’empreinte du précédent et le début de la sienne.
Construire trois blocs reliés
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.
Comment lire la sortie du script
Le bloc 0 a pour précédent que des zéros : rien ne le précède. Pour chaque autre bloc, le champ « previous » est l’empreinte « hash » de la ligne du dessus.
Chaque empreinte commence par 000. Le prochain cours explique pourquoi : c’est la règle du minage.
Un montant changé casse la chaîne
Vérifier une chaîne, c’est recalculer l’empreinte de chaque bloc et la comparer à celle qui est notée. On contrôle aussi chaque lien.
Si on change « 2 » en « 200 » dans le bloc 1, son empreinte recalculée ne ressemble plus à celle qui est notée. Le contrôle s’arrête sur ce bloc.
Modifier un montant puis vérifier
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.
Exemple travaillé : ce que le script affiche
| Étape | Réponse de la vérification | Pourquoi |
|---|---|---|
| Chaîne neuve | (True, None) | Tout est cohérent, aucun bloc fautif |
| Montant changé dans le bloc 1 | (False, 1) | L’empreinte du bloc 1 ne correspond plus à son contenu |
| Empreinte du bloc 1 falsifiée | (False, 1) | Un faux début de zéros ne suffit pas, elle est recalculée |
| Bloc 1 miné de nouveau | (False, 2) | Le bloc 2 garde l’ancienne empreinte du bloc 1 : le lien est rompu |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Erreur fréquente
Attention
On croit qu’une chaîne de blocs empêche de modifier un bloc. Ce n’est pas le cas : n’importe qui peut changer sa copie. La chaîne ne l’empêche pas, elle le rend visible. Le contrôle échoue au bloc modifié ou juste après.
Une chaîne de trois blocs en Python
import hashlib
def empreinte(texte):
return hashlib.sha256(texte.encode()).hexdigest()
def chaine_valide(chaine):
precedent = "0" * 64
for bloc in chaine:
attendue = empreinte(precedent + bloc["paiement"])
if bloc["precedent"] != precedent or bloc["empreinte"] != attendue:
return False
precedent = bloc["empreinte"]
return True
# Chaque bloc garde l'empreinte du précédent
chaine = []
precedent = "0" * 64
for paiement in ["Camille paie Hugo 5", "Hugo paie Lea 2", "Lea paie Camille 1"]:
courante = empreinte(precedent + paiement)
chaine.append({"paiement": paiement, "precedent": precedent, "empreinte": courante})
precedent = courante
print(chaine_valide(chaine))
chaine[1]["paiement"] = "Hugo paie Lea 200"
print(chaine_valide(chaine))
Ce code relie les blocs sans les miner
Ce petit programme ne fait pas de minage : il montre seulement le lien. Il affiche True, puis False après la modification.
Le chapitre suivant ajoute une difficulté à chaque empreinte, pour qu’il soit coûteux de refaire un bloc.
L’empreinte SHA-256 de abc
docker exec jupyter sh -c "printf 'abc' | sha256sum"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.
Une lettre change : abd
docker exec jupyter sh -c "printf 'abd' | sha256sum"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.