1

我正在尝试将这个箱子的包装器移植到 wasm 中。我目前的工具链是:

  • wasm包
  • 网页包
  • wasm-bindgen

关于构建系统的更多信息:

在我的 rust crate(这是一个--libcrate)中,我只调用wasm-pack build --target browser. 这将创建一个pkg包含 wasm blob 和相关 js 文件的文件夹。这里没有编译器的抱怨。

然后,在里面pkg,我跑npm link(只跑一次)。

然后,cargo generate --git https://github.com/rustwasm/wasm-pack-template创建所需的 Web 应用样板。在此命令生成的文件夹中,我运行npm link schnorrkel-js以使其可见。npm run start运行 webpack 开发服务器。

绑定简单计算函数和警报等初始测试工作正常。

当我开始使用提到的板条箱(示例)中的一些(不是任何)功能时,一切都会中断。不幸的是,我收到的错误消息信息量不大,根本没有帮助:

Entrypoint main = bootstrap.js
[../pkg/schnorrkel_js.js] 3.53 KiB {0} [built]
[../pkg/schnorrkel_js_bg.wasm] 93.7 KiB {0} [built]
    + 27 hidden modules

ERROR in ../pkg/schnorrkel_js_bg.wasm
Module not found: Error: Can't resolve 'env' in '.../schnorrkel-js/pkg'
 @ ../pkg/schnorrkel_js_bg.wasm
 @ ../pkg/schnorrkel_js.js
 @ ./index.js
 @ ./bootstrap.js
 @ multi (webpack)-dev-server/client?http://localhost:8080 ./bootstrap.js

这是什么原因?我有一个强烈的猜测,一些底层功能不能移植到 wasm,但究竟是哪一个,为什么,以及错误消息试图说什么?


笔记:

  • 我正在使用最新的 rust nightly 版本 ( rustc 1.34.0-nightly (d17318011 2019-02-07))

  • 其余的设置步骤直接取自Rust 和 Webassembly 书

  • 货运.toml

[package]
name = "schnorrkel-js"
edition = "2018"

[lib]
crate-type = ["cdylib"]

[dependencies]
wasm-bindgen = "0.2"
schnorrkel = { git = "https://github.com/w3f/schnorrkel.git" }

示例代码:

#[wasm_bindgen] 
pub fn verify(signature: &[u8], message: &[u8], pubkey: &[u8]) -> bool {
    let sig = match Signature::from_bytes(signature) {
        Ok(some_sig) => some_sig,
        Err(_) => return false
    };
    let pk = match PublicKey::from_bytes(pubkey) {
        Ok(some_pk) => some_pk,
        Err(_) => return false
    };

    // works up until here if I return a boolean. 
    // calling this breaks everything.
    pk.verify_simple(SIGNING_CTX, message, &sig)
}

4

1 回答 1

2

看起来这可能是clear_on_drop依赖项使用的 C 代码的问题,如此所述。

尝试nightly在 crate 上启用该功能schnorrkel,这反过来又启用了禁用 C 使用的功能。在您nightly的:clear_on_dropCargo.toml

[dependencies]
wasm-bindgen = "0.2"
schnorrkel = { git = "https://github.com/w3f/schnorrkel.git", features = ["nightly"] }

或者,您可以在已编译的二进制文件上使用wasm2wat(有一个在线版本.wasm)来检查哪个env导入失败。

于 2019-02-11T23:37:44.073 回答