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