Архітектура
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. В експлорерах її варто показувати як консенсусний батч, підтверджений валідаторами.
Детермінізм
Усі валідатори мають отримати побітово однаковий стан. Тому розрахунки йдуть лише в числах з фіксованою точкою, дані обходяться у відсортованому порядку, час береться лише із заголовка блоку, а не з годинника ноди, а ціни блоку фіксуються голосами попереднього блоку.