Skip to main content
L’état entériné doit satisfaire deux exigences qui tirent en sens contraire. L’exécution veut la valeur courante d’une clé, vite, des millions de fois. La vérification veut une preuve qu’une valeur était bien celle que le réseau annonce, à une version donnée. Servir les deux depuis une seule structure revient à mal faire les deux. Le stockage découpe donc le problème entre des magasins distincts, chacun taillé pour son propre schéma d’accès.

Trois magasins

Bloc entériné
Magasin du registretransactions · sorties · événements · écritures · accumulateurs · métadonnées
Rejeu et audit
Magasin KV d’étatvaleurs courantes et historiques, seize partitions, état chaud à part
Requêtes et exécution
Magasin Merkle d’étatun arbre de Merkle creux versionné, plus les index des nœuds remplacés
Vérification — preuves
Une lecture qui ne veut qu’une valeur ne paie pas le parcours d’un arbre, et une preuve ne vient pas d’un magasin optimisé pour les accès ponctuels.
Le magasin du registre contient l’historique de la chaîne : les transactions, leurs sorties et données auxiliaires, les événements, les ensembles d’écritures, les métadonnées de bloc et les accumulateurs. C’est ce que l’on rejoue. Le magasin KV d’état contient les valeurs d’état, adressées par clé et par version. C’est ce que lisent l’exécution et les requêtes. Il est partitionné en seize, de sorte que les écritures d’un même bloc se répartissent sur seize instances RocksDB indépendantes au lieu d’entrer en contention sur une seule. L’état fréquemment consulté est en outre conservé dans son propre palier, pour que l’ensemble de travail d’un marché actif n’ait pas à être trouvé au milieu de tout ce que la chaîne a jamais stocké. Le magasin Merkle d’état contient la structure authentifiée — les nœuds de l’arbre qui permettent de prouver une valeur, et les index qui suivent quels nœuds ont été remplacés. Les séparer signifie qu’une lecture qui n’a besoin que d’une valeur ne paie pas le parcours d’un arbre, et qu’une preuve n’a pas à être reconstruite depuis un magasin optimisé pour les accès ponctuels.

Authentification

Deux structures de Merkle font des travaux différents.
Arbre de Merkle creux versionné
Accumulateurs
Votre clé et sa valeur
hash frère
hash frère
Racine d’état, entérinée par consensus
Votre transaction ou un événement
Accumulateur de transactions · d’événementschacun engage tout ce qui précède, dans l’ordre
Racine du registre entérinée
L’arbre prouve ce qu’une valeur était ; les accumulateurs, ce qui s’est passé et dans quel ordre. Ensemble ils rendent prouvable « cette transaction est dans la chaîne à cette position » sans détenir la chaîne.
Un arbre de Merkle creux versionné authentifie l’état. Chaque clé a une position déterminée par son hash, et chaque version de l’arbre partage les nœuds qui n’ont pas changé — écrire une clé dans un bloc ajoute donc un chemin, pas un arbre. La preuve d’une clé à une version donnée est le chemin qui va de la feuille de cette clé jusqu’à la racine que le réseau a entérinée. Les accumulateurs authentifient la séquence. L’un accumule les transactions, l’autre les événements, chacun produisant une racine qui engage tout ce qui a été inclus jusque-là, dans l’ordre. C’est ce qui rend prouvable, sans détenir la chaîne, l’affirmation « cette transaction est dans la chaîne à cette position ». À eux deux : l’arbre d’état prouve quelle était une valeur, les accumulateurs prouvent ce qui s’est passé et dans quel ordre.

État spéculatif

Les résultats d’un bloc existent avant d’être entérinés. Plutôt que de les écrire dans l’arbre durable puis de défaire cette écriture si le bloc n’est pas entériné, l’état non entériné est maintenu dans une surcouche de Merkle creuse en mémoire, posée sur la dernière version entérinée. L’exécution lit à travers la surcouche et voit une vue cohérente. Si le bloc est entériné, la surcouche est matérialisée. Sinon, elle est abandonnée et rien de durable n’a jamais été touché. C’est ce qui empêche l’exécution spéculative de laisser des résidus dans le stockage.

Mise en cache

Les nœuds de l’arbre sont mis en cache à deux niveaux : un cache conscient des versions, qui garde les versions récentes adressables, et sous lui un cache par éviction du moins récemment utilisé. Le schéma d’accès d’une chaîne de trading — un petit ensemble de clés chaudes touchées à chaque bloc, face à une longue traîne rarement touchée — est exactement la forme à laquelle ces caches répondent.

Élagage

Conserver toutes les versions à jamais est un choix, pas une obligation. Trois élagueurs indépendants travaillent sur les trois magasins, chacun avec sa propre politique de rétention : un sur le registre, un sur les valeurs d’état, un sur les nœuds de Merkle. Les élagueurs Merkle et de valeurs d’état sont pilotés par des index de péremption écrits en même temps que les données. Quand une version remplace un nœud ou une valeur, l’entrée remplacée est enregistrée comme périmée à cette version. L’élagage devient alors un parcours de plage sur un index plutôt qu’une recherche de déchets — celui qui écrit a déjà dit ce qui deviendrait collectable, et quand.
La rétention est une décision d’opérateur qui a de vraies conséquences. Un nœud élagué agressivement sert efficacement l’état courant et ne peut ni répondre aux requêtes historiques, ni fournir la synchronisation d’état à un nœud qui démarre de plus loin. Un nœud d’archive garde tout, et le paie. Voir Faire tourner un nœud.

Sauvegarde et restauration

Les magasins peuvent être sauvegardés et restaurés indépendamment du nœud en fonctionnement, ce qui permet de monter un nœud à partir d’un instantané plutôt que de rejouer depuis la genèse, et de vérifier l’état d’un nœud restauré contre les racines entérinées plutôt que de faire confiance à la sauvegarde.

Pour aller plus loin

Synchronisation d’état

Comment un nœud rattrape la chaîne sans la rejouer en entier.

Modèle d’état

Ce qui est stocké, et quelle représentation fait autorité.

Indexeur

Reconstruire l’historique à partir des enregistrements entérinés.

Faire tourner un nœud

Les rôles de nœud, et comment demander à en opérer un.