WebAssembly и WASI

Единица исполнения платформы — компонент. Вокруг него три понятия: модуль, компонент и среда. Эта глава раскладывает их по местам, объясняет WASI и WIT и описывает модель разрешений.

Модуль, компонент, среда

Модуль WebAssembly — двоичный формат: функции над линейной памятью. Модуль ничего не знает о файлах, сети и времени: у него есть только вычисления и память. Память линейная и своя: модуль не видит ни памяти других модулей, ни памяти среды.

Структура модуля читается в текстовой форме — WAT. Так выглядит минимальный модуль с памятью и данными:

(module
  (memory (export "memory") 1)
  (data (i32.const 0) "привет"))

Пример на главной странице сайта — консоль с модулем Hello World. Модуль собирается из исходного текста WAT, не имеет ни импортов, ни доступа к сети. Строки вывода модуль собирает сам, в собственной памяти; команда run исполняет его прямо в браузере.

Компонент — модуль плюс контракт. Модель компонентов WebAssembly описывает, как модуль соединяется с внешними интерфейсами. wash build собирает компонент из вашего кода и контракта WIT.

Среда исполнения предоставляет интерфейсы и запускает компонент. Среда wasmCloud запускает компонент там, где доступны нужные ему интерфейсы WASI. Одна и та же среда обслуживает множество компонентов; каждый компонент видит только собственный контракт.

WASI

WASI (WebAssembly System Interface) — стандартные интерфейсы между компонентом и средой. Компонент не обращается к операционной системе напрямую: он вызывает интерфейсы WASI, а среда решает, что за ними стоит.

Интерфейсы собираются в пакеты по назначению. wasi:http — обработка HTTP-запросов. wasi:keyvalue — хранилище «ключ — значение». Версия интерфейса фиксируется в контракте — например, wasi:http/handler@0.3.0.

WASI развивается версиями. Переносимость начинается с интерфейсов: проверьте требования компонента и поддержку WASI в выбранной среде.

WIT

Контракт записывается на WIT — текстовом языке интерфейсов компонента. Контракт перечисляет импорты и экспорты. Минимальный мир (world) HTTP-обработчика:

world hello {
  export wasi:http/handler@0.3.0;
}

Экспорт wasi:http/handler превращает компонент в HTTP-обработчик: среда передаёт запрос, компонент возвращает ответ.

Импорты записываются так же — словом import. Импорт означает «компоненту нужна эта возможность среды»; экспорт — «среда может вызвать это у компонента». Свои интерфейсы — помимо пакетов WASI — описываются в том же контракте: функции, типы и записи (record) составляют словарь, на котором говорят компонент и среда.

Сборка фиксирует контракт в артефакте. После сборки объявление компонента расширить нельзя — список возможностей известен до запуска и неизменен.

Зависимости контракта подтягиваются при сборке в wit/deps. Этот каталог стоит исключить из системы контроля версий: это восстанавливаемый кеш, а не исходный код.

Сборка и проверка

Сборка описана в главе «Начало»: wash читает контракт из wit/, подтягивает зависимости в wit/deps и пишет артефакт .wasm.

Проверьте артефакт до публикации. Команда wash inspect печатает WIT, встроенный в компонент:

wash inspect ./target/wasm32-wasip2/release/hello_world.wasm

Вывод показывает, какие интерфейсы компонент импортирует и экспортирует. Так вы узнаёте требования компонента до запуска: список возможностей — часть самого артефакта.

Команда wash inspect принимает и ссылку на артефакт в реестре: контракт видно ещё до того, как компонент попал в среду. Проверка чужого артефакта перед запуском — та же одна команда.

Разрешения

Компонент исполняется в песочнице. Запрет действует по умолчанию.

Компонент исполняется в изолированной среде WebAssembly. Доступ к внешнему миру — только через WASI: интерфейсы, объявленные в его контракте. Среда предоставляет ровно те возможности, что перечислены в объявлении; всё остальное запрещено по умолчанию.

Что разрешено

Только объявленное. Если контракт требует исходящих HTTP-запросов и хранилища ключ-значение, среда даёт эти два интерфейса — и ничего больше. Список возможностей известен до запуска — он часть самого артефакта.

Что запрещено

По умолчанию всё: файловая система, сеть, переменные окружения, системные часы. Обращение к необъявленному интерфейсу среда отклоняет — даже если самой среде эти возможности доступны. Объявление компонента расширить нельзя.

Как объявить возможности

Контракт записывается на WIT — текстовом языке интерфейсов компонента. Сборка фиксирует контракт в артефакте, а при запуске среда связывает каждый объявленный интерфейс с конкретной возможностью: адресом, путём или значением из конфигурации среды.

Что дальше

  • «Платформа» — реестр компонентов и среды исполнения.
  • «Kubernetes» — среда wasmCloud в кластере.