Архитектура

NeutronX построен на CometBFT и Cosmos SDK. CometBFT отвечает за консенсус и порядок блоков, модули Cosmos SDK - за торговую логику. Главная особенность: книга ордеров и оракул встроены в сам процесс создания блока.

Стек

СлойЧто делает
CometBFT v0.39Консенсус, порядок транзакций, финальность за один блок. ABCI++ позволяет приложению участвовать в сборке блока
Cosmos SDK v0.54Модули состояния: субаккаунты, ордера, оракул, governance, стейкинг, IBC
ХранилищеСостояние хранится в дереве IAVL. Книга ордеров и позиции также держатся в памяти и пересобираются из состояния

Жизненный цикл блока

  1. Цены. В предыдущем блоке каждый валидатор подписывает vote extension с ценами из своего сайдкара оракула.
  2. Сборка. Пропозер агрегирует цены (медиана по стейку) и сводит ордера из мемпула. Результат он кладёт первой транзакцией блока: цены, подписи валидаторов, сделки и доказательства неверных цен.
  3. Проверка. Каждый валидатор заново проверяет первую транзакцию: подписи, медиану и сделки. При любом расхождении блок отклоняется.
  4. Начало исполнения. Применяются новые цены, затем рассчитываются сделки: маржа, комиссии, позиции. Поэтому сделки рассчитаны раньше, чем выполнятся транзакции, которые их создали.
  5. Транзакции пользователей. Выполняются по порядку. Ордер получает уже рассчитанные исполнения, остаток встаёт в книгу или отменяется по time-in-force.
  6. Конец блока. Протокольные процессы в фиксированном порядке, см. ниже.

Конец блока

  1. Записываются ордера транзакций, которые не прошли после сведения: их исполнения остаются в силе.
  2. Истекают краткосрочные ордера, ордера с good-til-block и ключи агентов.
  3. Записываются цены для фандинга: mark по книге, index по оракулу.
  4. Ликвидации.
  5. Расчёт делистнутых рынков, автопауза рынков с застывшей ценой и circuit breaker для пар без голосов.
  6. Route-депозиты из IBC и котировки vault.
  7. Перецена chase-ордеров, экспирация промо-ваучеров, очистка старых записей.
  8. Условные ордера, затем TWAP и POV.
  9. Фандинг по рынкам, у которых наступил интервал.
  10. Пересборка книги в памяти, снятие ордеров без маржи и post-only ордеров, которые забрали бы ликвидность, проверка инвариантов. При нарушении инварианта торговля останавливается.

Порядок важен. Например, ликвидации выполняются раньше условных ордеров: если в одном блоке срабатывают и ликвидация, и стоп-лосс, первой выполнится ликвидация.

Первая транзакция блока

Её собирает пропозер, а не пользователь. В ней цены, подписанные vote extensions, доказательства и сделки. Подписей у неё нет, и отправить её извне невозможно: содержимое проверяет каждый валидатор.

В поле authority стоит адрес модуля governance. Это формальное требование protobuf, а не транзакция от governance. В эксплорерах её стоит показывать как консенсусный батч, подтверждённый валидаторами.

Детерминизм

Все валидаторы должны получить побитово одинаковое состояние. Поэтому расчёты идут только в числах с фиксированной точкой, данные обходятся в отсортированном порядке, время берётся только из заголовка блока, а не из часов ноды, а цены блока фиксируются голосами предыдущего блока.