Отчёт об инциденте в работе сети 1 июня 2025 года
@mirka23Кратко:
- 1 июня 2025 года с 12:15 UTC до 13:22 UTC выпуск блоков в мастерчейне основной сети TON был приостановлен.
- Причиной приостановки стала ошибка в ПО валидаторов TON, случайно внесённая с обновлением «Dispatch Queue» в августе 2024 года. Ошибка не была обнаружена ни в ходе тестирования командой, ни в тестовой сети, ни в основной сети до настоящего момента.
- Системы мониторинга оперативно зафиксировали проблему, команда выявила причину и выпустила исправление, полностью устраняющее сбой.
- Для восстановления выпуска блоков было достаточно обновить лишь небольшое количество валидаторов. Это связано с тем, что ошибка находилась на этапе создания блока, а не его проверки, и создающие блок валидаторы постоянно ротируются. Команда связалась с рядом известных операторов нод, включая Tonwhales, Tonstakers, Unit 410 и Twinstake.
- После установки патча выпуск блоков возобновился, все отложенные транзакции были обработаны. Потерь сообщений, TON’ов, жетонов или других активов не произошло.
- Патч будет объединен с основной веткой на неделе, однако остальным валидаторам можно не обновляться немедленно и дождаться следующего планового обновления узлов.
- Чтобы предотвратить подобные проблемы в будущем, мы расширили процесс тестирования обновлений узлов, добавив новые тест-кейсы для мастерчейна.
Введение
Во время создания блоков мастерчейна коллаторы обрабатывают сообщения в несколько этапов, включая перемещение сообщений из Dispatch Queue в OutMsgQueue в начале генерации блока. В частности, эта обработка влияет на значение max_lt блока, тогда как некоторые governance контракты должны исполняться первыми и полагаются на точное значение max_lt, соответствующее первой транзакции в блоке. Такое поведение коллаторов (компонента создания блоков в узле) привело к попытке сгенерировать блок с tick-транзакцией, у которой lt был чрезмерно завышен. В результате все предложения по новому блоку мастерчейна были отклонены, и выпуск блоков остановился.
Хронология
- 1 июня, 12:15:31 UTC
Коллаторы начали формировать следующий блок мастерчейна после (-1,8000000000000000,48400109). Во время обработки Dispatch Queue сообщения были перемещены в OutMsgQueue, но из-за ошибки current_lt tick-транзакции был неправильно увеличен сверх начального lt блока. Это привело к созданию недопустимого кандидата блока. Все предложения были отклонены, выпуск блоков остановился.
- 1 июня, 12:20 UTC
Была собрана дежурная группа расследования. Первичные логи указывали на аномалии в обработчике Dispatch Queue, особенно в части обновления значений lt при перемещении сообщений между очередями.
- 1 июня, 12:25 UTC
Операционная команда начала связываться с известными операторами валидаторов для подготовки к ускоренному развертыванию возможного исправления.
- 1 июня, 12:40 UTC
Команда отследила первопричину до логики перемещения сообщений из Dispatch Queue в OutMsgQueue: при этом max_lt tick-транзакций обновлялся до времени, превышающего старт lt блока. Был подготовлен патч, жёстко привязывающий lt каждой tick-транзакции к start_lt + 1, чтобы исключить любые нежелательные приращения при обработке очереди.
- 1 июня, 12:52 UTC
Предложенный патч, обеспечивающий сохранение lt tick-транзакций равным стартовому значению блока, был протестирован в закрытой сети под симулированной нагрузкой. Исправление показало свою эффективность: коллаторы успешно формировали допустимых кандидатов блоков.
- 1 июня, 13:22 UTC
После обновления части валидаторов был создан и подписан следующий корректный блок мастерчейна (-1,8000000000000000,48400110). Хотя количество обновлённых валидаторов было небольшим, этого оказалось достаточно для восстановления выпуска блоков, так как протокол требует лишь минимального кворума корректных предложений.
- 1 июня, 13:48 UTC
Произошёл кратковременный «афтершок»: коллаторы, работающие на старой версии кода, снова попытались сформировать блоки и вновь создали некорректные кандидаты. Это привело к краткой 3-минутной паузе. К тому моменту больше валидаторов применили патч, и доля обновлённых узлов превысила порог протокола.
- 1 июня, 13:51 UTC и далее
Значимых сбоев больше не наблюдалось. Все входящие и исходящие сообщения корректно согласовывались по lt, выпуск блоков мастерчейна продолжился в штатном режиме.
Организационные выводы
В процесс тестирования необходимо добавить расширенные стресс-тесты для мастерчейна, которые не только симулируют высокую нагрузку с различными типами транзакций и сообщений, характерную для basechain, но и включают governance транзакции (например, выборы, изменения конфигурации), происходящие параллельно с пользовательским трафиком.
P.S.
Благодарим наших коллег из Tonwhales, Tonstakers, Twinstake, Unit 410 и всех операторов валидаторов, которые работали с нами в воскресенье для координации развертывания патча. Их быстрая реакция и слаженная работа стали ключом к оперативному восстановлению выпуска блоков в мастерчейне с минимальными простоями.
Перевод для @mirkaOff