11 个版本

0.2.6 2023年6月4日
0.2.5 2023年6月3日
0.1.3 2023年5月22日

1322命令行工具

Download history 14/week @ 2024-03-12 36/week @ 2024-04-02 252/week @ 2024-04-23

每月 112 次下载

MIT 许可证

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