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}