circom_prover/
lib.rs

1pub mod prover;
2pub mod witness;
3
4use anyhow::Result;
5use prover::{CircomProof, ProofLib};
6
7#[cfg(feature = "rapidsnark")]
8pub use prover::rapidsnark;
9
10#[cfg(feature = "rustwitness")]
11pub use rust_witness::*;
12use witness::WitnessFn;
13#[cfg(feature = "witnesscalc")]
14pub use witnesscalc_adapter;
15
16#[cfg(feature = "circom-witnesscalc")]
17#[doc(hidden)]
18pub mod __macro_deps {
19    pub use anyhow;
20    pub use circom_witnesscalc;
21    pub use once_cell;
22    pub use once_cell::sync::Lazy;
23}
24
25#[derive(Debug, Clone)]
26pub struct CircomProver {}
27
28impl CircomProver {
29    pub fn prove(
30        proof_lib: ProofLib,
31        wit_fn: WitnessFn,
32        json_input_str: String,
33        zkey_path: String,
34    ) -> Result<CircomProof> {
35        let wit_thread = witness::generate_witness(wit_fn, json_input_str);
36        prover::prove(proof_lib, zkey_path.clone(), wit_thread)
37    }
38
39    pub fn verify(proof_lib: ProofLib, proof: CircomProof, zkey_path: String) -> Result<bool> {
40        prover::verify(proof_lib, zkey_path, proof)
41    }
42}
43
44#[cfg(test)]
45mod tests {
46    use super::*;
47    use std::collections::HashMap;
48
49    const ZKEY_PATH: &str = "./test-vectors/multiplier2_final.zkey";
50
51    fn generate_proof(witness_fn: WitnessFn, proof_lib: ProofLib) -> CircomProof {
52        let inputs = HashMap::from([
53            ("a".to_string(), vec!["1".to_string()]),
54            ("b".to_string(), vec!["2".to_string()]),
55        ]);
56        let input_str = serde_json::to_string(&inputs).unwrap();
57        CircomProver::prove(proof_lib, witness_fn, input_str, ZKEY_PATH.to_string()).unwrap()
58    }
59
60    fn verify_proof(proof: CircomProof, proof_lib: ProofLib) -> bool {
61        CircomProver::verify(proof_lib, proof, ZKEY_PATH.to_string()).unwrap()
62    }
63
64    #[cfg(all(feature = "rustwitness", feature = "arkworks"))]
65    #[test]
66    fn test_rustwitness_arkworks_prove_and_verify() {
67        rust_witness::witness!(multiplier2);
68        let proof = generate_proof(
69            WitnessFn::RustWitness(multiplier2_witness),
70            ProofLib::Arkworks,
71        );
72        assert!(verify_proof(proof, ProofLib::Arkworks));
73    }
74
75    #[cfg(all(feature = "witnesscalc", feature = "arkworks"))]
76    #[test]
77    fn test_witnesscalc_arkworks_prove_and_verify() {
78        witnesscalc_adapter::witness!(multiplier2);
79        let proof = generate_proof(
80            WitnessFn::WitnessCalc(multiplier2_witness),
81            ProofLib::Arkworks,
82        );
83        assert!(verify_proof(proof, ProofLib::Arkworks));
84    }
85
86    #[cfg(all(feature = "circom-witnesscalc", feature = "arkworks"))]
87    #[test]
88    fn test_circom_witnesscalc_arkworks_prove_and_verify() {
89        graph!(multiplier2, "../test-vectors/multiplier2.bin");
90        let proof = generate_proof(
91            WitnessFn::CircomWitnessCalc(multiplier2_witness),
92            ProofLib::Arkworks,
93        );
94        assert!(verify_proof(proof, ProofLib::Arkworks));
95    }
96
97    #[cfg(all(feature = "rustwitness", feature = "rapidsnark"))]
98    #[test]
99    fn test_rustwitness_rapidsnark_prove_and_verify() {
100        rust_witness::witness!(multiplier2);
101
102        let proof = generate_proof(
103            WitnessFn::RustWitness(multiplier2_witness),
104            ProofLib::Rapidsnark,
105        );
106        assert!(verify_proof(proof, ProofLib::Rapidsnark));
107    }
108}