Исполнение в замкнутом мире
Замкнуть набор инструкций — лишь один случай движения, которое ядро совершает четырежды. Каждый раз пространство возможного перечисляется заранее, а всё, что вне его, отвергается, а не обрабатывается.Операции
Полезная нагрузка вне перечисленного набора — отклоняется на валидации, а не во время исполнения
Что именно было запрошено
Истина
Считать поблочный рабочий набор авторитетным. Это журнал; источник — состояние движка
Что верно прямо сейчас
Входы
Всё, что может отличаться на двух машинах: часы, энтропия, плавающая точка, порядок хеширования
Получит ли другой узел те же байты
Причинность
Изменение состояния без хозяина. Эффекты, не принадлежащие ни одной пользовательской транзакции, идут по системному каналу, а не по исключению
Почему произошло именно это изменение
Замкнуто
Отвергается
И потому реестр отвечает
Четыре замыкания, одно движение: перечислить пространство заранее и отвергнуть всё, что вне его.
Набор инструкций
Всё, что может сделать участник или валидатор, — это одна из операций фиксированного типизированного набора:
Транзакция, полезная нагрузка которой не входит в этот набор, отклоняется на валидации. Набор меняется только обновлением протокола, но никак не развёртыванием чего-то нового.
Исполнение блока
Исполнение — фиксированная последовательность стадий. Их порядок не деталь реализации: именно он решает, увидит ли ликвидация вызвавшую её цену и опередит ли отмена входящий агрессивный ордер.Ценафиксация маркировочных цен
Загрузкасчета и ордера блока
Расчёт финансированияпотоки платежей
Рискделеверидж волтов → ликвидация → ADL
Сопоставлениедо → сопоставление → после
Финализациясбор выходных данных, очистка
Каждая следующая стадия работает с одной ценой на инструмент, а не с движущейся
Расчёт по позициям в том виде, в каком они загружены
Принудительный поток отрабатывает раньше, чем допускается дискреционный
Работа после стадии «Риск» — причина того, что ликвидацию нельзя опередить ордером того же блока
Обнулённые позиции и опустевшие счета не сохраняются
Один блок, шесть стадий
Что решает это место
Условные ордера просматриваются и продвигаются внутри этой последовательности, поэтому срабатывание по ценам этого блока действует в нём же, а не в следующем.
Именно потому, что ликвидация идёт до сопоставления, её нельзя опередить ордером в том же блоке. К моменту сопоставления дискреционных ордеров ликвидационный поток уже отработал.
Два вида состояния
Ядро строго разделяет то, что сохраняется, и то, что остаётся черновиком.пока исполняется блок
Состояние движкарынки · счета · стаканы · позиции · клиринговая палатаживёт между блоками
Рабочий набор блокацены · затронутые счета · исполнения · выходные данныеживёт один блок
Зафиксированное состояниепо версиям · аутентифицированоисточник истины
Отслеживание изменений легко принять за источник истины. Изменения за блок дают детерминированные выходные данные, но состояние живёт не там.
источник истины для восстановления движка
чтение
применение
материализация
Почему результат воспроизводим
Детерминированность здесь обеспечивается принудительно, а не берётся на веру. Каждый честный узел, исполняющий один и тот же блок поверх одного и того же предыдущего состояния, получает побайтово одинаковый результат, потому что ничто на пути исполнения не может прочитать ничего, что различается между узлами:- Арифметика с фиксированной запятой везде. Расчётная математика работает на целочисленной фиксированной запятой с явной семантикой округления: округление вверх при отрицательных показателях в марже, вниз и вверх — в комиссиях. На пути расчётов нет плавающей запятой, потому что расхождение в округлении между двумя машинами — это форк.
- Никаких системных часов. Порядок внутри блока определяется канонической позицией, зафиксированной консенсусом, и отметкой времени блока, но никогда локальным временем.
- Никакой случайности во время исполнения. Всё, чему нужна случайность, выводит её детерминированно из состояния блокчейна.
- Детерминированный обход. Любая коллекция, порядок обхода которой виден в выходных данных, отсортирована, а не рандомизирована по хешу.
Формулы риска — чистые функции
Формулы, которые определяют маржинальные требования, цены ликвидации, отбор для делевериджа, комиссии и лимиты открытого интереса, реализованы как чистые функции без состояния. Они принимают значения и возвращают значения; они не читают и не изменяют состояние реестра. Изменения состояния запускает исключительно клиринговая палата: она вызывает эти функции и применяет результаты. Модули, которые держат состояние — счета, позиции, стаканы заявок, — хранят данные и предоставляют операции изменения, но сами не управляют бизнес-логикой. Это намеренная граница. Она означает, что маржинальный расчёт можно проверить изолированно по таблице входов и выходов, и что существует ровно один путь в коде, по которому может измениться чей-либо баланс.Выходные данные
Исполнение порождает записи состояния и события, каждое из которых привязано к вызвавшей его транзакции, плюс канал для системных эффектов, не принадлежащих ни одной пользовательской транзакции: расчёты финансирования, движения страхового фонда, счётчики блоков. Из них складываются выходные данные транзакций, которые фиксирует слой состояния и отдаёт индексатор. Ничто из происходящего внутри ядра не остаётся невидимым дальше по потоку. Если оно изменило состояние, оно есть в чьих-то выходных данных или в системном канале.Что дальше
Сопоставление
Стакан заявок, приоритет «цена — время» и то, как отрабатывают срок действия и предотвращение самосделок.
Клиринговая палата
Единственный путь, которым меняются балансы, позиции и маржа.
Модель состояния
Во что превращаются выходные данные ядра после фиксации.
IntentionBFT
Откуда взялись порядок и цены.