Основная сеть Sui пережила три отдельных сбоя 28 и 29 мая после того, как выпуск версии 1.72 выявил пограничные случаи в логике расчета комиссий (gas) и процедурах перезапуска валидаторов, следует из посмертного анализа (postmortem) Фонда Sui. Фонд заявил, что проблемы были устранены, сетевая активность возобновилась, и «средства пользователей не подвергались риску».
Инциденты начались в четверг, 28 мая, когда основная сеть Sui остановилась примерно в 7:00 по тихоокеанскому времени (PT) и не работала примерно до 13:30 PT. Второй сбой произошел в пятницу утром, начавшись около 5:00 PT и завершившись около 8:30 PT. Третья остановка началась в пятницу днем примерно в 13:30 PT и была устранена около 19:20 PT.
По данным фонда, первые два сбоя были вызваны критическими ошибками (crash bugs), связанными с взаимодействием логики расчета комиссий и обновления Sui до версии 1.72, которое добавило балансы адресов. Третий сбой был отдельным, он произошел во время плановой смены эпохи после перезапусков валидаторов, которые выявили скрытую ошибку в сохранении состояния генератора случайности.
«Во время сбоев средства пользователей не подвергались риску, и сеть не отменяла никаких подтвержденных транзакций при возобновлении работы», — заявил Фонд Sui. «На данный момент валидаторы полностью устранили известные проблемы, вызванные как первоначальной ошибкой расчета комиссий, так и ошибкой состояния случайности, и сетевая активность возобновилась».
Ошибка расчета комиссий Sui спровоцировала первые остановки
Первая проблема была связана с новой функцией баланса адреса в Sui, которая позволяет пользователям хранить средства и оплачивать комиссии, не полагаясь исключительно на монетные объекты (coin objects). Транзакции в Sui могут оплачивать комиссии через балансы адресов, монетные объекты или гибридную структуру, сочетающую оба способа.
Пограничный случай возник в этом гибридном пути оплаты комиссий. Когда транзакция пыталась списать средства с баланса адреса, которого было недостаточно для конкурирующих транзакций, планировщик правильно отменял ее с ошибкой InsufficientFundsForWithdraw. Однако позже, во время «gas smashing» — процесса объединения входных монет в одну монету для оплаты комиссий — та же самая резервация всё ещё могла пытаться повторно списать средства.
В объяснении фонда сбой происходил не непосредственно во время «gas smashing», а на этапе урегулирования (settlement), когда разницы балансов (balance deltas) сверялись системной транзакцией. Применение отрицательной разницы к нулевому балансу вызывало переполнение снизу (underflow).
Немедленное исправление было концептуально простым: избегать «gas smashing», когда транзакция отменена с ошибкой InsufficientFundsForWithdraw. Валидаторы внедрили это исправление в четверг, вернув сеть в работу. Но фонд признал, что патч был временной мерой, выбранной для восстановления сети, пока инженеры разрабатывали более полное решение.
«Изменение логики расчета комиссий — деликатная операция», — написал фонд. «Как объяснено выше, существуют сложные взаимодействия между балансами адресов и монетами. Помимо исправления ошибок, изменения логики расчета комиссий должны сохранять всё предыдущее поведение или использовать соответствующие механизмы версионного контроля».
Этот временный патч содержал известную уязвимость. Если у транзакции было несколько причин отмены, другая ошибка могла скрыть условие InsufficientFundsForWithdraw. Когда это произошло в пятницу утром, сработал первоначальный путь, приводящий к переполнению, что вызвало вторую остановку.
Смена эпохи выявила ошибку состояния случайности
Третий сбой произошел после того, как сеть возобновила нормальную работу в пятницу утром. При следующей плановой смене эпохи валидаторы не смогли завершить переход из-за ошибки, связанной с протоколом распределенной генерации ключей (DKG) в Sui, который инициализирует случайность для транзакций, зависящих от ончейн-случайности.
Во время предыдущего цикла перезапусков участие было недостаточно высоким для процесса DKG следующей эпохи, поэтому случайность была отключена по задумке. Проблема заключалась в том, что результат неудачи не был записан на диск. Когда валидаторы перезапустились снова, они запустились, не помня, что DKG завершился неудачей.
«Поскольку валидаторы больше не помнили о неудаче DKG, он не мог произойти ни сейчас, ни позже, очередь приостановленных операций росла, а логика завершения эпохи — которая должна очистить эту очередь перед закрытием — оставалась в ожидании DKG, который никогда не наступит», — пояснил фонд.
Исправление состояло из двух частей: сохранения статуса DKG между перезапусками и добавления механизма, позволяющего валидаторам согласованно закрыть зависшую эпоху в определенный момент. Этот механизм был использован один раз для закрытия пострадавшей эпохи, после чего сеть перешла в следующую эпоху, и случайность была восстановлена.
В посмертном анализе сбои были представлены как важный инженерный урок для Sui. Фонд заявил, что устойчивость процессов завершения эпохи требует дальнейшего развития, особенно в части плавной деградации и оперативных механизмов принудительного закрытия. Также было отмечено, что логика расчета комиссий заслуживает такого же уровня тщательной проработки, как виртуальная машина Move или консенсус Mysticeti, учитывая ее взаимодействие с урегулированием, проверками сохранения средств и планированием.
На момент публикации SUI торгуется на уровне $0,8798.







