Skip to content

About

ZK-SNARK proof generator for Orbinum. Combines snarkjs (witness) with arkworks WASM (proof generation) to produce 128-byte Groth16 proofs.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

@orbinum/proof-generator

Fast ZK-SNARK proof generator for Orbinum privacy protocol. Witness calculation (TypeScript/snarkjs) + Proof generation (WASM/arkworks)

npm version License Node.js

Generate 128-byte Groth16 ZK-SNARK proofs in ~400ms (small circuits, post-warmup). Same TypeScript code runs identically in Node.js, browsers, Electron, and Tauri.

New in v2.0: Circuit artifacts and WASM modules are now installed automatically as npm dependencies (@orbinum/circuits and @orbinum/groth16-proofs). No more manual downloads!

Quick Start

npm install @orbinum/proof-generator

Dependencies are installed automatically:

  • @orbinum/circuits - Circuit artifacts (WASM, proving keys)
  • @orbinum/groth16-proofs - Arkworks WASM proof generator
import { generateProof, CircuitType } from '@orbinum/proof-generator';

const result = await generateProof(CircuitType.Unshield, {
  merkle_root: '0x...',
  nullifier: '0x...',
  amount: '100',
  // ... more inputs
});

console.log('Proof:', result.proof); // 0x... (128 bytes)
console.log('Signals:', result.publicSignals); // ['0x...', ...]

Documentation

Features

  • ✅ Fast: ~80ms per proof (small circuits, snarkjs backend); ~253ms with arkworks backend
  • ✅ Optimized: Direct decimal format pipeline (no conversion overhead)
  • ✅ Compact: 128-byte proofs (50% smaller than snarkjs)
  • ✅ Universal: Node.js, browsers, Electron, Tauri - same code
  • ✅ Simple: No build tools, no Rust, no setup
  • ✅ Type-Safe: Full TypeScript types

Performance

Benchmarked on Apple M-series (Node.js, 3 runs post-warmup):

Circuit snarkjs backend arkworks backend First call overhead
Unshield ~407ms ~2.1s +1.5–2s (WASM init)
Transfer ~1.1s ~7.2s +1.5–2s (WASM init)

snarkjs backend (default): uses snarkjs fullProve with .zkey proving keys — fastest option post-warmup.

arkworks backend: uses snarkjs witness-only + arkworks WASM with .ark proving keys — ~5× slower (Unshield, Transfer). .ark artifacts are 2–3× smaller than .zkey.

The first proof call in a process incurs the WASM initialization overhead (~1.5–2s). All subsequent proofs skip this.

Phase breakdown — where each backend spends its time (1 run):

Circuit Backend Load Witness Serialize Prove Compress Total
Unshield snarkjs 21ms — — 367ms — 388ms
Unshield arkworks 8ms 28ms 26ms 1965ms — 2027ms
Transfer snarkjs 54ms — — 1094ms — 1148ms
Transfer arkworks 24ms 94ms 101ms 6901ms — 7120ms

Prove represents 97% of total time for large circuits (Unshield, Transfer). Load, witness calculation, and serialization are negligible. For arkworks, Prove includes PK deserialization + Groth16::prove inside WASM.

Supported Circuits

Circuit Versions Use Case
Unshield 1, 2 Withdraw from pool to public address
Transfer 1, 2 Private-to-private transfer
Shield 1+ Deposit bound to its value and asset

v2 (active since @orbinum/circuits 0.15.0) binds the encrypted memos to the proof through an extra memo_hash public input. Shield (since 0.16.0) has one layout at every version, so a rotated shield key proves without an update. The providers serve the manifest's active version unless a circuit is pinned, and verify every artifact against the manifest's sha256; see docs/usage.md.

Related Packages

License

GNU General Public License v3.0 or later (LICENSE).

Not dual-licensed: @orbinum/circuits and @orbinum/groth16-proofs are both GPL-3.0, and this package cannot be used without them.

About

ZK-SNARK proof generator for Orbinum. Combines snarkjs (witness) with arkworks WASM (proof generation) to produce 128-byte Groth16 proofs.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages