1use rsnark::{
2 Groth16BN254GnarkProver,
3 core::{API, Circuit, CircuitWitness},
4};
5use rsnark_core::{CircuitElement, Witness, circuit, variable::CircuitVariable};
6
7#[circuit]
8pub struct TestCircuit<T> {
9 a: T,
10 b: T,
11 pub c: T,
12}
13
14impl<T> Circuit for TestCircuit<T>
15where
16 T: CircuitElement,
17 T::CircuitWitness: CircuitWitness<CircuitElement = CircuitVariable<T>>,
18{
19 fn define(&self, api: &mut impl API) {
20 let c = api.add(&self.a, &self.b);
21 api.assert_is_equal(&c, &self.c);
22 }
23}
24
25fn main() {
26 run();
27}
28
29fn run() {
30 let prover = Groth16BN254GnarkProver::new();
31
32 let circuit_prover = prover.compile_circuit::<TestCircuit<u32>>().unwrap();
33 let (pk, vk) = circuit_prover.setup().unwrap();
34
35 let circuit_witness = Witness::<TestCircuit<u32>> {
36 a: 3,
37 b: 4,
38 c: 7, };
40
41 let proof = circuit_prover.prove(&pk, &circuit_witness).unwrap();
42
43 let public_witness = circuit_witness.into_public_witness();
44 circuit_prover.verify(&vk, &proof, public_witness).unwrap();
45}