arnaucube
arnaucube/ark-r1cs-stdPublic Self-hosted repository
ark-r1cs-std/crypto-primitives/src/commitment/injective_map/constraints.rs
crypto-primitives/src/commitment/injective_map/constraints.rsRaw
 1use algebra::{Field, PrimeField};
 2
 3use crate::commitment::{
 4    injective_map::{InjectiveMap, PedersenCommCompressor},
 5    pedersen::{
 6        constraints::{
 7            PedersenCommitmentGadget, PedersenCommitmentGadgetParameters, PedersenRandomnessGadget,
 8        },
 9        PedersenWindow,
10    },
11    CommitmentGadget,
12};
13
14pub use crate::crh::injective_map::constraints::InjectiveMapGadget;
15use algebra::groups::Group;
16use r1cs_core::{ConstraintSystem, SynthesisError};
17use r1cs_std::{groups::GroupGadget, uint8::UInt8};
18
19use std::marker::PhantomData;
20
21pub struct PedersenCommitmentCompressorGadget<G, I, ConstraintF, GG, IG>
22where
23    G: Group,
24    I: InjectiveMap<G>,
25    ConstraintF: Field,
26    GG: GroupGadget<G, ConstraintF>,
27    IG: InjectiveMapGadget<G, I, ConstraintF, GG>,
28{
29    _compressor:        PhantomData<I>,
30    _compressor_gadget: PhantomData<IG>,
31    _crh:               PedersenCommitmentGadget<G, ConstraintF, GG>,
32}
33
34impl<G, I, ConstraintF, GG, IG, W> CommitmentGadget<PedersenCommCompressor<G, I, W>, ConstraintF>
35    for PedersenCommitmentCompressorGadget<G, I, ConstraintF, GG, IG>
36where
37    G: Group,
38    I: InjectiveMap<G>,
39    ConstraintF: PrimeField,
40    GG: GroupGadget<G, ConstraintF>,
41    IG: InjectiveMapGadget<G, I, ConstraintF, GG>,
42    W: PedersenWindow,
43{
44    type OutputGadget = IG::OutputGadget;
45    type ParametersGadget = PedersenCommitmentGadgetParameters<G, W, ConstraintF>;
46    type RandomnessGadget = PedersenRandomnessGadget;
47
48    fn check_commitment_gadget<CS: ConstraintSystem<ConstraintF>>(
49        mut cs: CS,
50        parameters: &Self::ParametersGadget,
51        input: &[UInt8],
52        r: &Self::RandomnessGadget,
53    ) -> Result<Self::OutputGadget, SynthesisError> {
54        let result = PedersenCommitmentGadget::<G, ConstraintF, GG>::check_commitment_gadget(
55            cs.ns(|| "PedersenComm"),
56            parameters,
57            input,
58            r,
59        )?;
60        IG::evaluate_map(cs.ns(|| "InjectiveMap"), &result)
61    }
62}