liminal_ark_relations/preimage/
mod.rs

1mod 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}