Оракул
Цены в NeutronX поставляют сами валидаторы. В каждом блоке они голосуют за цены, сеть агрегирует голоса и записывает итоговую цену. Внешнего оракула и доверенного поставщика нет.
Откуда берутся цены
Каждый валидатор запускает сайдкар оракула, который собирает котировки с нескольких бирж. Цены валидатор подписывает в vote extension своего голоса за блок. Сеть не диктует источники, она проверяет результат.
Отправить цену обычной транзакцией нельзя: цены попадают в сеть только через голоса валидаторов.
Как считается цена
- Кворум. Цена пары принимается, только если за неё проголосовали валидаторы с 66% стейка и больше. Иначе в этом блоке цена пары не обновляется.
- Медиана по стейку. Итоговая цена - точка, где накопленный стейк голосов достигает половины. Валидатор с бо́льшим стейком весит больше.
- Выбросы. Голос дальше 5% от медианы отбрасывается и считается нарушением. Подробнее - в «Консенсус и валидаторы».
Цена, использованная в блоке, получена из голосов предыдущего блока.
Где используется цена
Цена оракула - единственная mark-цена в протоколе. По ней считаются маржа, ликвидации и срабатывание условных ордеров. Цену сделки она не задаёт: сделки всегда идут по ценам ордеров в книге.
Защитные механизмы
| Ситуация | Порог | Что происходит |
|---|---|---|
| Цена устарела | Старше 10 блоков | Рынок автоматически ставится на паузу, ликвидации по нему откладываются. Торговля возобновляется сама, когда цена снова свежая |
| Нет голосов | 50 блоков без новой цены | Срабатывает circuit breaker |
| Скачок цены | Больше 30% от текущей цены | Срабатывает circuit breaker, новая цена не принимается |
| Крупное движение | Больше 20% | Только событие-предупреждение, цена принимается |
Пока circuit breaker активен, цена пары не обновляется, а из ордеров принимаются только reduce-only и закрытие позиции. Он снимается автоматически, когда 120 блоков подряд новые цены держатся в пределах 30% друг от друга.
Управление
Governance может:
- поставить пару на паузу и снять паузу;
- снять circuit breaker раньше срока.
Пока пара на паузе, принимаются только reduce-only ордера и закрытие позиции, а ликвидации по ней идут сопоставлением.
Для этого есть сообщения MsgOraclePausePair, MsgOracleResumePair и MsgOracleResetCircuitBreaker.