groth16-proofs
High-performance Groth16 proof generator using arkworks for Orbinum privacy protocol
Efficient Groth16 zero-knowledge proof generator for Orbinum's privacy protocol. Compiles to both native Rust and WebAssembly for maximum flexibility.
🚀 Quick Start
Install
npm/yarn/pnpm (WASM for JavaScript/TypeScript):
Rust (Native binary):
[]
= "2.2"
Use
JavaScript/TypeScript:
import * as groth16 from '@orbinum/groth16-proofs';
import * as snarkjs from 'snarkjs';
// Initialize WASM
await groth16.default();
groth16.init_panic_hook();
// Calculate witness with snarkjs
const witnessArray = await snarkjs.wtns.exportJson('witness.wtns');
// Generate proof (no conversion needed!)
const result = groth16.generate_proof_from_decimal_wasm(
5, // number of public signals
JSON.stringify(witnessArray), // direct from snarkjs
provingKeyBytes
);
const { proof, publicSignals } = JSON.parse(result);
Rust:
use generate_proof_from_witness;
let proof = generate_proof_from_witness?;
📖 Full guides:
What Is This?
This crate generates 128-byte compressed Groth16 proofs from witness data using the arkworks library. It supports:
- Performance: ~1.6–1.8s WASM (small circuits, post-warmup); native Rust faster
- Curves: BN254 (Ethereum-compatible)
- Targets: Native (Rust) + WebAssembly
- Circuits: Unshield, Transfer, Disclosure
- WASM Input Format: Decimal witness (snarkjs native)
For interoperability with snarkjs-generated proofs, the WASM API also exposes
compress_snarkjs_proof_wasm() to convert pi_a/pi_b/pi_c JSON into arkworks
canonical compressed proof bytes (0x..., 128 bytes).
Architecture
┌────────────────────────────────────────────────┐
│ groth16-proofs │
├────────────────────────────────────────────────┤
│ │
│ ┌──────────────────────────────────────────┐ │
│ │ Core (src/proof.rs) │ │
│ │ - Groth16 proof generation │ │
│ │ - Arkworks constraint system │ │
│ └──────────────────────────────────────────┘ │
│ │
│ ┌──────────────────┐ ┌───────────────────┐ │
│ │ Native Binary │ │ WASM Module │ │
│ │ (Rust) │ │ (JavaScript) │ │
│ │ - CLI tool │ │ - Browser support │ │
│ │ - Fastest │ │ - Portable │ │
│ └──────────────────┘ └───────────────────┘ │
│ │
│ ┌──────────────────────────────────────────┐ │
│ │ Dependencies (arkworks ecosystem) │ │
│ │ - ark-bn254, ark-groth16, ark-serialize │ │
│ └──────────────────────────────────────────┘ │
│ │
└────────────────────────────────────────────────┘
Components
| Component | Location | Purpose |
|---|---|---|
| proof.rs | src/ |
Core Groth16 generation using arkworks |
| circuit.rs | src/ |
Circuit wrapper implementing ConstraintSynthesizer |
| utils.rs | src/ |
Format conversions (decimal ↔ hex ↔ field elements) |
| wasm.rs | src/ |
WASM FFI bindings and public API re-exports |
| wasm/snarkjs_proof.rs | src/wasm/ |
snarkjs proof parsing/validation and compression |
| binary | src/bin/ |
CLI tool for Node.js integration |
Features
✅ Multiple Targets: Native + WASM
✅ Fast: ~1.6–1.8s WASM (post-warmup); native Rust faster
✅ WASM Decimal-Only API: Direct snarkjs witness input
✅ Type-Safe: Memory-safe cryptography
✅ Well-Tested: 21+ tests included
✅ Automated Release: CI/CD pipeline ready
✅ Zero External Calls: Everything bundled
Development
Quick Commands
See Makefile for all available targets.
Documentation
- Installation Guide - Setup for Rust and JavaScript
- Usage Guide - Complete API reference with examples
- Witness Formats - Decimal witness flow and format notes
- Release Process - How releases are managed
Publishing
This crate is published to both registries:
License
- Apache License, Version 2.0 (LICENSE-APACHE2)
- GNU General Public License v3.0 or later (LICENSE-GPL3)