NEAR незаметно заменила движок смарт-контрактов под нагрузкой сети
Разработчики NEAR заменили движок, на котором работают все смарт-контракты, прямо под нагрузкой основной сети — и пользователи почти ничего не заметили. По словам бывшего разработчика ядра NEAR Вадима, в этом и заключалась цель обновления: пройти бесшумно.
Как отметил специалист, за скупой новостью скрывается захватывающая инженерная история. По его словам, она включает и специально созданные контракты-«бомбы» для компилятора, и очевидное решение проблемы, которое на деле оказалось запретным, поскольку могло расколоть сеть надвое.
Хотите еще эксклюзивных новостей и аналитики? Подписывайтесь на наш телеграм-канал, обсуждайте новости и делитесь мнениями о последних событиях рынка в чате!
Зачем NEAR менял движок
Долгие годы, как пояснил Вадим, NEAR исполнял контракты на собственной виртуальной машине NearVM — ответвлении движка Wasmer, которое использовал, тестировал и латал только сам проект. Такой частный компилятор он назвал своего рода «налогом».
Суть в том, что каждое обновление языка Rust, каждая новая функция и каждое исправление безопасности ложились на плечи одной команды. По словам эксперта, проекту однажды повезло: он перестал синхронизировать свою версию прямо перед тем, как в исходном Wasmer появилась критическая уязвимость, и случайно избежал ее.
Заменой стал Wasmtime — отраслевой стандарт, который поддерживает объединение Bytecode Alliance. Чтобы доказать безопасность перехода, узлы сети параллельно прогоняли реальный трафик основной сети через обе виртуальные машины и сверяли каждый результат.
Итоги проверки, по данным команды, оказались убедительными. Результаты совпали полностью, расхождение в комиссиях составило менее 0,002%, а само исполнение ускорилось примерно в четыре раза.
Главная сложность, впрочем, была не в исполнении. Как пояснил Вадим, в сети NEAR развертывание контракта компилируется прямо внутри блока длиной 600 миллисекунд, а у оптимизирующего компилятора нет верхнего предела времени работы.
Запретное решение и итог
Именно это открывало путь для атаки. По словам специалиста, команда создала контракт размером 128 КБ, компиляция которого занимала около 7 секунд, — этого хватало, чтобы «промахнуться» мимо блока и замедлить всю сеть.
Очевидное решение — поставить ограничение по времени на компиляцию — оказалось запретным. Как объяснил Вадим, разные валидаторы тратят на компиляцию разное время, поэтому пограничный контракт одни узлы приняли бы, а другие отвергли.
Последствием, по его словам, стал бы раскол сети из-за одной лишь настройки компилятора. Он подчеркнул, что консенсус требует полной предсказуемости даже от времени сборки.
Команда нашла другой выход. По данным разработчиков, они внедрили Winch — однопроходный бэкенд Wasmtime — и добавили в него недостающие функции, после чего «худший случай компиляции» сократился с 7,6 секунды до 36 миллисекунд.
Как отметил Вадим, работа вне блокчейна дает «роскошь, недоступную протоколу»: компиляцию можно вынести на отдельный тип обработчиков, не связанный с исполняющими узлами.
Поводом для разбора от Вадима стала публикация другого разработчика Антона, который анонсировал само обновление. По его словам, релиз Nearcore 2.12 перевел среду исполнения NEAR с NearVM на Wasmtime, но эта работа не из тех, что попадают в заголовки СМИ. Он подчеркнул, что для разработчиков и пользователей ничего не изменилось, и в этом весь смысл: «команда закрыла критический технический долг, ничего не сломав».
Хотите получить доступ к экспертным инсайдам? Подписывайтесь на наш новостной телеграм-канал, а также вступайте в сообщество BeInCrypto! Читайте последние новости и свежую аналитику криптовалют, ИИ и фондовых рынков. Будьте на шаг впереди толпы каждый день!
Источник: https://ru.beincrypto.com/near-zamena-dvizhka-smart-kontraktov-wasmtime/