Leçons 1/4 · 25 min
Le journal et l'état
Qu'est-ce qui est vrai : le relevé ou le solde ?
Kofi ouvre l'historique de son compte de monnaie mobile : une liste d'opérations datées, et tout en haut un solde de 90 francs. Les deux informations sont exactes, mais elles ne sont pas de même nature. Le solde se déduit de la liste ; la liste ne se déduit pas du solde. Si on ne conservait que « 90 », on ne pourrait ni expliquer pourquoi, ni détecter une erreur, ni retrouver ce qui s'est passé hier. Cette asymétrie est l'idée de tout l'atelier.
Les mots
- Un événement est un fait qui s'est produit : « crédit de 100 pour Awa », « transfert de 30 d'Awa vers Kofi ». Il a un numéro d'ordre.
- Le journal (log) est la suite ordonnée des événements. Il est append-only : on ajoute à la fin, on ne modifie ni ne supprime les entrées passées.
- L'état est le résumé à un instant donné : les soldes, le contenu des comptes. Il est dérivé du journal.
- La projection (ou rejeu) est le calcul qui passe du journal à l'état : on part d'un état vide et on applique chaque événement dans l'ordre. En formule : état après l'événement k = règle(état après k - 1, événement k).
Un exemple suivi
Deux comptes démarrent à 0 (Awa, Kofi). Voici six événements, avec la règle « un débit ou un transfert qui rendrait un solde négatif est rejeté : sans effet, mais il reste dans le journal ».
| N° | Événement | Effet | Awa | Kofi |
|---|---|---|---|---|
| 1 | CREDIT Awa 100 | accepté | 100 | 0 |
| 2 | CREDIT Kofi 50 | accepté | 100 | 50 |
| 3 | TRANSFER Awa → Kofi 30 | accepté | 70 | 80 |
| 4 | DEBIT Kofi 100 | rejeté (80 < 100) | 70 | 80 |
| 5 | DEBIT Awa 20 | accepté | 50 | 80 |
| 6 | CREDIT Kofi 10 | accepté | 50 | 90 |
L'état final est Awa = 50, Kofi = 90. Vérification de cohérence : crédits acceptés 100 + 50 + 10 = 160, débits acceptés 20, 160 - 20 = 140 = 50 + 90. Le transfert ne crée ni ne détruit de l'argent : il le déplace.
Pourquoi garder les deux ?
| Journal | État | |
|---|---|---|
| Répond à | « que s'est-il passé, dans quel ordre ? » | « combien a-t-on maintenant ? » |
| Coût d'une lecture de solde | O(n) : rejouer tout le journal | O(1) : un accès par clé dans un dictionnaire (atelier 102) |
| Modification | jamais : on ajoute | à chaque événement |
| Si on le perd | l'historique est perdu | on le reconstruit depuis le journal |
On peut donc jeter l'état et le recalculer, mais pas l'inverse. C'est la raison pour laquelle les systèmes qui doivent rendre des comptes (banques, registres, blockchains) traitent le journal comme la source de vérité et l'état comme un confort de lecture.
L'approche opposée, qui écrase la valeur en place (« mettre le solde à 90 »), ne conserve aucune trace : une erreur ou une fraude ne laisse rien à examiner.
Ce que cela ne garantit pas
- Un journal append-only n'est « en ajout seulement » que si le logiciel et les droits d'accès l'imposent. Quelqu'un qui peut écrire dans le fichier peut modifier le passé ; nous le verrons dans l'exercice de sécurité.
- Le journal peut contenir des événements faux (un crédit qui n'aurait pas dû avoir lieu). Rejouer reconstruit fidèlement ce qui y est écrit, pas ce qui est vrai dans le monde.
- Si un bogue fait diverger l'état du journal, c'est le journal qui fait foi : on rejoue.
À retenir
Journal = faits ordonnés, ajoutés à la fin. État = résumé dérivé, reconstructible. Un événement rejeté reste au journal. La fiabilité du journal repose sur ce qui l'empêche d'être modifié, pas sur le mot « append-only ».
