Архитектура
NeutronX построен на CometBFT и Cosmos SDK. CometBFT отвечает за консенсус и порядок блоков, модули Cosmos SDK - за торговую логику. Главная особенность: книга ордеров и оракул встроены в сам процесс создания блока.
Стек
| Слой | Что делает |
|---|---|
| CometBFT v0.39 | Консенсус, порядок транзакций, финальность за один блок. ABCI++ позволяет приложению участвовать в сборке блока |
| Cosmos SDK v0.54 | Модули состояния: субаккаунты, ордера, оракул, governance, стейкинг, IBC |
| Хранилище | Состояние хранится в дереве IAVL. Книга ордеров и позиции также держатся в памяти и пересобираются из состояния |
Жизненный цикл блока
- Цены. В предыдущем блоке каждый валидатор подписывает vote extension с ценами из своего сайдкара оракула.
- Сборка. Пропозер агрегирует цены (медиана по стейку) и сводит ордера из мемпула. Результат он кладёт первой транзакцией блока: цены, подписи валидаторов, сделки и доказательства неверных цен.
- Проверка. Каждый валидатор заново проверяет первую транзакцию: подписи, медиану и сделки. При любом расхождении блок отклоняется.
- Начало исполнения. Применяются новые цены, затем рассчитываются сделки: маржа, комиссии, позиции. Поэтому сделки рассчитаны раньше, чем выполнятся транзакции, которые их создали.
- Транзакции пользователей. Выполняются по порядку. Ордер получает уже рассчитанные исполнения, остаток встаёт в книгу или отменяется по time-in-force.
- Конец блока. Протокольные процессы в фиксированном порядке, см. ниже.
Конец блока
- Записываются ордера транзакций, которые не прошли после сведения: их исполнения остаются в силе.
- Истекают краткосрочные ордера, ордера с good-til-block и ключи агентов.
- Записываются цены для фандинга: mark по книге, index по оракулу.
- Ликвидации.
- Расчёт делистнутых рынков, автопауза рынков с застывшей ценой и circuit breaker для пар без голосов.
- Route-депозиты из IBC и котировки vault.
- Перецена chase-ордеров, экспирация промо-ваучеров, очистка старых записей.
- Условные ордера, затем TWAP и POV.
- Фандинг по рынкам, у которых наступил интервал.
- Пересборка книги в памяти, снятие ордеров без маржи и post-only ордеров, которые забрали бы ликвидность, проверка инвариантов. При нарушении инварианта торговля останавливается.
Порядок важен. Например, ликвидации выполняются раньше условных ордеров: если в одном блоке срабатывают и ликвидация, и стоп-лосс, первой выполнится ликвидация.
Первая транзакция блока
Её собирает пропозер, а не пользователь. В ней цены, подписанные vote extensions, доказательства и сделки. Подписей у неё нет, и отправить её извне невозможно: содержимое проверяет каждый валидатор.
В поле authority стоит адрес модуля governance. Это формальное требование protobuf, а не транзакция от governance. В эксплорерах её стоит показывать как консенсусный батч, подтверждённый валидаторами.
Детерминизм
Все валидаторы должны получить побитово одинаковое состояние. Поэтому расчёты идут только в числах с фиксированной точкой, данные обходятся в отсортированном порядке, время берётся только из заголовка блока, а не из часов ноды, а цены блока фиксируются голосами предыдущего блока.