mirror of
https://github.com/pezkuwichain/pezkuwi-wasm.git
synced 2026-10-27 13:59:51 +00:00
7.5.15-7.5.18 shipped a wasm built from a separate sr25519-only module
(4 exports) and replaced every other function in bundle.ts with a stub
that throws "not yet implemented": ed25519 pair/sign/verify, sr25519
agree and hard/soft derivation, VRF, and all of secp256k1. Because the
wasm still initialised, isReady() was true and @pezkuwi/util-crypto
called those stubs instead of falling back to JS, so ed25519 and
ethereum accounts and any // derivation failed at runtime wherever the
package is used. bip39Generate threw as well, and bip39ToSeed hashed with
SHA-256 where BIP39 specifies SHA-512.
The Rust in packages/wasm-crypto/src/rs already implemented all of it,
with sr25519 under the "bizinikiwi" context. This builds that crate and
binds it again:
- bundle.ts: the withWasm bindings for every ext_* export, as in
b61206c; getSigningContext() kept, returning "bizinikiwi".
- wasm-bridge: wasm-bindgen 0.2.90 passes an alignment to
__wbindgen_malloc/__wbindgen_free (without it Rust aborts with
`unreachable`); __wbindgen_memory returns a heap index; the two-argument
getRandomValues import takes the crypto object and a Uint8Array by heap
index, not a pointer and length.
- build-wasm.sh: source rust-version.sh relative to the script; strip the
`import * as wbg` line newer wasm2js emits and call asmFunc({ wbg }),
which is the shape its output expects.
- pack-wasm-base.mjs: also write build/bytes.js. The package exports
./bytes from there for ESM, and it was still the old sr25519-only wasm.
The committed src copies are now empty placeholders, so a build that
skips the wasm step fails instead of shipping a stale binary.
- Tests: the sr25519 known-signature vectors were substrate-context
vectors; they are replaced by vectors signed by 7.5.18, plus a test that
the same seed yields the same public key. A rename had changed the
substrate-bip39 vector's password to "Bizinikiwi"; it is "Substrate".
Compatibility with 7.5.18, measured in separate processes:
mnemonic -> mini secret -> public key is identical for every phrase with
an empty or ASCII password (12/12). It differs when the BIP39 password has
characters NFKD changes: 7.5.18 normalised it, while the Rust crate and
util-crypto's JS path do not, so this returns to the canonical result.
Rust 43/43, JS 55/55, wasm and asm.js runners pass. With this build in
place, pezkuwi-extension's suite goes from 19 failing to 3 (the 3 left
are unrelated sorting tests).
All wasm packages move to 7.5.19 and pin each other at 7.5.19.
61 lines
1.9 KiB
Bash
Executable File
61 lines
1.9 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Copyright 2019-2025 @pezkuwi/wasm authors & contributors
|
|
# This software may be modified and distributed under the terms
|
|
# of the Apache-2.0 license. See the LICENSE file for details.
|
|
|
|
set -e
|
|
|
|
source "$(dirname "$0")/rust-version.sh"
|
|
|
|
WSM=$PKG_NAME/build-wasm/wasm_bg.wasm
|
|
OPT=$PKG_NAME/build-wasm/wasm_opt.wasm
|
|
ASM=$PKG_NAME-asmjs/build/cjs/data.js
|
|
DENO_DIR=$PKG_NAME-asmjs/build-deno/deno
|
|
DENO_ASM=$DENO_DIR/data.js
|
|
|
|
# build new via wasm-pack
|
|
echo "*** Building Rust sources"
|
|
cd $PKG_NAME
|
|
if [ "$RUST_VER" == "stable" ]; then
|
|
RUSTC_BOOTSTRAP=1 cargo build --target wasm32-unknown-unknown --release -Z build-std=std,panic_abort
|
|
else
|
|
rustup run $RUST_VER xargo build --target wasm32-unknown-unknown --release
|
|
fi
|
|
cd ..
|
|
|
|
echo "*** Converting to WASM"
|
|
# Use system wasm-bindgen (installed via cargo)
|
|
wasm-bindgen $PKG_NAME/target/wasm32-unknown-unknown/release/wasm.wasm --out-dir $PKG_NAME/build-wasm --target web
|
|
|
|
# optimise using system wasm-opt
|
|
echo "*** Optimising WASM output"
|
|
wasm-opt $WSM -Oz -o $OPT
|
|
|
|
# convert wasm to base64 structure
|
|
echo "*** Packing WASM into baseX"
|
|
node ../scripts/pack-wasm-base.mjs
|
|
|
|
# build asmjs version from the input (optimised) WASM
|
|
echo "*** Building asm.js version"
|
|
# Use system wasm2js
|
|
wasm2js -Oz --output $ASM $OPT
|
|
|
|
# copy the deno version
|
|
mkdir -p $DENO_DIR
|
|
cp $ASM $DENO_ASM
|
|
|
|
# cleanup the generated asm, converting to cjs
|
|
sed -i -e '/^import /d' $ASM
|
|
sed -i -e '1,/var retasmFunc = /!d' $ASM
|
|
sed -i -e 's/var retasmFunc = .*/exports.asmJsInit = (wbg) => asmFunc({ wbg });/g' $ASM
|
|
|
|
# same as the cjs version, this time for deno
|
|
sed -i -e '/^import /d' $DENO_ASM
|
|
sed -i -e '1,/var retasmFunc = /!d' $DENO_ASM
|
|
sed -i -e 's/var retasmFunc = .*/export const asmJsInit = (wbg) => asmFunc({ wbg });/g' $DENO_ASM
|
|
|
|
# cleanups
|
|
rm -rf $PKG_NAME-asmjs/build/cjs/*-e
|
|
rm -rf $PKG_NAME-asmjs/build-deno/deno/*-e
|
|
rm -rf $PKG_NAME-wasm/build/cjs/*-e
|
|
rm -rf $PKG_NAME-wasm/build-deno/deno/*-e |