Plus facile à lire avec un fond crème, une teinte, plus de contraste ou un texte plus grand ? Choisissez vos couleurs et votre texte, une fois pour toutes les pages.

Leçon gratuite

Chaîne de blocs et hachage

Après cette leçon: Je peux relier des blocs par leur empreinte pour qu’une modification soit détectable.

Leçon de 55 min4 commandesLab blockchain : une chaîne jouet en Python à lire, casser, miner et signer

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

MotCe que ça veut direExemple
Blocun paquet d’enregistrements, avec l’empreinte du bloc précédent
Empreintele résumé de taille fixe qu’un hachage calcule à partir de donnéesSHA-256
Chaîne de blocsdes blocs rangés dans l’ordre, chacun relié au précédent
Bloc de genèsele premier bloc : il n’a rien avant lui
Vérifierrecalculer 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

Commande
docker exec jupyter python3 steps/link.py

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.

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

Commande
docker exec jupyter python3 steps/tamper.py

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.

Exemple travaillé : ce que le script affiche

ÉtapeRéponse de la vérificationPourquoi
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

Code: 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

Commande
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

Commande
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.

À propos de ce labo et de sa source: Lab blockchain : une chaîne jouet en Python à lire, casser, miner et signer

Vous enseignez à une classe ? Proposez ce module à vos étudiants avec un guide de l'enseignant, des devoirs corrigés et un laboratoire pour chaque étudiant.