Rust / Wasm: модуль не найден: ошибка: не удается разрешить 'env' в - PullRequest
0 голосов
/ 08 февраля 2019

Я пытаюсь перенести упаковщик для этого ящика в 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, а какие именно, почему и что пытается сказать сообщение об ошибке?


Примечания:

  • Я использую последнюю версию ржавчины ночью (rustc 1.34.0-nightly (d17318011 2019-02-07))

  • остальныешаги по настройке взяты непосредственно из Rust and Webassembly book .

  • 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)
}

1 Ответ

0 голосов
/ 12 февраля 2019

Похоже, что это может быть проблема с кодом C, используемым зависимостью clear_on_drop, как упоминалось здесь .

Попробуйте включить функцию nightly на schnorrkel crate, который, в свою очередь, включает функцию nightly на clear_on_drop, которая отключает использование C. На вашем Cargo.toml:

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

В качестве альтернативы, вы можете использовать wasm2wat (есть онлайн-версия ) в скомпилированном .wasm бинарном файле для проверки того, какой env импорт не выполняется.

...