Skip to main content
In un motore di negoziazione tre cose diverse si chiamano tutte «stato», e confonderle è il modo in cui i sistemi finiscono per dare risposte che dipendono da chi interroghi. Questa pagina le separa e dice quale fa fede.

Tre rappresentazioni

Stato del motoremercati · conti · posizioni · book · stanza di compensazionedura tra i blocchi · una ricostruzione
Working set del bloccoprezzi mark · conti toccati · esecuzioni · outputdura un solo blocco · un giornale
Stato della catenachiave-valore versionato, autenticato da Merklefa fede
Il guasto che previeneUn motore la cui vista in memoria si è discostata da ciò che è stato consolidato continua a servire risposte, e ognuna è sbagliata in un modo che salta fuori solo al regolamento.
lo stato del motore deve essere derivabile dal registro consolidato, mai il contrario
Lo stato del motore è ciò che il kernel tiene fra un blocco e l’altro: metadati dei mercati, conti, posizioni, book degli ordini, stato degli strumenti, stato della stanza di compensazione. È la rappresentazione di lavoro, disposta per gli schemi di accesso che matching e compensazione hanno davvero, non per l’archiviazione. Il working set del blocco esiste solo mentre un blocco viene eseguito: i prezzi mark fissati all’inizio, quali conti e quali ordini sono stati toccati, le esecuzioni prodotte, gli output in costruzione. È un giornale di ciò che è successo durante questo blocco. Lo stato della catena è il risultato consolidato: voci chiave-valore versionate, autenticate da una struttura di Merkle, durevoli e rieseguibili. È ciò che un nodo sincronizza, ciò contro cui si fa una prova, e ciò che legge un indexer. Fa fede lo stato della catena. Il working set del blocco è un giornale usato per costruire output deterministico, non una fonte di verità. Lo stato del motore è una ricostruzione dello stato della catena ottimizzata per l’esecuzione: deve essere derivabile dal registro consolidato, mai il contrario. Invertire i due è un guasto preciso e riconoscibile: un motore la cui vista in memoria si è discostata da ciò che è stato consolidato continuerà a servire risposte, e ognuna sarà sbagliata in un modo che salta fuori solo al regolamento.

Chiavi

Lo stato della catena è indirizzato per chiave. Lo stato di negoziazione è raggruppato in namespace con un nome e una versione esplicita: per esempio la configurazione delle commissioni, l’indice dei contratti perpetui, la tabella dei livelli di leva, l’elenco dei ruoli amministrativi. Il suffisso di versione non è un ornamento. Quando cambia la forma di una configurazione, questa passa a una nuova versione della propria chiave, e la chiave precedente viene conservata perché lo stato scritto con il vecchio schema resti leggibile durante la migrazione. Un lettore che cabla nel codice una versione e non ricontrolla mai leggerà in silenzio una configurazione superata dopo una migrazione; un lettore che risolve la chiave corrente no.
Per questo la configurazione va letta dalla catena e non fissata nel codice del client. Il servizio dei livelli commissionali rilegge a ogni ciclo la configurazione delle commissioni in vigore esattamente per questo motivo: una tabella dei livelli cablata dentro un client è una tabella che prima o poi non coinciderà con quella che la rete applica.

Versioni

Ogni blocco consolidato fa avanzare una versione. I valori di stato sono memorizzati insieme alla versione in cui sono stati scritti: l’archivio non è soltanto «lo stato corrente», ma «lo stato a qualsiasi versione». È questa proprietà a rendere possibili più cose insieme:
  • Le prove possono essere prodotte contro una versione specifica e non solo contro il presente.
  • Il replay può partire da qualsiasi versione, non solo dal genesis.
  • Le letture possono essere storiche: un indexer che ricostruisce la storia di una posizione chiede versioni vecchie, non scorre un log.
  • Il pruning diventa una decisione di policy su quanto indietro conservare, invece di un limite strutturale.

Che cosa finisce consolidato

L’esecuzione del kernel produce due cose per blocco. Ogni transazione porta con sé scritture ed eventi propri, che le restano legati. Gli effetti che non appartengono a nessuna singola transazione utente — flussi di funding, movimenti del fondo assicurativo, contatori a livello di blocco — vanno su un canale di sistema dedicato. Fra i due non si perde nulla. Non esiste un effetto di esecuzione dentro il kernel che manchi sia dall’output di una transazione sia dal canale di sistema. È questa completezza a permettere di trattare il registro consolidato come la storia intera e non come un suo riassunto, ed è la ragione per cui un evento può essere ricondotto alla transazione che lo ha causato anche quando il matching è stato eseguito a lotti.

Dove proseguire

Archiviazione e prove

Come lo stato consolidato è archiviato fisicamente, autenticato e sottoposto a pruning.

Sincronizzazione dello stato

Come un nodo che non ha mai visto la catena riesce a mettersi in pari.

IntentionKernel

Dove risiedono lo stato del motore e il working set del blocco.

Indexer

Trasformare lo stato consolidato in qualcosa di interrogabile.