Я пытаюсь перенести упаковщик для этого ящика в wasm.Мой текущий набор инструментов:
- wasm-pack
- webpack
- wasm-bindgen
Немного больше информации о системе сборки:
В моем ящике с ржавчиной (который является --lib
ящиком) я звоню только wasm-pack build --target browser
.Это создаст папку pkg
, содержащую BLOB-объекты wasm и связанные файлы js.Нареканий от компилятора здесь нет.
Затем внутри pkg
я запускаю npm link
(только один раз).
Затем cargo generate --git https://github.com/rustwasm/wasm-pack-template
создает необходимый шаблон веб-приложения.Внутри папки, созданной этой командой, я запускаю npm link schnorrkel-js
, чтобы сделать ее видимой.npm run start
запускает сервер разработки веб-пакетов.
Первоначальные тесты, такие как связывание простых функций расчета и оповещения, работают нормально.
Все ломается, когда я начинаю использовать некоторые (не 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, а какие именно, почему и что пытается сказать сообщение об ошибке?
Примечания:
[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)
}