11 个版本
0.2.6 | 2023年6月4日 |
---|---|
0.2.5 | 2023年6月3日 |
0.1.3 | 2023年5月22日 |
1322 在 命令行工具 中
每月 112 次下载
71KB
1.5K SLoC
WARK
WebAssembly RunKit,简称 WARK,是一个高度高效的工具,用于在安全沙箱环境中执行 WebAssembly (w/ WASI) 模块。它可以精确计算并报告模块的资源使用情况,包括指令成本和内存利用率。
您可以根据需要将 WARK 用作命令行界面 (CLI) 工具或网络服务。
目录
安装
Docker
如果您已安装 Docker,可以使用以下命令运行 WARK
# Run the web service
docker run -it --rm -p 33000:33000 jacoblincool/wark server
Cargo
要使用 Cargo 安装 WARK,请使用以下命令
cargo install wark
使用方法
CLI
要使用 CLI 运行 WebAssembly 模块,请使用以下命令
wark run [OPTIONS] <module>
选项
您可以使用以下选项来自定义执行
-m, --memory <memory> Define memory limit in MB [default: 512]
-c, --cost <cost> Set computational cost limit in instruction count [default: 1000000000]
-i, --input <input> Specify input file path for the program [default: stdin]
--stderr <file> Redirect program's stderr to a file
-n, --no-report Suppress the report of the program's resource usage
输入/输出
- 您可以使用
--input
选项指定程序的输入文件路径。如果要使用 stdin 作为输入,请使用-
作为输入文件路径。 - 模块的 stdout 将打印到 CLI 的 stdout。
- 模块的 stderr 将 不会 打印到 CLI 的 stderr。相反,请使用
--stderr
选项将其重定向到文件。 - 除非使用
--no-report
选项抑制,否则模块的资源使用情况将打印到 CLI 的 stderr。
网络服务
要启动 WARK 服务器,请使用以下命令
wark server
您可以使用
PORT
环境变量来指定端口号。默认端口号为33000
。
运行
要运行 WebAssembly 模块,请发送包含以下字段的 JSON 对象的 POST
请求
curl 'http://127.0.0.1:33000/run' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <JWT_TOKEN>' \
--data '{
"cost": 10000000,
"memory": 512,
"input": "I am stdin input",
"wasm": "<base64 encoded wasm module>"
}'
服务器将以包含以下字段的 JSON 对象响应
{
"success": true,
"cost": 1234567,
"memory": 345,
"stdout": "I am stdout output",
"stderr": "I am stderr output",
"message": "I am message"
}
判断
要判断模式下的程序运行,请发送包含以下字段的 JSON 对象的 POST
请求
curl --location 'http://127.0.0.1:33000/judge' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <JWT_TOKEN>' \
--data '{
"wasm": "<base64 encoded wasm module>",
"specs": [
{
"judger": "IOFast",
"input": "Jacob",
"output_hash": "128783a055c41c0a79ad7376e8e22587cdca53ed1f9c47c46d02a7768992b325",
"cost": 1000000000,
"memory": 1024
},
{
"judger": "IOFast",
"input": "WOJ",
"output_hash": "75787b1df461d0c48f0229a7769cbcc37c7d96d6613f825b77e76afdd1eb790a",
"cost": 1000000000,
"memory": 1024
},
{
"judger": "IOFast",
"input": "WASM OJ Wonderland",
"output_hash": "8f02d3283b88d16766cb287090bf59135c873e9175759b73f96ffe674440ff21",
"cost": 1000000000,
"memory": 1024
},
{
"judger": "IOFast",
"input_url": "https://link-to-input.file/input.txt",
"output_hash": "87c215c4afeaf7ff7684ef90fd44649b2051bc4c68cf58bdad402fa304487b8w",
"cost": 1000000000,
"memory": 1024
}
]
}'
服务器将以包含以下字段的 JSON 对象响应
{
"results": [
{
"success": true,
"cost": 3776,
"memory": 1,
"message": null,
"exception": null
},
{
"success": true,
"cost": 3692,
"memory": 1,
"message": null,
"exception": null
},
{
"success": true,
"cost": 4421,
"memory": 1,
"message": null,
"exception": null
},
{
"success": false,
"cost": 5848,
"memory": 1,
"message": null,
"exception": {
"type": "Output",
"reason": "Output hash mismatch. Expected 87c215c4afeaf7ff7684ef90fd44649b2051bc4c68cf58bdad402fa304487b8w, got 87c215c4afeaf7ff7684ef90fd44649b2051bc4c68cf58bdad402fa304487b8c"
}
}
]
}
目前,服务器只支持使用IOFast
判题器,这是一个简单的判题器,它会将程序的输出结果与output_hash
字段进行比较。如果程序的输出与output_hash
字段匹配,表示程序通过了测试用例。否则,将返回一个Output
异常。
远程输入将被缓存到
http-cache
目录中,每个缓存的TTL都遵循响应中的Cache-Control
头部。
成本表
您可以在src/cost.rs中找到每条指令的成本。
如果您看到
Penalty Instruction [指令名称]
,则表示该特定指令未包含在成本表中。因此,其默认成本为1000分。
请随时通过提交拉取请求或报告问题来为此项目做出贡献。您的帮助总是受欢迎和感激的!
依赖项
~44–82MB
~1.5M SLoC