我正在尝试将wrapper for this crate移植到wasm中。我当前的工具链是:
有关构建系统的更多信息:
在我的防锈箱(--lib
箱)中,我仅呼叫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开发服务器。
初始测试(如绑定简单的计算功能和警报)可以正常工作。
当我开始使用提到的板条箱(example)中的 some (不是 any )功能时,一切都中断了。不幸的是,我收到的错误消息非常无用,完全没有帮助:
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的,而是到底哪一个,为什么以及错误消息试图说什么?
注释:
我正在使用最新的锈病夜间版本(rustc 1.34.0-nightly (d17318011 2019-02-07)
)
Cargo.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)
}
答案 0 :(得分:2)
似乎clear_on_drop
依赖项使用的C代码可能是个问题,如here所述。
尝试启用nightly
板条箱上的schnorrkel
功能,这反过来又启用nightly
上的clear_on_drop
功能,从而禁止使用C。在您的{{1 }}:
Cargo.toml
或者,您可以在已编译的[dependencies]
wasm-bindgen = "0.2"
schnorrkel = { git = "https://github.com/w3f/schnorrkel.git", features = ["nightly"] }
二进制文件上使用wasm2wat
(有an online version)来检查哪些.wasm
导入失败。