Мейннет Sui пережил три отдельных сбоя 28 и 29 мая после того, как релиз 1.72 обнажил граничные случаи в логике списания газа и перезапуска валидаторов, согласно постмортему Sui Foundation. Фонд заявил, что проблемы с тех пор устранены, активность сети возобновлена, и «средства пользователей не были под угрозой».
Инциденты начались в четверг, 28 мая, когда мейннет Sui остановился примерно в 07:00 по московскому времени (10:00 МСК) и оставался недоступным до примерно 13:30 PT (21:30 МСК). Второй сбой последовал утром в пятницу, начавшись около 05:00 PT (13:00 МСК) и завершившись примерно в 08:30 PT (16:30 МСК). Третья остановка началась в пятницу днём примерно в 13:30 PT (21:30 МСК) и была устранена около 19:20 PT (03:20 МСК следующего дня).
По данным фонда, первые два сбоя были вызваны ошибками, связанными с взаимодействием логики списания газа и обновления Sui до версии 1.72, которое ввело адресные балансы. Третий сбой был отдельным — он был спровоцирован во время запланированной смены эпохи после того, как перезапуски валидаторов обнажили скрытую ошибку в сохранении состояния случайности.
«Во время сбоев средства пользователей не были под угрозой, и сеть не откатила ни одной подтверждённой транзакции при возобновлении работы», — заявил Sui Foundation. «На данный момент валидаторы полностью устранили известные проблемы, вызванные как исходной ошибкой списания газа, так и ошибкой состояния случайности, и активность сети возобновлена».
Первая проблема была связана с новой функцией адресного баланса Sui, которая позволяет пользователям хранить средства и оплачивать газ, не полагаясь исключительно на объекты монет. Транзакции в Sui могут оплачивать газ через адресные балансы, объекты монет или гибридную структуру, сочетающую оба способа.
Граничный случай возник в этом гибридном пути оплаты газа. Когда транзакция попыталась списать средства с адресного баланса, который не мог покрыть конкурирующие транзакции, планировщик корректно отменил её с ошибкой InsufficientFundsForWithdraw. Но позже, во время gas smashing — процесса объединения входных монет в единую монету для оплаты газа — та же самая резервация могла снова попытаться списать средства.
В объяснении фонда сбой произошёл не непосредственно во время gas smashing, а во время расчётов, когда дельты балансов сверялись системной транзакцией. Отрицательная дельта, применённая к нулевому балансу, вызвала переполнение.
Немедленное исправление было концептуально простым: избегать gas smashing при отмене транзакции с ошибкой InsufficientFundsForWithdraw. Валидаторы применили это исправление в четверг, вернув сеть в онлайн. Однако фонд признал, что патч был временной мерой, выбранной для восстановления сети, пока инженеры разрабатывали более полное решение.
«Изменение логики газа — деликатная операция», — написал фонд. «Как объяснялось выше, существуют сложные взаимодействия между адресными балансами и монетами. Помимо исправления ошибок, изменения логики газа должны сохранять всё предыдущее поведение или использовать соответствующее версионирование».
Этот временный патч содержал известную уязвимость. Если транзакция имела несколько причин отмены, другая ошибка могла скрыть условие InsufficientFundsForWithdraw. Когда это произошло утром в пятницу, исходный путь переполнения всё ещё мог быть достигнут, вызвав вторую остановку.
Третий сбой произошёл после того, как сеть возобновила нормальную работу утром в пятницу. При следующей запланированной смене эпохи валидаторы не смогли завершить переход из-за ошибки, связанной с протоколом распределённой генерации ключей Sui (DKG), который инициализирует случайность для транзакций, зависящих от ончейн случайности.
Во время предыдущего цикла перезапуска участие было недостаточным для процесса DKG следующей эпохи, поэтому случайность была отключена в соответствии с замыслом. Проблема заключалась в том, что результат сбоя не был записан на диск. Когда валидаторы снова перезапустились, они поднялись без памяти о том, что DKG завершился неудачей.
«Поскольку валидаторы больше не помнили, что DKG завершился неудачей, ни то ни другое не могло произойти, приостановленная очередь росла, а логика конца эпохи — которая должна опустошить эту очередь перед закрытием — ожидала DKG, который так и не наступил», — заявил фонд.
Исправление состояло из двух частей: сохранение статуса DKG при перезапусках и добавление механизма, позволяющего валидаторам закрыть застрявшую эпоху в скоординированной точке. Этот механизм был использован один раз для закрытия затронутой эпохи, после чего сеть перешла в следующую эпоху и случайность была восстановлена.
Постмортем представил сбои как более широкий инженерный урок для Sui. Фонд заявил, что устойчивость конца эпохи требует дальнейших инвестиций, особенно в части плавной деградации и механизмов принудительного закрытия. Также было отмечено, что списание газа заслуживает такого же уровня строгости, как Move VM или консенсус Mysticeti, с учётом его взаимодействия с расчётами, проверками сохранения и планированием.
На момент публикации SUI торговался по $0,8798.


