mirror of
https://github.com/pezkuwichain/pezkuwi-wasm.git
synced 2026-10-27 13:59:51 +00:00
f1eee23fdf90defc8ba0d028d4320fec52f3c8ce
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.
@pezkuwi/wasm-crypto
WASM cryptographic primitives for PezkuwiChain.
Overview
This package provides WebAssembly-based cryptographic functions used by PezkuwiChain applications, including:
- SR25519 - Schnorr signatures with Ristretto point compression (bizinikiwi signing context)
- ED25519 - Edwards-curve Digital Signature Algorithm
- BIP39 - Mnemonic code for generating deterministic keys
- Hashing - Blake2b, SHA256, SHA512, Keccak, XXHash, Scrypt, PBKDF2
Installation
npm install @pezkuwi/wasm-crypto
# or
yarn add @pezkuwi/wasm-crypto
Usage
import { waitReady, sr25519KeypairFromSeed, sr25519Sign } from '@pezkuwi/wasm-crypto';
// Initialize WASM
await waitReady();
// Generate keypair from seed
const seed = new Uint8Array(32); // your seed here
const keypair = sr25519KeypairFromSeed(seed);
// Sign a message
const publicKey = keypair.slice(64);
const secretKey = keypair.slice(0, 64);
const message = new TextEncoder().encode('Hello PezkuwiChain!');
const signature = sr25519Sign(publicKey, secretKey, message);
Packages
| Package | Description |
|---|---|
@pezkuwi/wasm-crypto |
Main package with all crypto functions |
@pezkuwi/wasm-crypto-wasm |
Compiled WASM binary |
@pezkuwi/wasm-crypto-asmjs |
ASM.js fallback for older browsers |
@pezkuwi/wasm-crypto-init |
Initialization helpers |
@pezkuwi/wasm-bridge |
WASM bridge utilities |
@pezkuwi/wasm-util |
Utility functions |
Building from Source
# Install dependencies
yarn install
# Build WASM and JavaScript
yarn build
# Run tests
yarn test
Prerequisites
- Node.js 18+
- Rust toolchain (for WASM compilation)
- wasm-pack
Signing Context
This package uses bizinikiwi as the SR25519 signing context, which is unique to PezkuwiChain. This ensures signature incompatibility with other networks for security.
License
Apache-2.0
Languages
TypeScript
38.5%
JavaScript
34%
Rust
22.4%
Shell
3.4%
Python
1.7%