mmagician e3bfb8175d | 4 months ago | |
---|---|---|
.github/workflows | 4 months ago | |
benches | 4 months ago | |
src | 4 months ago | |
test-vectors | 4 months ago | |
tests | 4 months ago | |
.gitignore | 4 months ago | |
Cargo.lock | 4 months ago | |
Cargo.toml | 4 months ago | |
LICENSE-APACHE | 2 years ago | |
LICENSE-MIT | 2 years ago | |
README.md | 4 months ago | |
rust-toolchain.toml | 4 months ago |
Arkworks bindings to Circom's R1CS, for Groth16 Proof and Witness generation in Rust.
Clone the repository and run cd ark-circom/ && cargo doc --open
[dependencies]
ark-circom = { git = "https://github.com/gakonst/ark-circom.git" }
// 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(¶ms, circom, &mut rng)?;
// Check that the proof is valid
let pvk = process_vk(¶ms.vk)?;
let verified = verify_with_processed_vk(&pvk, &inputs, &proof)?;
assert!(verified);
Tests require the following installed:
solc
. We also recommend using solc-select for more flexibility.ganache-cli
The prover key generated by circom differs from the one generated by arkworks' groth16 library. While the format is the same, it represents different values.
Circom 'prepares' the powers of tau by converting them to Lagrange base, i.e. from s^i.G
-> L_i(s).G
. This affects the witness generation process, and the caller needs to ensure the correct R1CSToQAP
implementer is used:
CircomReduction
for working with circom-generated files,LibsnarkReduction
for setup produced using the arkworks backend.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.