liminal_ark_relations/preimage/
mod.rs1mod relation;
2#[cfg(all(test, feature = "circuit"))]
3mod tests;
4
5#[cfg(feature = "circuit")]
6use {
7 crate::environment::CircuitField,
8 ark_bls12_381::Bls12_381,
9 ark_crypto_primitives::SNARK,
10 ark_ec::bls12::Bls12,
11 ark_ff::Fp256,
12 ark_groth16::{Groth16, Proof, VerifyingKey},
13 ark_std::vec::Vec,
14 liminal_ark_poseidon::hash,
15};
16
17pub use self::relation::{
18 PreimageRelationWithFullInput, PreimageRelationWithPublicInput, PreimageRelationWithoutInput,
19};
20
21pub type FrontendHash = [u64; 4];
22pub type FrontendPreimage = [u64; 4];
23
24#[cfg(feature = "circuit")]
25#[allow(clippy::type_complexity)]
26pub fn preimage_proving() -> (
27 VerifyingKey<Bls12<ark_bls12_381::Parameters>>,
28 Vec<Fp256<ark_ed_on_bls12_381::FqParameters>>,
29 Proof<Bls12<ark_bls12_381::Parameters>>,
30) {
31 let circuit_withouth_input = PreimageRelationWithoutInput::new();
32
33 let preimage = CircuitField::from(7u64);
34 let image = hash::one_to_one_hash([preimage]);
35 let frontend_image: [u64; 4] = image.0 .0;
36
37 let full_circuit = PreimageRelationWithFullInput::new(frontend_image, preimage.0 .0);
38
39 let mut rng = ark_std::test_rng();
40 let (pk, vk) =
41 Groth16::<Bls12_381>::circuit_specific_setup(circuit_withouth_input, &mut rng).unwrap();
42
43 let circuit_with_public_input = PreimageRelationWithPublicInput::new(frontend_image);
44 let input = circuit_with_public_input.serialize_public_input();
45
46 let proof = Groth16::prove(&pk, full_circuit, &mut rng).unwrap();
47
48 (vk, input, proof)
49}