Esecuzione a mondo chiuso
Chiudere l’insieme di istruzioni è solo un’istanza di una mossa che il kernel compie quattro volte. Ogni volta lo spazio di ciò che può accadere è enumerato in anticipo, e ciò che ne resta fuori viene rifiutato anziché gestito.Operazioni
Un payload che non appartiene all’insieme enumerato: rifiutato in validazione, non a runtime
Che cosa è stato davvero chiesto
Verità
Trattare come autorevole il working set del blocco. Quello è un giornale; la fonte è lo stato del motore
Che cosa è vero adesso
Input
Tutto ciò che può differire fra due macchine: orologio, entropia, virgola mobile, ordine di hash
Se un altro nodo ottiene gli stessi byte
Causalità
Un cambiamento di stato senza titolare. Gli effetti che non appartengono a nessuna transazione passano da un canale di sistema, non da un’esenzione
Perché è avvenuto proprio questo cambiamento
Chiuso
Rifiutato
Così il ledger può rispondere
Quattro chiusure, una sola mossa: enumerare lo spazio in anticipo e rifiutare ciò che ne resta fuori.
L’insieme di istruzioni
Tutto ciò che un partecipante o un validatore può fare rientra in un insieme fisso di operazioni tipizzate:
Una transazione il cui payload non appartiene a questo insieme viene rifiutata in fase di validazione. L’insieme cambia solo con un aggiornamento di protocollo, mai mettendo in produzione qualcosa di nuovo.
Eseguire un blocco
L’esecuzione è una sequenza fissa di fasi. L’ordine non è un dettaglio implementativo: è ciò che determina se una liquidazione vede il prezzo che l’ha innescata e se un annullamento batte un ordine aggressivo in arrivo.Prezzofissa i mark del blocco
Caricoacquisisce conti e ordini del blocco
Fundingregola il funding
Rischiodeleveraging vault → liquidazione → ADL
Matchingpre-match → matching → post-match
Finalizzazioneraccoglie output, pulisce stato morto
Ogni fase a valle ragiona su un prezzo per strumento, non su uno in movimento
Regolato sulle posizioni come caricate, non come finiscono
Il flusso forzato è risolto prima che entri quello discrezionale
Girando dopo Rischio, una liquidazione non è anticipabile da un ordine dello stesso blocco
Posizioni azzerate e conti svuotati non persistono
Un blocco, sei fasi
Che cosa determina la posizione
Gli ordini condizionati sono scanditi e fatti avanzare in questa sequenza: un’attivazione scattata dai mark di questo blocco ha effetto qui, non nel blocco successivo.
Il fatto che la liquidazione giri prima del matching è la ragione per cui una liquidazione non può essere anticipata da un ordine nello stesso blocco. Il flusso di liquidazione è già risolto nel momento in cui gli ordini discrezionali vengono incrociati.
Due tipi di stato
Il kernel mantiene una separazione rigida tra ciò che persiste e ciò che è temporaneo.esecuzione del blocco
Stato del motoremercati · conti · book · posizioni · stanza di compensazionevive tra i blocchi
Working set del bloccomark · conti toccati · esecuzioni · output in corsovive per un blocco
Stato della catenaversionato · autenticatol’autorità
Tracciare le modifiche è facile da scambiare per autorità. Ciò che cambia in un blocco costruisce output deterministico — non è dove risiede lo stato.
l’autorità da cui il motore è ricostruito
lettura
applica
materializza
Perché il risultato è riproducibile
Qui il determinismo è imposto, non sperato. Ogni nodo onesto che esegue lo stesso blocco sullo stesso stato precedente produce lo stesso risultato byte per byte, perché nulla sul percorso di esecuzione può leggere qualcosa che differisca da nodo a nodo:- Aritmetica a virgola fissa ovunque. I calcoli di regolamento girano su interi a virgola fissa con semantica di arrotondamento esplicita: per eccesso sugli esponenti negativi nel margine, per difetto e per eccesso sulle commissioni. Sul percorso di regolamento non c’è virgola mobile, perché una differenza di arrotondamento tra due macchine è un fork.
- Nessun orologio di sistema. L’ordinamento dentro un blocco usa la posizione canonica confermata dal consenso e il timestamp del blocco, mai l’ora locale.
- Nessuna casualità a runtime. Tutto ciò che richiede casualità la deriva in modo deterministico dallo stato della catena.
- Iterazione deterministica. Ogni collezione il cui ordine di iterazione è osservabile nell’output è ordinata, non randomizzata sull’hash.
Le formule di rischio sono pure
Le formule che decidono requisiti di margine, prezzi di liquidazione, selezione per il deleveraging, commissioni e limiti di open interest sono implementate come funzioni pure e senza stato. Prendono valori e restituiscono valori; non leggono né modificano lo stato del ledger. I cambiamenti di stato sono guidati esclusivamente dalla stanza di compensazione, che chiama quelle funzioni e ne applica i risultati. I moduli che detengono stato — conti, posizioni, book degli ordini — memorizzano dati ed espongono mutatori, ma non guidano da soli il flusso applicativo. È un confine deliberato. Significa che un calcolo di margine si può verificare in isolamento su una tabella di input e output, e significa che esiste esattamente un percorso di codice attraverso cui il saldo di chiunque può cambiare.Output
L’esecuzione produce scritture di stato ed eventi, ciascuno legato alla transazione che lo ha causato, più un canale per gli effetti a livello di sistema che non appartengono a nessuna singola transazione utente: funding, movimenti del fondo assicurativo, contatori di blocco. Diventano gli output di transazione che il livello di stato conferma e l’indexer serve. Niente di ciò che accade dentro il kernel è invisibile a valle. Se ha cambiato lo stato, è nell’output di qualcuno o nel canale di sistema.Dove proseguire
Matching
Il book degli ordini, la priorità prezzo-tempo e come si risolvono validità dell’ordine e prevenzione dell’auto-negoziazione.
Stanza di compensazione
L’unica strada attraverso cui cambiano saldi, posizioni e margine.
Modello di stato
Che cosa diventa l’output del kernel una volta confermato.
IntentionBFT
Da dove arrivano l’ordinamento e i prezzi.