@crisp-e3/zk-inputs
v0.10.0
Published
Core logic to pre-compute CRISP ZK inputs (WASM/JavaScript bindings).
Downloads
108
Readme
@crisp-e3/zk-inputs
WASM bindings for generating CRISP ZK proof inputs, compiled from Rust and shared between the server-side Node.js environment and the browser. This package lets the CRISP SDK produce the circuit witness data needed for Noir-based vote-validity proofs without duplicating the logic in TypeScript.
What it generates
The WASM module wraps a ZKInputsGenerator class that performs BFV encryption and produces the
witness data needed for CRISP's Noir circuits. Two main proof types are supported:
Vote proof (
generateInputs) — encrypts a vote under the committee's threshold BFV public key and produces a witness proving the vote is correctly encrypted and that the voter is eligible (e.g. holds the required token balance, verified via a Merkle membership proof).Vote update / mask proof (
generateInputsForUpdate) — same structure, but used for revotes or masker contributions under the vote masking scheme that provides receipt-freeness. Unlike the first-vote path, this preserves the realprev_ct_commitment(rather than zeroing it) to chain updates together.
The generator also exposes encryptVote / decryptVote for standalone BFV operations and
generateKeys for key generation.
These witness objects are then passed to @noir-lang/noir_js and @aztec/bb.js to generate the
actual ZK proofs.
Usage
This package requires a universal init pattern because:
- In Node.js (>=18) WASM can be loaded synchronously — no preloading needed.
- In the browser the WASM binary must be fetched and instantiated asynchronously.
The init subpackage handles both environments transparently.
❌ Don't use the default export
// Bad — the raw default loader doesn't work in Node.js contexts
import init, { generateVoteInputs } from '@crisp-e3/zk-inputs'✅ Use the universal subpackage loader
import init from '@crisp-e3/zk-inputs/init'
import { generateVoteInputs } from '@crisp-e3/zk-inputs'
await init()
const inputs = generateVoteInputs(/* ... */)Call init() once before using any other imports from @crisp-e3/zk-inputs. In browser
environments init() fetches the WASM binary; in Node.js it is a no-op.
Building
The WASM bundle is compiled from the Rust source in crates/crisp-zk-inputs using wasm-pack:
# From the CRISP root
pnpm build:wasm