Skip to main content
Trois choses différentes reçoivent le nom d’« état » dans un moteur de trading, et c’est en les confondant qu’un système finit par donner des réponses qui dépendent de la personne interrogée. Cette page les sépare et dit laquelle fait autorité.

Trois représentations

État du moteurmarchés · comptes · positions · carnets · chambre de compensationvit entre les blocs · une reconstruction
Ensemble de travailmarquages · comptes touchés · exécutions · sortievit le temps d’un bloc · un journal
État de la chaîneclé-valeur versionné, authentifié Merklel’autorité
La défaillance évitéeUn moteur dont la vue en mémoire a dérivé de ce qui a été entériné continue de servir des réponses, toutes fausses d’une façon qui n’apparaît qu’au règlement.
l’état du moteur doit être dérivable du registre entériné, jamais l’inverse
L’état du moteur est ce que le noyau conserve entre les blocs : métadonnées de marché, comptes, positions, carnets d’ordres, état des instruments, état de la chambre de compensation. C’est la représentation de travail — organisée selon les schémas d’accès réels de l’appariement et de la compensation, pas selon les besoins du stockage. L’ensemble de travail du bloc n’existe que pendant l’exécution d’un bloc : les prix de marquage fixés au départ, les comptes et les ordres touchés, les exécutions produites, les sorties en cours d’assemblage. C’est un journal de ce qui s’est passé pendant ce bloc. L’état de la chaîne est le résultat entériné : des entrées clé-valeur versionnées, authentifiées par une structure de Merkle, durables et rejouables. C’est ce qu’un nœud synchronise, ce contre quoi une preuve est établie, et ce que lit un indexeur. L’état de la chaîne fait autorité. L’ensemble de travail du bloc est un journal qui sert à construire une sortie déterministe — pas une source de vérité. L’état du moteur est une reconstruction de l’état de la chaîne optimisée pour l’exécution ; il doit être dérivable du registre entériné, jamais l’inverse. Prendre cela à l’envers produit une défaillance précise et reconnaissable : un moteur dont la vue en mémoire a dérivé de ce qui a été entériné continuera de servir des réponses, et chacune d’elles sera fausse d’une façon qui n’apparaît qu’au règlement.

Clés

L’état de la chaîne est adressé par clé. L’état de trading est regroupé dans des espaces de noms identifiés et explicitement versionnés — par exemple la configuration des frais, l’index des contrats perpétuels, la table des paliers de levier, la liste des rôles administratifs. Le suffixe de version n’est pas décoratif. Quand la forme d’une configuration change, elle passe à une nouvelle version de sa clé, et la clé précédente est conservée pour que l’état écrit sous l’ancien schéma reste lisible pendant la migration. Un lecteur qui code une version en dur et ne revérifie jamais lira silencieusement une configuration périmée après une migration ; un lecteur qui résout la clé courante, non.
C’est pourquoi la configuration devrait être lue sur la chaîne plutôt que figée dans le code client. Le service de paliers de frais lit la configuration des frais en direct à chaque cycle exactement pour cette raison — une table de paliers figée dans un client est une table qui finira par diverger de celle que le réseau applique.

Versions

Chaque bloc entériné fait avancer une version. Les valeurs d’état sont stockées avec la version à laquelle elles ont été écrites, ce qui signifie que le magasin n’est pas seulement « l’état courant » mais « l’état à n’importe quelle version ». Cette propriété rend plusieurs choses possibles à la fois :
  • Les preuves peuvent être produites contre une version précise, et pas seulement contre le présent.
  • Le rejeu peut partir de n’importe quelle version, pas seulement de la genèse.
  • Les lectures peuvent être historiques — un indexeur qui reconstruit l’historique d’une position demande d’anciennes versions, il ne parcourt pas un journal.
  • L’élagage devient une décision de politique sur la profondeur à conserver, plutôt qu’une limite structurelle.

Ce qui finit entériné

L’exécution du noyau produit deux choses par bloc. Chaque transaction porte ses propres écritures et événements, qui lui sont liés. Les effets qui n’appartiennent à aucune transaction utilisateur en particulier — flux de financement, mouvements du fonds d’assurance, compteurs au niveau du bloc — vont vers un canal système distinct. Entre les deux, rien n’est perdu. Il n’existe pas d’effet d’exécution à l’intérieur du noyau qui soit absent à la fois de la sortie d’une transaction et du canal système. Cette exhaustivité est ce qui permet de traiter le registre entériné comme l’histoire complète plutôt que comme un résumé, et c’est la raison pour laquelle un événement peut être rattaché à la transaction qui l’a causé, même quand l’appariement s’est fait par lots.

Pour aller plus loin

Stockage et preuves

Comment l’état entériné est physiquement stocké, authentifié et élagué.

Synchronisation d’état

Comment un nœud qui n’a jamais vu la chaîne la rattrape.

IntentionKernel

Où vivent l’état du moteur et l’ensemble de travail du bloc.

Indexeur

Transformer l’état entériné en quelque chose d’interrogeable.