Carlos Pérez 74afb0a0cc | 4 months ago | |
---|---|---|
.github/workflows | 1 year ago | |
benches | 1 year ago | |
src | 4 months ago | |
test-vectors | 6 months ago | |
tests | 10 months ago | |
.gitignore | 3 years ago | |
Cargo.lock | 1 year ago | |
Cargo.toml | 4 months ago | |
LICENSE-APACHE | 2 years ago | |
LICENSE-MIT | 2 years ago | |
README.md | 1 year ago | |
rust-toolchain.toml | 1 year 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
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.
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.