groth16.rs
1 use ark_circom::{CircomBuilder, CircomConfig}; 2 use ark_std::rand::thread_rng; 3 use color_eyre::Result; 4 5 use ark_bn254::Bn254; 6 use ark_groth16::{ 7 create_random_proof as prove, generate_random_parameters, prepare_verifying_key, verify_proof, 8 }; 9 10 #[test] 11 fn groth16_proof() -> Result<()> { 12 let cfg = CircomConfig::<Bn254>::new( 13 "./test-vectors/mycircuit.wasm", 14 "./test-vectors/mycircuit.r1cs", 15 )?; 16 let mut builder = CircomBuilder::new(cfg); 17 builder.push_input("a", 3); 18 builder.push_input("b", 11); 19 20 // create an empty instance for setting it up 21 let circom = builder.setup(); 22 23 let mut rng = thread_rng(); 24 let params = generate_random_parameters::<Bn254, _, _>(circom, &mut rng)?; 25 26 let circom = builder.build()?; 27 28 let inputs = circom.get_public_inputs().unwrap(); 29 30 let proof = prove(circom, ¶ms, &mut rng)?; 31 32 let pvk = prepare_verifying_key(¶ms.vk); 33 34 let verified = verify_proof(&pvk, &proof, &inputs)?; 35 36 assert!(verified); 37 38 Ok(()) 39 } 40 41 #[test] 42 fn groth16_proof_wrong_input() { 43 let cfg = CircomConfig::<Bn254>::new( 44 "./test-vectors/mycircuit.wasm", 45 "./test-vectors/mycircuit.r1cs", 46 ) 47 .unwrap(); 48 let mut builder = CircomBuilder::new(cfg); 49 builder.push_input("a", 3); 50 // This isn't a public input to the circuit, should faild 51 builder.push_input("foo", 11); 52 53 // create an empty instance for setting it up 54 let circom = builder.setup(); 55 56 let mut rng = thread_rng(); 57 let _params = generate_random_parameters::<Bn254, _, _>(circom, &mut rng).unwrap(); 58 59 let _ = builder.build().unwrap_err(); 60 } 61 62 #[test] 63 #[cfg(feature = "circom-2")] 64 fn groth16_proof_circom2() -> Result<()> { 65 let cfg = CircomConfig::<Bn254>::new( 66 "./test-vectors/circom2_multiplier2.wasm", 67 "./test-vectors/circom2_multiplier2.r1cs", 68 )?; 69 let mut builder = CircomBuilder::new(cfg); 70 builder.push_input("a", 3); 71 builder.push_input("b", 11); 72 73 // create an empty instance for setting it up 74 let circom = builder.setup(); 75 76 let mut rng = thread_rng(); 77 let params = generate_random_parameters::<Bn254, _, _>(circom, &mut rng)?; 78 79 let circom = builder.build()?; 80 81 let inputs = circom.get_public_inputs().unwrap(); 82 83 let proof = prove(circom, ¶ms, &mut rng)?; 84 85 let pvk = prepare_verifying_key(¶ms.vk); 86 87 let verified = verify_proof(&pvk, &proof, &inputs)?; 88 89 assert!(verified); 90 91 Ok(()) 92 } 93 94 #[test] 95 #[cfg(feature = "circom-2")] 96 fn witness_generation_circom2() -> Result<()> { 97 let cfg = CircomConfig::<Bn254>::new( 98 "./test-vectors/circom2_multiplier2.wasm", 99 "./test-vectors/circom2_multiplier2.r1cs", 100 )?; 101 let mut builder = CircomBuilder::new(cfg); 102 builder.push_input("a", 3); 103 builder.push_input("b", 0x100000000u64 - 1); 104 105 assert!(builder.build().is_ok()); 106 107 Ok(()) 108 }