generics/
generics.rs

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, // 3 + 4 = 7
39    };
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}