mirror of
https://github.com/pezkuwichain/pezkuwi-wasm.git
synced 2026-10-27 13:59:51 +00:00
Ship the whole wasm-crypto again, not just sr25519
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.
This commit is contained in:
1 parent
c3b5de65ae
commit
f1eee23fdf
27 files changed
+353
-666
No files matched your search
@@ -5,7 +5,7 @@
|
||||
|
||||
set -e
|
||||
|
||||
source scripts/rust-version.sh
|
||||
source "$(dirname "$0")/rust-version.sh"
|
||||
|
||||
WSM=$PKG_NAME/build-wasm/wasm_bg.wasm
|
||||
OPT=$PKG_NAME/build-wasm/wasm_opt.wasm
|
||||
@@ -45,14 +45,14 @@ mkdir -p $DENO_DIR
|
||||
cp $ASM $DENO_ASM
|
||||
|
||||
# cleanup the generated asm, converting to cjs
|
||||
sed -i -e '/import {/d' $ASM
|
||||
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
|
||||
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 '/^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
|
||||
sed -i -e 's/var retasmFunc = .*/export const asmJsInit = (wbg) => asmFunc({ wbg });/g' $DENO_ASM
|
||||
|
||||
# cleanups
|
||||
rm -rf $PKG_NAME-asmjs/build/cjs/*-e
|
||||
|
||||
@@ -8,8 +8,9 @@ import { formatNumber } from '@pezkuwi/util';
|
||||
|
||||
const PKG_NAME = process.env['PKG_NAME'];
|
||||
const DIR_DENO = `./${PKG_NAME}-wasm/build-deno/deno`;
|
||||
const DIR_ESM = `./${PKG_NAME}-wasm/build`;
|
||||
const DIR_CJS = `./${PKG_NAME}-wasm/build/cjs`;
|
||||
const HDR = `// Copyright 2019-${new Date().getFullYear()} @polkadot/${PKG_NAME}-wasm authors & contributors\n// SPDX-License-Identifier: Apache-2.0\n\n// Generated as part of the build, do not edit\n`;
|
||||
const HDR = `// Copyright 2019-${new Date().getFullYear()} @pezkuwi/${PKG_NAME}-wasm authors & contributors\n// SPDX-License-Identifier: Apache-2.0\n\n// Generated as part of the build, do not edit\n`;
|
||||
|
||||
const data = fs.readFileSync(`./${PKG_NAME}/build-wasm/wasm_opt.wasm`);
|
||||
const compressed = Buffer.from(zlibSync(data, { level: 9 }));
|
||||
@@ -27,6 +28,17 @@ exports.lenOut = ${data.length};
|
||||
exports.bytes = '${base64}';
|
||||
`);
|
||||
|
||||
// The package exports `./bytes` from build/bytes.js for ESM consumers. Without this
|
||||
// write that file kept whatever src/bytes.js held, and could ship a different wasm
|
||||
// from the one in build/cjs.
|
||||
fs.writeFileSync(`${DIR_ESM}/bytes.js`, `${HDR}
|
||||
export const lenIn = ${compressed.length};
|
||||
|
||||
export const lenOut = ${data.length};
|
||||
|
||||
export const bytes = '${base64}';
|
||||
`);
|
||||
|
||||
fs.writeFileSync(`${DIR_DENO}/bytes.js`, `${HDR}
|
||||
export const lenIn = ${compressed.length};
|
||||
|
||||
|
||||
Reference in new issue
Block a user