Стонфаеры! 26-28 августа многие из вас столкнулись с многочасовой обработкой транзакций, а потом и с полной остановкой блокчейна. Рассказываем, почему это произошло.
Восстановим хронологию событий — с момента наплыва пользователей DOGS до полноценного возобновления работы блокчейна. Так вам станет понятней, что послужило причиной этих критических событий и что мы будем делать, чтобы они не повторялись.
Технические детали
Для понимания произошедшего важно разобраться в некоторых технических деталях.
Для оптимизации нагрузки на блокчейн используется шардинг, то есть разбивка данных на мелкие сегменты (шарды). Шардинг распределяет нагрузку между сетевыми узлами и освобождает операционную мощность каждого из них. Когда речь идет о тысячах транзакций в секунду, шардинг позволяет произвести обработку данных быстро и эффективно.
Угрозу производительности представляет кросс-шардовая нагрузка, то есть обработка сообщений между разными шардами, а не внутри одного. Если сеть испытывает кросс-шардовую перегрузку, скорость обработки транзакций замедляется.
Еще один важный момент: в блокчейне TON работает система защиты, которая не позволяет одному контракту занимать все вычислительные мощности внутри одного шарда. Приоритет отдается транзакциям с одним исходящим сообщением, а транзакции с несколькими сообщениями выстраиваются в очередь.
Итак, скорость обработки транзакций может упасть, если сеть испытывает серьезную кросс-шардовую перегрузку. А еще система защиты может создать очередь обработки, если транзакция содержит несколько исходящих сообщений.
Теперь перейдем к событиям, которые привели к задержкам в проведении транзакций, а затем и к остановке блокчейна.
Хронология событий
26 августа 08:51 UTC: наплыв пользователей DOGS
Что такое DOGS?
Telegram-бот DOGS давал пользователям возможность получить виртуальные токены DOGS и соревноваться с другими держателями. Объем награды зависел от возраста Telegram-аккаунта. Простая механика привлекла в проект более 50 миллионов пользователей.
26 августа пользователи Telegram-бота получили возможность вывести игровые токены DOGS на свои некастодиальные кошельки, например на Tonkeeper. Для этого им нужно было подписать транзакцию в кошельке, оплатить сетевую комиссию и комиссию проекта DOGS.
Кошельки пользователей и адрес для комиссий DOGS находились в разных шардах блокчейна. Значит, нагрузка на сетевые узлы уже возросла.
Обычно блокчейн TON обрабатывает 3–4 миллиона транзакций в день. 26 августа сети пришлось столкнуться с беспрецедентной нагрузкой — 9 миллионов транзакций, многие из которых отправляли сообщения в разные шарды. Обработка транзакций во всем блокчейне замедлилась.
Основная часть обменов токенов DOGS пришлась на STON.fi — крупнейшую децентрализованную биржу на TON, интегрированную в Tonkeeper и TON Space. Некоторые транзакции STON.fi состоят из нескольких сообщений, поэтому начала формироваться очередь.
В первый час после создания пула ликвидности DOGS пользователи проекта совершили на STON.fi 19 000 обменов. Из них только 3 000 были обработаны, а остальные выстроились в очередь к обработке валидаторами. Транзакции начали проходить с задержками до 3 часов. Половина этих транзакций была отклонена после обработки из-за слиппеджа — изменения фактического курса сделки в сравнении с курсом при отправке транзакции. Конечно, средства в этих случаях были возвращены пользователям.
Кстати! В период запуска токенов Notcoin, STON.fi DEX обрабатывал рекордное количество транзакций — более 10 000 в час.
27 августа 22:30 UTC: остановка блокчейна
Наплыв нескольких миллионов пользователей DOGS, отправляющих кросс-шардовые сообщения, очередь из транзакций, недостаточная производительность части валидаторов — все это привело к тому, что блокчейн на несколько часов перестал производить блоки, то есть функционировать.
28 августа 05:30–15:00 UTC: восстановление блокчейна и новые очереди
Проблема решена, блокчейн начал работать исправно. В эту ночь блокчейн обработал всю очередь транзакций, в том числе от пользователей STON.fi.
Однако утром пользователи вновь начали выводить и обменивать токены DOGS, и очередь транзакций снова выросла.
Мы выключили функциональность обменов на app.ston.fi, чтобы обезопасить наших пользователей от слиппеджа и заморозки активов на неопределенный срок. Операции с ликвидностью в это время были доступны в полном объеме.
28 августа 17:19 UTC: повторная остановка блокчейна
Блокчейн снова перестал функционировать. TON core team выпустила срочное обновление для валидаторов.
29 августа 01:30 UTC: стабильная работа блокчейна
Блокчейн заработал, началась обработка застрявших в очереди транзакций.
Утром этого же числа мы смогли вновь открыть функциональность обменов на app.ston.fi и вернуться к стабильной работе.
Резюме
Рекордная активность миллионов пользователей в сочетании с резким увеличением количества кросс-шардовых сообщений увеличила нагрузку на узлы блокчейна и создала очередь транзакций. Кроме того, логика системы защиты блокчейна TON, которая деприоритизирует сложные транзакции, такие как обмены на DEX, привела к значительным задержкам транзакций и возврату активов в случае неуспешных сделок.
Эта серия событий привела к значительным задержкам в транзакциях обмена и временной остановке блокчейна TON. В ответ на это команда STON.fi приняла решение временно отключить обмены в интерфейсе app.ston.fi, чтобы обеспечить безопасность активов пользователей до тех пор, пока не будут решены проблемы с работой блокчейна.
Что дальше?
Чтобы наши пользователи больше не столкнулись с такими задержками, мы планируем оптимизировать работу с шардингом и кросс-шардовыми сообщениями.
Вот наш план действий:
- Добавим параметр deadline, благодаря которому токены будут возвращены на кошелек пользователя, если транзакция идет слишком долго. Это ускорит обработку очереди межшардовых сообщений, адресованных роутеру. Такая очередь возникает из-за ограничения количества транзакций, которые может обработать один роутер в условиях нагрузки. Мы снизим эту нагрузку за счет уменьшения количества сообщений в одной транзакции обмена/возврата с текущих 8 до 5, что и позволит повысить производительность.
- Развернем 16-64 дополнительных роутера по различным шардам блокчейна. В таком случае, даже если в одном шарде образуется очередь из-за высокого объема транзакций, такая очередь повлияет только на 1/16-1/64 пулов, а не на все. Это позволит поддерживать высокую производительность работы всего DEX в случае высокой нагрузки в одном из шардов.
- В дальнейшем внедрим архитектуру без центральных контрактов вообще. Это уменьшит количество потенциальных точек отказа и более равномерно распределит обработку транзакций по всей сети.
Эти меры направлены на значительное повышение отказоустойчивости и эффективности нашей системы, обеспечивая бесперебойную работу DEX даже в периоды чрезвычайно высокой активности.