#generation #witness #proof #circom #arkworks #r1cs #groth16

ark-circom

Arkworks bindings to Circom's R1CS, for Groth16 Proof and Witness generation in Rust

1 unstable release

0.1.0 Jul 26, 2023

#4 in #witness

Download history 72/week @ 2023-12-13 37/week @ 2023-12-20 10/week @ 2023-12-27 29/week @ 2024-01-03 32/week @ 2024-01-10 71/week @ 2024-01-17 16/week @ 2024-01-24 18/week @ 2024-01-31 42/week @ 2024-02-07 65/week @ 2024-02-14 122/week @ 2024-02-21 116/week @ 2024-02-28 98/week @ 2024-03-06 46/week @ 2024-03-13 64/week @ 2024-03-20 37/week @ 2024-03-27

250 downloads per month
Used in rln

MIT/Apache

5.5MB
2.5K SLoC

Rust 2.5K SLoC // 0.0% comments JavaScript 239 SLoC // 0.1% comments Shell 51 SLoC

ark-circom

Arkworks bindings to Circom's R1CS, for Groth16 Proof and Witness generation in Rust.

Github Actions

Documentation

Clone the repository and run cd ark-circom/ && cargo doc --open

Add ark-circom to your repository

[dependencies]

ark-circom = { git = "https://github.com/gakonst/ark-circom.git" }

Example

// Load the WASM and R1CS for witness and proof generation
let cfg = CircomConfig::<Bn254>::new(
    "./test-vectors/mycircuit.wasm",
    "./test-vectors/mycircuit.r1cs",
)?;

// Insert our public inputs as key value pairs
let mut builder = CircomBuilder::new(cfg);
builder.push_input("a", 3);
builder.push_input("b", 11);

// Create an empty instance for setting it up
let circom = builder.setup();

// Run a trusted setup
let mut rng = thread_rng();
let params = generate_random_parameters_with_reduction(circom, &mut rng)?;

// Get the populated instance of the circuit with the witness
let circom = builder.build()?;

let inputs = circom.get_public_inputs().unwrap();

// Generate the proof
let proof = prove(&params, circom, &mut rng)?;

// Check that the proof is valid
let pvk = process_vk(&params.vk)?;
let verified = verify_with_processed_vk(&pvk, &inputs, &proof)?;
assert!(verified);

Running the tests

Tests require the following installed:

  1. solc. We also recommend using solc-select for more flexibility.
  2. ganache-cli

Features

  • Witness generation using Circom's WASM witness code
  • ZKey parsing into Arkworks Proving Key over BN254
  • Compatibility layer for Ethereum types, so that proofs can be used in Solidity verifiers
  • Proof generations and verification using Arkworks
  • CLI for common operations

Known limitations

Currently, due to an issue in our upstream (https://github.com/wasmerio/wasmer/issues/4072), this crate works as expected only up to Rust version 1.67.0; in newer Rust versions, wasmer is currently unsound.

Acknowledgements

This library would not have been possibly without the great work done in:

Special shoutout to Kobi Gurkan for all the help in parsing SnarkJS' ZKey file format.

Dependencies

~19–35MB
~539K SLoC