WASI: WebAssembly вне браузера
Узнаём, как Wasm выходит за пределы браузера через WASI.
WASI (WebAssembly System Interface) — это стандартный набор системных функций (файлы, время, сеть), который даёт Wasm безопасный доступ к ОС вне браузера.
Проблема за пределами браузера
В браузере Wasm получает доступ к миру через импорты из JS. А на сервере или в CLI нет JS-окружения — но есть файлы, аргументы командной строки, время, сеть. Нужен стандартный интерфейс к ОС, иначе каждый рантайм придумывал бы свой. Этим стандартом и стал WASI: набор системных вызовов, который рантайм (Wasmtime, WasmEdge) предоставляет модулю как импорты.
Что даёт WASI
| Возможность | Что позволяет |
| Файловая система | читать/писать файлы (но только в разрешённых папках) |
| Аргументы и переменные | argv, env — как у обычной программы |
| Время и часы | текущее время, монотонный таймер |
| Случайность | криптослучайные байты |
| Сеть (WASI Preview 2) | сокеты с явным разрешением |
Программа «Hello, WASI»
Простейшая WASI-программа печатает текст в stdout. Например, на Rust для цели wasm32-wasi. Исходник помечаем language-text — это код для компиляции, не для браузера:
// main.rs, цель wasm32-wasi
fn main() {
println!("Привет из WASI!");
}
rustc --target wasm32-wasi main.rs -o hello.wasm
wasmtime hello.wasm
# выведет: Привет из WASI!
Главная идея — безопасность через возможности
WASI устроен по принципу capability-based security (безопасность на основе возможностей). Программа не получает доступ ко всей файловой системе автоматически. Рантайму явно говорят: «разреши этому модулю папку /data» — и только её модуль и увидит. Это противоположность обычным процессам, которые по умолчанию могут трогать многое.
# дать модулю доступ только к папке ./data
wasmtime run --dir=./data app.wasm
Почему это будущее
WASI делает один и тот же .wasm-модуль переносимым: он запускается на Linux, Windows, macOS, на ARM и x86 — без перекомпиляции, ведь рантайм одинаков везде. Плюс изоляция из коробки. Это привлекательно для serverless (быстрый холодный старт), edge-вычислений (один артефакт на любую площадку) и плагинов (безопасное исполнение чужого кода).
Как работает под капотом
Когда WASI-модуль вызывает «записать в файл», он на самом деле зовёт импортированную функцию вроде fd_write. Рантайм перехватывает этот вызов, проверяет, разрешён ли данный файловый дескриптор (выдан ли он через --dir), и только тогда обращается к реальной ОС. То есть все системные вызовы проходят через шлюз рантайма, который применяет политику доступа. Песочница не «вокруг» модуля, а встроена в сам интерфейс.
Частые ошибки
- Ждать полного доступа к ФС — без явного
--dirмодуль не увидит ни одной папки. - Путать WASI и браузерный Wasm — в браузере импорты от JS, в WASI — системный интерфейс рантайма.
- Считать сеть всегда доступной — сетевые возможности появились позже (Preview 2) и тоже требуют разрешения.
Итоги
- WASI — стандартный системный интерфейс для Wasm вне браузера.
- Даёт файлы, время, аргументы, случайность, сеть — но по явному разрешению.
- Безопасность на основе возможностей: доступ только к тому, что выдали.
- Один модуль переносим между ОС и архитектурами — будущее serverless/edge.