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 в кластере.