testudo/profiler/nizk.rs
profiler/nizk.rsRaw
1#![allow(non_snake_case)]
2#![allow(clippy::assertions_on_result_states)]
3
4extern crate flate2;
5extern crate libspartan;
6extern crate merlin;
7extern crate rand;
8
9use ark_serialize::*;
10use libspartan::parameters::poseidon_params;
11use libspartan::poseidon_transcript::PoseidonTranscript;
12use libspartan::{Instance, NIZK};
13
14fn print(msg: &str) {
15 let star = "* ";
16 println!("{:indent$}{}{}", "", star, msg, indent = 2);
17}
18
19pub fn main() {
20 // the list of number of variables (and constraints) in an R1CS instance
21 let inst_sizes = vec![10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20];
22
23 println!("Profiler:: NIZK");
24 for &s in inst_sizes.iter() {
25 let num_vars = (2_usize).pow(s as u32);
26 let num_cons = num_vars;
27 let num_inputs = 10;
28
29 // produce a synthetic R1CSInstance
30 let (inst, vars, inputs) = Instance::produce_synthetic_r1cs(num_cons, num_vars, num_inputs);
31
32 // produce public generators
33 // let gens = NIZKGens::new(num_cons, num_vars, num_inputs);
34
35 let params = poseidon_params();
36 // produce a proof of satisfiability
37 let mut prover_transcript = PoseidonTranscript::new(¶ms);
38 let proof = NIZK::prove(&inst, vars, &inputs, &mut prover_transcript);
39
40 let mut proof_encoded = Vec::new();
41 proof.serialize(&mut proof_encoded).unwrap();
42 let msg_proof_len = format!("NIZK::proof_compressed_len {:?}", proof_encoded.len());
43 print(&msg_proof_len);
44
45 // verify the proof of satisfiability
46 let mut verifier_transcript = PoseidonTranscript::new(¶ms);
47 assert!(proof
48 .verify(&inst, &inputs, &mut verifier_transcript)
49 .is_ok());
50
51 println!();
52 }
53}