Skip to main content

Zero-Knowledge Proofs

Nethereum provides a complete ZK proof pipeline — generation, verification, and Solidity-compatible proof formatting — for Groth16 proofs on the BN128 elliptic curve.

Proof Generation

Two proof generation paths are available depending on your platform:

Browser (Blazor WebAssembly)Nethereum.ZkProofs.Snarkjs.Blazor calls snarkjs via JS interop. Private inputs never leave the browser.

var provider = new SnarkjsBlazorProvider(jsRuntime, "./js/snarkjs.min.js");
await provider.InitializeAsync();
var result = await provider.FullProveAsync(request);

Native (Desktop/Server)Nethereum.CircomWitnessCalc + Nethereum.ZkProofs.RapidSnark use native C/C++ libraries via P/Invoke. Typically 10-50x faster than browser-based generation.

byte[] witness = WitnessCalculator.CalculateWitness(graphData, inputsJson);
using var prover = new RapidSnarkProver();
var (proofJson, publicSignalsJson) = prover.Prove(zkeyBytes, witness);

Both paths implement IZkProofProvider from Nethereum.ZkProofs, making them interchangeable.

Proof Verification

Nethereum.ZkProofsVerifier provides pure C# Groth16 verification on the BN128 curve. Directly consumes snarkjs/Circom JSON output:

var result = CircomGroth16Adapter.Verify(proofJson, vkJson, publicJson);

Demo Applications

Two working demos show the full generate-and-verify flow with educational UI:

  • Blazor WASMsrc/demos/Nethereum.ZkProofs.Blazor.Demo/ (browser-based, snarkjs)
  • Avalonia Desktopsrc/demos/Nethereum.ZkProofs.Avalonia.Demo/ (native, rapidsnark)

Packages

PackageDescription
Nethereum.ZkProofsProvider-agnostic interfaces and models for ZK proof generation
Nethereum.ZkProofsVerifierPure C# Groth16 verification on BN128 (Circom/snarkjs)
Nethereum.ZkProofs.Snarkjs.BlazorBrowser-based Groth16 proof generation via snarkjs JS interop
Nethereum.ZkProofs.RapidSnarkNative Groth16 proof generation via rapidsnark (P/Invoke)
Nethereum.CircomWitnessCalcNative witness generation via circom-witnesscalc (P/Invoke)