* All tests pass under circom-2 feature flag - Check for version in WASM, default to version 1 - Include Circom1 when Circom 2 feature flag is enabled Currently a lot of code duplication. Once Circom-2 is more stable and proven to work in the wild, feature flag can be removed. * Separate Circom 1 and Circom2 witness calculation * Cleanup * WitnessCalculator helpers for Circom 1 and 2 Also make helper fn private * Move comment * Fix expression return * cargo fmt * Add cargo test circom-2 to ci |
||
---|---|---|
.github/workflows | ||
benches | ||
src | ||
test-vectors | ||
tests | ||
.gitignore | ||
Cargo.lock | ||
Cargo.toml | ||
README.md |
README.md
ark-circom
Arkworks bindings to Circom's R1CS, for Groth16 Proof and Witness generation in Rust.
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-rs" }
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::<Bn254, _, _>(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(circom, ¶ms, &mut rng)?;
// Check that the proof is valid
let pvk = prepare_verifying_key(¶ms.vk);
let verified = verify_proof(&pvk, &proof, &inputs)?;
assert!(verified);
Running the tests
Tests require the following installed:
solc
. We also recommend using solc-select for more flexibility.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
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.