1 个不稳定版本
0.0.0 | 2019 年 6 月 17 日 |
---|
#18 在 #allowed
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-import
和assert-export
声明。 - 注释(以
;
开始并以换行符结束)和空白在任意标记之间都是有效的
语义
模块使用的所有导入都必须在合同中指定。
合同中的所有导出都必须由模块导出。
因此,模块可能比合同有更多的导出,或者比合同指定的导出少,但仍被视为有效。
杂项
由于 Rust 中嵌套闭包的问题,wasm-contract
无法同时编译在稳定版本上并有良好的错误报告。这个问题正在修复,wasm-contract
将更新以具有更好的错误处理。
请参阅 parser.rs
文件中的注释,其中包含以 BNF 风格表示的语法。
欢迎建议、贡献和思考!这是一个处于早期阶段的实验,但我们希望与更广泛的社区合作,并与其他感兴趣的相关方合作开发。
依赖关系
~0.8–1.3MB
~24K SLoC