use rsnark::{
Groth16BN254GnarkProver,
core::{API, Circuit, CircuitWitness},
};
use rsnark_core::{CircuitElement, Witness, circuit, variable::CircuitVariable};
#[circuit]
pub struct TestCircuit<T> {
a: T,
b: T,
pub c: T,
}
impl<T> Circuit for TestCircuit<T>
where
T: CircuitElement,
T::CircuitWitness: CircuitWitness<CircuitElement = CircuitVariable<T>>,
{
fn define(&self, api: &mut impl API) {
let c = api.add(&self.a, &self.b);
api.assert_is_equal(&c, &self.c);
}
}
fn main() {
run();
}
fn run() {
let prover = Groth16BN254GnarkProver::new();
let circuit_prover = prover.compile_circuit::<TestCircuit<u32>>().unwrap();
let (pk, vk) = circuit_prover.setup().unwrap();
let circuit_witness = Witness::<TestCircuit<u32>> {
a: 3,
b: 4,
c: 7, };
let proof = circuit_prover.prove(&pk, &circuit_witness).unwrap();
let public_witness = circuit_witness.into_public_witness();
circuit_prover.verify(&vk, &proof, public_witness).unwrap();
}