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

Registre, transactions et soldes

Après cette leçon: Je peux calculer des soldes à partir d’une liste de transactions et refuser un paiement trop grand.

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

Comment calcule-t-on un solde à partir de transactions ?

Un registre garde la liste des opérations, pas les soldes. Pour connaître le solde de chacun, on rejoue les opérations depuis le début, dans l’ordre.

Cette méthode permet de refuser un paiement plus grand que ce que l’on possède. C’est la parade contre la double dépense.

À la fin de cette leçon

Remarque

Je peux calculer des soldes à partir d’une liste de transactions et refuser un paiement trop grand.

Mots-clés

MotCe que ça veut dire
Registrela liste, dans l’ordre, de toutes les opérations enregistrées
Transactionun paiement : qui paie, qui reçoit, quel montant
Soldece que possède quelqu’un à un moment donné, calculé et non stocké
Double dépensedépenser deux fois la même somme
Refuséeune transaction que le registre n’accepte pas, car le solde est trop bas

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

Un solde se calcule en rejouant les transactions

Pensez à un relevé de compte : chaque ligne est un mouvement. Le solde est la somme des lignes depuis l’ouverture.

Dans un registre, personne ne note « Camille possède 8 € ». On note les paiements. Pour connaître le solde, on part des montants de départ et on applique chaque paiement, un par un.

Exemple travaillé : un paiement refusé

OrdrePaiementCamilleHugoLéaDécision
Départ2050
1Camille paie Hugo 128170Acceptée
2Camille paie Léa 98170Refusée : Camille n’a que 8
3Hugo paie Léa 108710Acceptée

Les cellules que les étudiants remplissent restent vides dans cet aperçu.

La double dépense : deux fois la même somme

Camille a 20. Elle tente de payer 12 à Hugo et 9 à Léa dans la même minute. Si le registre acceptait les deux, elle aurait dépensé 21 avec 20.

Le registre les range dans un ordre et applique la règle : un paiement plus grand que le solde est refusé. Le deuxième saute.

Rejouer des paiements, sans le contrôle

Code: python
depart = {"Camille": 20, "Hugo": 5}
paiements = [
    {"de": "Camille", "vers": "Hugo", "montant": 12},
    {"de": "Camille", "vers": "Lea", "montant": 9},
]

soldes = {}
for nom in depart:
    soldes[nom] = depart[nom]

for p in paiements:
    # Ici rien ne vérifie le solde : ajoutez un if pour refuser un paiement trop grand
    soldes[p["de"]] = soldes[p["de"]] - p["montant"]
    if p["vers"] not in soldes:
        soldes[p["vers"]] = 0
    soldes[p["vers"]] = soldes[p["vers"]] + p["montant"]

print(soldes)

Sans contrôle, un solde devient négatif

Le programme affiche {'Camille': -1, 'Hugo': 17, 'Lea': 9}. Camille a dépensé 21 avec 20 : son solde est négatif, ce qui est impossible.

Ajoutez un if avant la ligne qui retire le montant. Si le solde est trop petit, mettez le paiement de côté et passez au suivant.

L’ordre décide de la transaction refusée

Si l’ordre est inversé, c’est l’autre paiement qui passe. Camille paie d’abord 9 à Léa : accepté, il lui reste 11. Puis 12 à Hugo : refusé.

Le résultat dépend donc de l’ordre. Tous les participants doivent s’accorder sur le même ordre : c’est tout le sujet du consensus, dans deux leçons.

Le labo rejoue quatre paiements

Le script balances.py du labo part de trois soldes et rejoue quatre paiements. Attention : il écrit des mots anglais, comme « balances » (les soldes) et « refused » (refusé).

Observez les soldes à la fin et le paiement qui a sauté. Ses chiffres sont ceux du labo, pas ceux de notre tableau.

Rejouer les paiements du labo

Commande
docker exec jupyter python3 steps/balances.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.

Erreur fréquente

Attention

On croit qu’une chaîne valide ne contient que des paiements permis. C’est faux : la chaîne dit seulement que rien n’a été modifié depuis. Savoir si un paiement est permis demande un autre contrôle, celui du registre : le solde est-il suffisant ?

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