На прошлой неделе я узнал о чем-то, что называется Web Assembly или WASM. Действительно интересно, что они создали среду для запуска скомпилированного ассемблерного кода в браузере по сравнению с интерпретируемым JavaScript. Он позволяет выполнять молниеносно быстрые вычисления, необходимые для потоковой передачи видео, обработки звука и игр в браузере. Из-за его скорости я хотел посмотреть, что я могу с ним сделать.

Меня очень заинтересовали недавние эксплойты, которые позволяют разработчикам внедрять код в веб-сайты и заставлять все их веб-клиенты выполнять вычисления в фоновом режиме для майнинга биткойнов. Я создал этот проект как доказательство концепции такого эксплойта.

Решив, что это может быть интересной концепцией для изучения, мне нужно было что-то вычислить. Вычисление последовательности Фибоначчи может быть выполнено с помощью рекурсии и иногда используется для оценки скорости языков программирования. Функция fib(n) принимает на вход положительное целое число n и возвращает n-е число в последовательности Фибоначчи. Этот процесс не обязательно требует больших вычислительных мощностей, но требует использования рекурсии.

Я не программировал рекурсивную функцию Фибоначчи с помощью Web Assembly, вместо этого я использовал at transpiler. AssemblyScript — это проект на Github, который транспилирует и компилирует машинописный код в файлы .wat и .wasm. Это значительно упрощает использование скорости WebAssembly.

Как это работает

При компиляции в файл .wasm fib(n) можно вызывать внутри браузера с помощью JavaScript. Я встроил это в статическую веб-страницу с простым интерфейсом для отображения выходных данных fib(n).

WebSockets позволяют серверу отправлять и получать данные с загруженной веб-страницы. Я создал очень простой сервер WebSocket, к которому могла подключаться веб-страница. Это позволяет серверу отправлять входные данные пользователю, запускающему веб-страницу, и получать рассчитанные выходные данные.

Сервер отправит клиенту случайные положительные целые числа, n от 3 до 47. Клиент ответит значением fib(n) и отобразит его на экране. Если n › 47, вычисление значения функции может занять несколько секунд.

Используя адаптированную настройку, было бы не очень сложно воспроизвести реализацию майнинга криптовалюты в Web Assembly, а используя аналогичную настройку, было бы очень возможно украсть такты ЦП у пользователей.

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

https://iainmon.github.io/WASM-Compute-Stream/client/

Другие эксперименты

Я также играл с адресами памяти. После вычисления n значение v сохраняется в памяти, поэтому, если будет запрошено вычисление того же числа, вычисление не потребуется выполнять повторно. nи v — 64-битные целые числа без знака, а поскольку 64-битные системы имеют 64-битные адреса памяти, создать систему пар ключей несложно. В памяти n — это ключ, а v — это значение. Это лучше, чем сохранять все в форме списка, потому что поиск значения не требует дополнительного времени.

У меня нет компьютера, поддерживающего вычислительные шейдеры WebGL, но использование вычислительных шейдеров действительно может увеличить количество операций, которые может выполнить пользователь.