1 个不稳定版本

0.0.0 2019 年 6 月 17 日

#18#allowed

MIT 许可证

47KB
974

Wasm 合同

这是一个用于验证 wasm 模块导入和导出的实验性软件包。

这服务于与 Wasm 标准中提议的 WebIDL 略有不同的目的,但如果有变化,将来可能会被它取代。

目前,Wasm 合同提供

  • 一个方便的文本格式来指定 Wasm 模块的需求
  • 一个方便的方式来安全地组合合同(它确保没有冲突(允许重复,但它们必须一致))
  • 验证模块是否符合要求

语法示例

以下是 WASI 当前版本的合同

(assert_import
  ;; Here's a bunch of function imports!
  (func "wasi_unstable" "args_get" (param i32 i32) (result i32))
  (func "wasi_unstable" "args_sizes_get" (param i32 i32) (result i32))
  (func "wasi_unstable" "clock_res_get" (param i32 i32) (result i32))
  (func "wasi_unstable" "clock_time_get" (param i32 i32 i32) (result i32))
  (func "wasi_unstable" "environ_get" (param i32 i32) (result i32))
  (func "wasi_unstable" "environ_sizes_get" (param i32 i32) (result i32))
  (func "wasi_unstable" "fd_advise" (param i32 i64 i64 i32) (result i32))
  (func "wasi_unstable" "fd_allocate" (param i32 i64 i64) (result i32))
  (func "wasi_unstable" "fd_close" (param i32) (result i32))
  (func "wasi_unstable" "fd_datasync" (param i32) (result i32))
  (func "wasi_unstable" "fd_fdstat_get" (param i32 i32) (result i32))
  (func "wasi_unstable" "fd_fdstat_set_flags" (param i32 i32) (result i32))
  (func "wasi_unstable" "fd_fdstat_set_rights" (param i32 i64 i64) (result i32))
  (func "wasi_unstable" "fd_filestat_get" (param i32 i32) (result i32))
  (func "wasi_unstable" "fd_filestat_set_size" (param i32 i64) (result i32))
  (func "wasi_unstable" "fd_filestat_set_times" (param i32 i64 i64 i32) (result i32))
  (func "wasi_unstable" "fd_pread" (param i32 i32 i32 i64 i32) (result i32))
  (func "wasi_unstable" "fd_prestat_get" (param i32 i32) (result i32))
  (func "wasi_unstable" "fd_prestat_dir_name" (param i32 i32 i32) (result i32))
  (func "wasi_unstable" "fd_pwrite" (param i32 i32 i32 i64 i32) (result i32))
  (func "wasi_unstable" "fd_read" (param i32 i32 i32 i32) (result i32))
  (func "wasi_unstable" "fd_readdir" (param i32 i32 i32 i64 i32) (result i32))
  (func "wasi_unstable" "fd_renumber" (param i32 i32) (result i32))
  (func "wasi_unstable" "fd_seek" (param i32 i64 i32 i32) (result i32))
  (func "wasi_unstable" "fd_sync" (param i32) (result i32))
  (func "wasi_unstable" "fd_tell" (param i32 i32) (result i32))
  (func "wasi_unstable" "fd_write" (param i32 i32 i32 i32) (result i32))
  (func "wasi_unstable" "path_create_directory" (param i32 i32 i32) (result i32))
  (func "wasi_unstable" "path_filestat_get" (param i32 i32 i32 i32 i32) (result i32))
  (func "wasi_unstable" "path_filestat_set_times" (param i32 i32 i32 i32 i64 i64 i32) (result i32))
  (func "wasi_unstable" "path_link" (param i32 i32 i32 i32 i32 i32 i32) (result i32))
  (func "wasi_unstable" "path_open" (param i32 i32 i32 i32 i32 i64 i64 i32 i32) (result i32))
  (func "wasi_unstable" "path_readlink" (param i32 i32 i32 i32 i32 i32) (result i32))
  (func "wasi_unstable" "path_remove_directory" (param i32 i32 i32) (result i32))
  (func "wasi_unstable" "path_rename" (param i32 i32 i32 i32 i32 i32) (result i32))
  (func "wasi_unstable" "path_symlink" (param i32 i32 i32 i32 i32) (result i32))
  (func "wasi_unstable" "path_unlink_file" (param i32 i32 i32) (result i32))
  (func "wasi_unstable" "poll_oneoff" (param i32 i32 i32 i32) (result i32))
  (func "wasi_unstable" "proc_exit" (param i32))
  (func "wasi_unstable" "proc_raise" (param i32) (result i32))
  (func "wasi_unstable" "random_get" (param i32 i32) (result i32))
  (func "wasi_unstable" "sched_yield" (result i32))
  (func "wasi_unstable" "sock_recv" (param i32 i32 i32 i32 i32 i32) (result i32))
  (func "wasi_unstable" "sock_send" (param i32 i32 i32 i32 i32) (result i32))
  (func "wasi_unstable" "sock_shutdown" (param i32 i32) (result i32))
)

说明

  • 允许多个 assert-importassert-export 声明。
  • 注释(以 ; 开始并以换行符结束)和空白在任意标记之间都是有效的

语义

模块使用的所有导入都必须在合同中指定。

合同中的所有导出都必须由模块导出。

因此,模块可能比合同有更多的导出,或者比合同指定的导出少,但仍被视为有效。

杂项

由于 Rust 中嵌套闭包的问题,wasm-contract 无法同时编译在稳定版本上并有良好的错误报告。这个问题正在修复,wasm-contract 将更新以具有更好的错误处理。

请参阅 parser.rs 文件中的注释,其中包含以 BNF 风格表示的语法。

欢迎建议、贡献和思考!这是一个处于早期阶段的实验,但我们希望与更广泛的社区合作,并与其他感兴趣的相关方合作开发。

依赖关系

~0.8–1.3MB
~24K SLoC