Execução em mundo fechado
Fechar o conjunto de instruções é apenas uma instância de um gesto que o kernel faz quatro vezes. De cada vez, o espaço do que pode acontecer é enumerado à cabeça, e o que fica de fora é recusado em vez de tratado.Operações
Uma carga que não pertence ao conjunto enumerado — recusada na validação, não em tempo de execução
O que foi realmente pedido
Verdade
Tratar o conjunto de trabalho do bloco como autoritativo. É um diário; a fonte é o estado do motor
O que é verdade neste momento
Entradas
Tudo o que pode diferir entre duas máquinas: relógio, entropia, vírgula flutuante, ordem de hash
Se outro nó obtém os mesmos bytes
Causalidade
Uma alteração de estado sem dono. Os efeitos que não pertencem a nenhuma transação passam por um canal de sistema, não por uma exceção
Porque aconteceu esta alteração em concreto
Fechado
Recusado
Assim o ledger consegue responder
Quatro fechos, um só gesto: enumerar o espaço à cabeça e recusar o que fica de fora.
O conjunto de instruções
Tudo o que um participante ou um validador pode fazer é uma de um conjunto fixo de operações tipadas:
Uma transação cujo payload não pertença a este conjunto é rejeitada na validação. O conjunto só muda por atualização do protocolo, nunca por se instalar algo novo.
Executar um bloco
A execução é uma sequência fixa de fases. A ordem não é um detalhe de implementação — é o que determina se uma liquidação forçada vê o preço que a ativou e se um cancelamento chega antes de uma ordem agressora que entra.Preçofixar as marcações do bloco
Cargaingerir as contas e ordens do bloco
Fundingacertar o funding
Riscodesalavancagem de vaults → liquidação → ADL
Matchingpré → matching → pós
Finalizarrecolher saídas, eliminar estado morto
As fases seguintes raciocinam sobre um preço por instrumento, não um em movimento
Acertado sobre as posições como carregadas, não como acabam
O fluxo forçado resolve-se antes de se admitir novo fluxo discricionário
Correr depois do Risco impede o front-running de uma liquidação por uma ordem do mesmo bloco
Posições zeradas e contas esvaziadas não persistem
Um bloco, seis fases
O que a posição determina
As ordens condicionais são varridas dentro desta sequência: uma ativação pelas marcações deste bloco produz efeito neste bloco e não no seguinte.
O facto de a liquidação correr antes do matching é a razão pela qual não é possível fazer front-running a uma liquidação com uma ordem do mesmo bloco. O fluxo de liquidação já está resolvido quando as ordens discricionárias são cruzadas.
Dois tipos de estado
O kernel mantém uma separação estrita entre o que persiste e o que é rascunho.enquanto o bloco executa
Estado do motormercados · contas · livros · posições · câmara de compensaçãopersiste entre blocos
Conjunto de trabalhomarcações · contas tocadas · execuções · resultadosdura apenas um bloco
Estado confirmado da cadeiaversionado · autenticadoa autoridade
É fácil confundir o registo de alterações com autoridade. O que mudou num bloco constrói saída determinista — não é onde o estado vive.
autoridade de onde o motor é reconstruído
ler
aplicar
materializar
Porque o resultado é reproduzível
Aqui o determinismo é imposto, não esperado. Todos os nós honestos que executem o mesmo bloco sobre o mesmo estado anterior produzem o mesmo resultado byte a byte, porque nada no caminho de execução pode ler o que quer que seja que difira entre nós:- Aritmética de vírgula fixa em todo o lado. O cálculo da liquidação financeira corre em vírgula fixa inteira com semântica de arredondamento explícita — por excesso em expoentes negativos na margem, por defeito e por excesso nas comissões. Não há vírgula flutuante no caminho da liquidação financeira, porque uma diferença de arredondamento entre duas máquinas é um fork.
- Sem relógio de parede. A ordenação dentro de um bloco usa a posição canónica confirmada pelo consenso e a data/hora do bloco, nunca a hora local.
- Sem aleatoriedade em tempo de execução. Tudo o que precise de aleatoriedade deriva-a de forma determinista do estado da cadeia.
- Iteração determinista. Qualquer coleção cuja ordem de iteração seja observável na saída é ordenada, não aleatorizada por hash.
As fórmulas de risco são puras
As fórmulas que decidem requisitos de margem, preços de liquidação, seleção para desalavancagem, comissões e limites de open interest (posições em aberto) são implementadas como funções puras e sem estado. Recebem valores e devolvem valores; não leem nem alteram o estado do ledger. As alterações de estado são conduzidas exclusivamente pela câmara de compensação, que chama essas funções e aplica os resultados. Os módulos que detêm estado — contas, posições, livros de ordens — armazenam dados e expõem mutadores, mas não conduzem eles próprios o fluxo de negócio. Esta fronteira é deliberada. Significa que um cálculo de margem pode ser verificado isoladamente contra uma tabela de entradas e saídas, e significa que existe exatamente um caminho de código pelo qual o saldo de alguém pode mudar.Saída
A execução produz escritas de estado e eventos, cada um ligado à transação que o causou, mais um canal para efeitos ao nível do sistema que não pertencem a nenhuma transação de utilizador — funding, movimentos do fundo de seguro, contadores de bloco. Estes tornam-se as saídas de transação que a camada de estado confirma e o indexador serve. Nada do que acontece dentro do kernel é invisível a jusante. Se alterou estado, está na saída de alguém ou no canal do sistema.Para onde ir a seguir
Matching
O livro de ordens, a prioridade preço-tempo e como se resolvem a validade da ordem e a prevenção de autonegociação.
Câmara de compensação
O único caminho pelo qual saldos, posições e margem mudam.
Modelo de estado
Em que se torna a saída do kernel depois de confirmada.
IntentionBFT
De onde vieram a ordenação e os preços.