О стресс-тестах в сетях TON и Everscale

О стресс-тестах в сетях TON и Everscale

We Ton

В последние пару дней многие заметили сложности в работе testnet TON и mainnet Everscale. Сейчас, когда обе сети работают в обычном режиме и постепенно обрабатывают последствия стресс-теста, можно поговорить и о причинах, вызвавших такое поведение сетей.

Как развивалось?


Эта история, как и многие из таких историй, началась с умелых рук и любознательной головы. 25 апреля один разработчик решил запустить «форк-бомбу» в виде контракта, который при получении сообщения посылает два сообщения себе же, порождая геометрическую прогрессию сообщений. Такие «бомбы» запускались уже не раз. Они работают пока хватает баланса. В рассматриваемом случае при тестировании был использован довольно большой баланс.

Начав с testnet TON и маленькой суммы (~50 тест-коинов) и убедившись, что все работает, разрабочик решил провести такой же тест и в mainnet Everscale, но уже с большей суммой. Обнаружив проблемы с производительностью —происходило значительное замедление генерации блоков в бейзчейне — он повторил атаку с большей суммой и в testnet TON.

В процессе присоединились и другие разработчики, добавив на контракт стресс-теста тысячи тестовых монет.

В testnet TON атака привела к следующему: атакованный контракт, который все же стабильно работал около двух часов, «провалился» в свой собственный шард, после чего также начала проявляться деградация производительности. Остальные шарды бейзчейна (т.е. ~94% сети) продолжили работать также, как и раньше.

Напротив атакованный шард 0:a8000... начал хандрить: блоки продолжали генерироваться, но очень медленно, раз в 10-20 минут, а иногда и с гораздо большими перерывами — до 40 минут. 26 апреля работа шарда чуть стабилизировалась: блоки по-прежнему генерировались редко, но уже без длительных перерывов. Наконец, 27 апреля блоки шарда начали генерироваться с нормальной скоростью:  до контракта дошли дополнительные монеты для атаки (удлиняя ее во времени), при этом производительность шарда стала ниже ожидаемой ~30 ТПС (https://testnet.dton.io/). В таком режиме сеть работает последние сутки, «разгребая» последствия атаки.

Сеть Everscale также начала восстанавливать работу утром 28 апреля.

Что произошло?


Проблема «форк-бомб» заключается в том, что, по мере своей работы, они бесконечно (пока хватает денег) наращивают очередь сообщений. Соответственно, чем дольше работает «бомба» и чем крупнее на ней баланс, тем длиннее очередь. И, если работа с очередью не до конца оптимизирована, то обработка транзакций и генерация новых блоков может замедляться.

Это и произошло с testnet TON, когда оказалось, что часть проверок при коллации (создании новых блоков) и валидации (их проверки) работала не только с той частью очереди сообщений которая непосредственно затрагивается в транзакциях блоков, а и со всей очередью. 

Несмотря на многочисленные ограничители и заложенную Николаем Дуровым архитектуру TON, в которой уделено специальное внимание оптимизациям подобных операций, через 2 часа экспоненциального наращивания очереди, проблемы производительности «догнали» валидаторов. 

Решение


В ходе устранения проблем, разработчики TON предложили два нововведения:

Таким образом были убраны операции работающие на всей очереди сообщений, и размер очереди перестал влиять на валидацию и коллацию. 

После раскатывания обновленного кода на ноды testnet — сеть восстановила нормальную работу.

По-видимому, разработчики Everscale тоже оптимизировали работу сети другим образом.


*****

Благополучно завершенный стресс-тест, говорит о том, что в будущем обе сети могут стать еще более надежными, обмениваясь улучшениями друг с другом. Следует однако дождаться описания изменений, сделанных сетью Everscale.

Report Page