11use crate :: {
22 crh:: {
33 pedersen:: { Parameters , Window , CRH } ,
4- FixedLengthCRHGadget ,
4+ CRHGadget as CRHGadgetTrait ,
55 } ,
66 Vec ,
77} ;
@@ -10,6 +10,7 @@ use ark_ff::Field;
1010use ark_r1cs_std:: prelude:: * ;
1111use ark_relations:: r1cs:: { Namespace , SynthesisError } ;
1212
13+ use crate :: crh:: TwoToOneCRHGadget ;
1314use core:: { borrow:: Borrow , marker:: PhantomData } ;
1415
1516#[ derive( Derivative ) ]
3637 _window : PhantomData < * const W > ,
3738}
3839
39- impl < C , GG , W > FixedLengthCRHGadget < CRH < C , W > , ConstraintF < C > > for CRHGadget < C , GG , W >
40+ impl < C , GG , W > CRHGadgetTrait < CRH < C , W > , ConstraintF < C > > for CRHGadget < C , GG , W >
4041where
4142 C : ProjectiveCurve ,
4243 GG : CurveVar < C , ConstraintF < C > > ,
7475 }
7576}
7677
78+ impl < C , GG , W > TwoToOneCRHGadget < CRH < C , W > , ConstraintF < C > > for CRHGadget < C , GG , W >
79+ where
80+ C : ProjectiveCurve ,
81+ GG : CurveVar < C , ConstraintF < C > > ,
82+ W : Window ,
83+ for < ' a > & ' a GG : GroupOpsBounds < ' a , C , GG > ,
84+ {
85+ type OutputVar = GG ;
86+ type ParametersVar = CRHParametersVar < C , GG > ;
87+
88+ #[ tracing:: instrument( target = "r1cs" , skip( parameters) ) ]
89+ fn evaluate (
90+ parameters : & Self :: ParametersVar ,
91+ left_input : & [ UInt8 < ConstraintF < C > > ] ,
92+ right_input : & [ UInt8 < ConstraintF < C > > ] ,
93+ ) -> Result < Self :: OutputVar , SynthesisError > {
94+ // assume equality of left and right length
95+ assert_eq ! ( left_input. len( ) , right_input. len( ) ) ;
96+ let chained_input: Vec < _ > = left_input
97+ . to_vec ( )
98+ . into_iter ( )
99+ . chain ( right_input. to_vec ( ) . into_iter ( ) )
100+ . collect ( ) ;
101+ <Self as CRHGadgetTrait < _ , _ > >:: evaluate ( parameters, & chained_input)
102+ }
103+ }
104+
77105impl < C , GG > AllocVar < Parameters < C > , ConstraintF < C > > for CRHParametersVar < C , GG >
78106where
79107 C : ProjectiveCurve ,
@@ -96,14 +124,15 @@ where
96124
97125#[ cfg( test) ]
98126mod test {
99- use crate :: crh:: { pedersen, pedersen :: constraints :: * , FixedLengthCRH , FixedLengthCRHGadget } ;
127+ use crate :: crh:: { pedersen, CRHGadget , TwoToOneCRH , TwoToOneCRHGadget , CRH } ;
100128 use ark_ed_on_bls12_381:: { constraints:: EdwardsVar , EdwardsProjective as JubJub , Fq as Fr } ;
129+ use ark_r1cs_std:: prelude:: * ;
101130 use ark_relations:: r1cs:: { ConstraintSystem , ConstraintSystemRef } ;
102131 use ark_std:: rand:: Rng ;
103132 use ark_std:: test_rng;
104133
105134 type TestCRH = pedersen:: CRH < JubJub , Window > ;
106- type TestCRHGadget = CRHGadget < JubJub , EdwardsVar , Window > ;
135+ type TestCRHGadget = pedersen :: constraints :: CRHGadget < JubJub , EdwardsVar , Window > ;
107136
108137 #[ derive( Clone , PartialEq , Eq , Hash ) ]
109138 pub ( super ) struct Window ;
@@ -113,11 +142,12 @@ mod test {
113142 const NUM_WINDOWS : usize = 8 ;
114143 }
115144
116- fn generate_input < R : Rng > (
145+ fn generate_u8_input < R : Rng > (
117146 cs : ConstraintSystemRef < Fr > ,
147+ size : usize ,
118148 rng : & mut R ,
119- ) -> ( [ u8 ; 128 ] , Vec < UInt8 < Fr > > ) {
120- let mut input = [ 1u8 ; 128 ] ;
149+ ) -> ( Vec < u8 > , Vec < UInt8 < Fr > > ) {
150+ let mut input = vec ! [ 1u8 ; size ] ;
121151 rng. fill_bytes ( & mut input) ;
122152
123153 let mut input_bytes = vec ! [ ] ;
@@ -132,16 +162,48 @@ mod test {
132162 let rng = & mut test_rng ( ) ;
133163 let cs = ConstraintSystem :: < Fr > :: new_ref ( ) ;
134164
135- let ( input, input_var) = generate_input ( cs. clone ( ) , rng) ;
165+ let ( input, input_var) = generate_u8_input ( cs. clone ( ) , 128 , rng) ;
166+
167+ let parameters = <TestCRH as CRH >:: setup ( rng) . unwrap ( ) ;
168+ let primitive_result = <TestCRH as CRH >:: evaluate ( & parameters, & input) . unwrap ( ) ;
136169
137- let parameters = TestCRH :: setup ( rng) . unwrap ( ) ;
138- let primitive_result = TestCRH :: evaluate ( & parameters, & input) . unwrap ( ) ;
170+ let parameters_var = pedersen:: constraints:: CRHParametersVar :: new_constant (
171+ ark_relations:: ns!( cs, "CRH Parameters" ) ,
172+ & parameters,
173+ )
174+ . unwrap ( ) ;
139175
140- let parameters_var =
141- CRHParametersVar :: new_constant ( ark_relations:: ns!( cs, "CRH Parameters" ) , & parameters)
142- . unwrap ( ) ;
176+ let result_var =
177+ <TestCRHGadget as CRHGadget < _ , _ > >:: evaluate ( & parameters_var, & input_var) . unwrap ( ) ;
178+
179+ let primitive_result = primitive_result;
180+ assert_eq ! ( primitive_result, result_var. value( ) . unwrap( ) ) ;
181+ assert ! ( cs. is_satisfied( ) . unwrap( ) ) ;
182+ }
183+
184+ #[ test]
185+ fn test_naive_two_to_one_equality ( ) {
186+ let rng = & mut test_rng ( ) ;
187+ let cs = ConstraintSystem :: < Fr > :: new_ref ( ) ;
143188
144- let result_var = TestCRHGadget :: evaluate ( & parameters_var, & input_var) . unwrap ( ) ;
189+ let ( left_input, left_input_var) = generate_u8_input ( cs. clone ( ) , 64 , rng) ;
190+ let ( right_input, right_input_var) = generate_u8_input ( cs. clone ( ) , 64 , rng) ;
191+ let parameters = <TestCRH as TwoToOneCRH >:: setup ( rng) . unwrap ( ) ;
192+ let primitive_result =
193+ <TestCRH as TwoToOneCRH >:: evaluate ( & parameters, & left_input, & right_input) . unwrap ( ) ;
194+
195+ let parameters_var = pedersen:: constraints:: CRHParametersVar :: new_constant (
196+ ark_relations:: ns!( cs, "CRH Parameters" ) ,
197+ & parameters,
198+ )
199+ . unwrap ( ) ;
200+
201+ let result_var = <TestCRHGadget as TwoToOneCRHGadget < _ , _ > >:: evaluate (
202+ & parameters_var,
203+ & left_input_var,
204+ & right_input_var,
205+ )
206+ . unwrap ( ) ;
145207
146208 let primitive_result = primitive_result;
147209 assert_eq ! ( primitive_result, result_var. value( ) . unwrap( ) ) ;
0 commit comments