Год ушёл на то, чтобы внедрить WebAssembly в Anubis
It took a year to ship WebAssembly in Anubis
Anubis, инструмент для защиты сайтов от ботов, наконец получил поддержку WebAssembly. Разработчик из Techaro рассказывает, почему этот процесс занял целый год: от первоначальной идеи до сложностей интеграции, тестирования и оптимизации. В статье подробно описаны технические препятствия, решения и уроки, извлечённые в ходе работы. Это история о том, как долгий и кропотливый труд приводит к значительному улучшению производительности и безопасности.
Интеграция WebAssembly в Anubis оказалась гораздо сложнее, чем мы ожидали, и заняла целый год напряжённой работы.
- vintagedave
В моём опыте люди, которые попадают в такое точное сочетание обстоятельств, также склонны демонстрировать широкий разброс в уровне доброты по отношению к авторам открытого ПО, которое оказывается у них на пути. — Люблю это. На HN уже были обсуждения того, как обращаются с мейнтейнерами OSS, и это такая ироничная фраза. Я очень ценю тон/отношение к проблеме.
- doctor_radium
У меня здесь каждый экземпляр Firefox настроен с отключённым webassembly... потому что я не склонен делать то, для чего WebAssembly был создан, то есть онлайн-игры, редактирование видео/аудио, эмуляцию и т.п. [1] и потому что мне не нравится, когда что-то работает в фоне без моего ведома. Так что это будет интересно. Моя просьба (тихим голосом) к автору: так же, как многие сайты до сих пор делают для JavaScript, пожалуйста, добавьте в свой код сообщение «Для продолжения этой капчи требуется WebAssembly», когда WebAssembly отключён. И, кстати, для небольших платформ/браузеров, которые вообще не предлагают движок WebAssembly. [1] https://webassembly.org/docs/use-cases/
- dspillett
> Это также означает, что путь «эй, Claude, наваляй мне CUDA-решатель для Anubis» находится на пути к тому, чтобы фундаментально умереть. — Предполагаю, что предыдущие испытания всё ещё будут доступны для обстоятельств, где WASM недоступен (если только мы не исходим из того, что он доступен, если доступен JS?) или, возможно, как запасной вариант. В статье явно упоминаются «умные» телевизоры, и я уверен, что там много таких, которые работают на браузерах достаточно старых, чтобы не знать, что такое WASM. Честно говоря, для меня они не были бы приоритетом, но, очевидно, для этого проекта они важны, раз они (ну, телевизоры в целом, не конкретно старые) упоминаются в этой статье. Если так, что мешает скрейперам просто принудительно использовать запасной вариант Proof-of-Work вместо того, чтобы пытаться запускать новый алгоритм, требовательный к памяти?
- kccqzy
Снимаю шляпу перед Xe за то, что потратил столько времени на обратную совместимость, особенно за деталь про нацеливание на Chrome 66. У меня есть Mac 2014 года на Yosemite, который я иногда использую для проверки обратной совместимости в своём собственном фронтенд-коде (ради интереса!). Но, на мой взгляд, лучший способ обеспечить совместимость — использовать инструментарий, соответствующий той эпохе, или тот, где темп изменений медленнее, например ClojureScript.
- Aachen
Есть ли место, где я могу проверить, совместим ли мой браузер? Легче узнать сейчас, чем когда я пытаюсь заняться работой, а на миллионе сайтов это уже развёрнуто. На https://wasm-feature-detect.surma.technology показано, что у меня отсутствуют 3 из всех этих функций, но я не уверен, нужны ли Anubis какие-то из них, чтобы не отбрасывать меня обратно к чистому JS-решению. Что, по-видимому, было бы плохо, потому что > WebAssembly, поставляемый с этим потоком, невероятно производителен. Это может означать, что вам нужно скорректировать сложность [в сторону увеличения, чтобы боты не решали её тривиально, когда они поддерживают wasm, я полагаю, это означает] в сочетании с > В потоке wasm2js в настоящее время нет способа обновлять индикатор выполнения [так что вы понятия не имеете об оставшемся времени] (это был бы не первый раз, когда я сдался на странице, потому что она зависла на 0 хэшей в секунду)
- Georgelemental
Вы можете использовать цель Rust `wasm32v1-none`, чтобы получить базовый WASM без дополнительных целевых функций. (Однако это ограничивает вас `#[no_std]`.) https://doc.rust-lang.org/rustc/platform-support/wasm32v1-no...
- 0x696C6961
Было бы здорово, если бы Proof-of-Work можно было выполнять заранее. Так я не застряну в ожидании, пока работаю. Какой-то тип кредитов/токенов, которые мой браузер мог бы затем тратить.
- omoikane
> Это означает, что добавление одного (1) к сложности задания делает его в 1024 (одна тысяча двадцать четыре) раза сложнее решить в худшем случае. — Я не понимаю единицы здесь, разве разница между битом и нибблом не должна давать множитель 16, а не 1024?