@@ -3,6 +3,8 @@ use crate::{
33 BTreeMap , PCCommitterKey , PCPreparedCommitment , PCPreparedVerifierKey , PCVerifierKey , Vec ,
44} ;
55use ark_ec:: { PairingEngine , ProjectiveCurve } ;
6+ use ark_serialize:: { CanonicalDeserialize , CanonicalSerialize , SerializationError } ;
7+ use ark_std:: io:: { Read , Write } ;
68
79/// `UniversalParams` are the universal parameters for the KZG10 scheme.
810pub type UniversalParams < E > = kzg10:: UniversalParams < E > ;
@@ -32,7 +34,7 @@ impl<E: PairingEngine> PCPreparedCommitment<Commitment<E>> for PreparedCommitmen
3234
3335/// `ComitterKey` is used to commit to, and create evaluation proofs for, a given
3436/// polynomial.
35- #[ derive( Derivative ) ]
37+ #[ derive( Derivative , CanonicalSerialize , CanonicalDeserialize ) ]
3638#[ derivative(
3739 Default ( bound = "" ) ,
3840 Hash ( bound = "" ) ,
@@ -143,7 +145,7 @@ pub struct VerifierKey<E: PairingEngine> {
143145
144146 /// Pairs a degree_bound with its corresponding G2 element, which has been prepared for use in pairings.
145147 /// Each pair is in the form `(degree_bound, \beta^{degree_bound - max_degree} h),` where `h` is the generator of G2 above
146- pub degree_bounds_and_prepared_neg_powers_of_h : Option < Vec < ( usize , E :: G2Prepared ) > > ,
148+ pub degree_bounds_and_neg_powers_of_h : Option < Vec < ( usize , E :: G2Affine ) > > ,
147149
148150 /// The maximum degree supported by the trimmed parameters that `self` is
149151 /// a part of.
@@ -157,16 +159,151 @@ pub struct VerifierKey<E: PairingEngine> {
157159impl < E : PairingEngine > VerifierKey < E > {
158160 /// Find the appropriate shift for the degree bound.
159161 pub fn get_shift_power ( & self , degree_bound : usize ) -> Option < E :: G2Prepared > {
160- self . degree_bounds_and_prepared_neg_powers_of_h
162+ self . degree_bounds_and_neg_powers_of_h
161163 . as_ref ( )
162164 . and_then ( |v| {
163165 v. binary_search_by ( |( d, _) | d. cmp ( & degree_bound) )
164166 . ok ( )
165- . map ( |i| v[ i] . 1 . clone ( ) )
167+ . map ( |i| v[ i] . 1 . clone ( ) . into ( ) )
166168 } )
167169 }
168170}
169171
172+ impl < E : PairingEngine > CanonicalSerialize for VerifierKey < E > {
173+ fn serialize < W : Write > ( & self , mut writer : W ) -> Result < ( ) , SerializationError > {
174+ self . g . serialize ( & mut writer) ?;
175+ self . gamma_g . serialize ( & mut writer) ?;
176+ self . h . serialize ( & mut writer) ?;
177+ self . beta_h . serialize ( & mut writer) ?;
178+ self . degree_bounds_and_neg_powers_of_h
179+ . serialize ( & mut writer) ?;
180+ self . supported_degree . serialize ( & mut writer) ?;
181+ self . max_degree . serialize ( & mut writer)
182+ }
183+
184+ fn serialized_size ( & self ) -> usize {
185+ self . g . serialized_size ( )
186+ + self . gamma_g . serialized_size ( )
187+ + self . h . serialized_size ( )
188+ + self . beta_h . serialized_size ( )
189+ + self . degree_bounds_and_neg_powers_of_h . serialized_size ( )
190+ + self . supported_degree . serialized_size ( )
191+ + self . max_degree . serialized_size ( )
192+ }
193+
194+ fn serialize_uncompressed < W : Write > ( & self , mut writer : W ) -> Result < ( ) , SerializationError > {
195+ self . g . serialize_uncompressed ( & mut writer) ?;
196+ self . gamma_g . serialize_uncompressed ( & mut writer) ?;
197+ self . h . serialize_uncompressed ( & mut writer) ?;
198+ self . beta_h . serialize_uncompressed ( & mut writer) ?;
199+ self . degree_bounds_and_neg_powers_of_h
200+ . serialize_uncompressed ( & mut writer) ?;
201+ self . supported_degree . serialize_uncompressed ( & mut writer) ?;
202+ self . max_degree . serialize_uncompressed ( & mut writer)
203+ }
204+
205+ fn serialize_unchecked < W : Write > ( & self , mut writer : W ) -> Result < ( ) , SerializationError > {
206+ self . g . serialize_unchecked ( & mut writer) ?;
207+ self . gamma_g . serialize_unchecked ( & mut writer) ?;
208+ self . h . serialize_unchecked ( & mut writer) ?;
209+ self . beta_h . serialize_unchecked ( & mut writer) ?;
210+ self . degree_bounds_and_neg_powers_of_h
211+ . serialize_unchecked ( & mut writer) ?;
212+ self . supported_degree . serialize_unchecked ( & mut writer) ?;
213+ self . max_degree . serialize_unchecked ( & mut writer)
214+ }
215+
216+ fn uncompressed_size ( & self ) -> usize {
217+ self . g . uncompressed_size ( )
218+ + self . gamma_g . uncompressed_size ( )
219+ + self . h . uncompressed_size ( )
220+ + self . beta_h . uncompressed_size ( )
221+ + self . degree_bounds_and_neg_powers_of_h . uncompressed_size ( )
222+ + self . supported_degree . uncompressed_size ( )
223+ + self . max_degree . uncompressed_size ( )
224+ }
225+ }
226+
227+ impl < E : PairingEngine > CanonicalDeserialize for VerifierKey < E > {
228+ fn deserialize < R : Read > ( mut reader : R ) -> Result < Self , SerializationError > {
229+ let g = E :: G1Affine :: deserialize ( & mut reader) ?;
230+ let gamma_g = E :: G1Affine :: deserialize ( & mut reader) ?;
231+ let h = E :: G2Affine :: deserialize ( & mut reader) ?;
232+ let beta_h = E :: G2Affine :: deserialize ( & mut reader) ?;
233+ let degree_bounds_and_neg_powers_of_h =
234+ Option :: < Vec < ( usize , E :: G2Affine ) > > :: deserialize ( & mut reader) ?;
235+ let supported_degree = usize:: deserialize ( & mut reader) ?;
236+ let max_degree = usize:: deserialize ( & mut reader) ?;
237+
238+ let prepared_h = E :: G2Prepared :: from ( h. clone ( ) ) ;
239+ let prepared_beta_h = E :: G2Prepared :: from ( beta_h. clone ( ) ) ;
240+
241+ Ok ( Self {
242+ g,
243+ gamma_g,
244+ h,
245+ beta_h,
246+ prepared_h,
247+ prepared_beta_h,
248+ degree_bounds_and_neg_powers_of_h,
249+ supported_degree,
250+ max_degree,
251+ } )
252+ }
253+
254+ fn deserialize_uncompressed < R : Read > ( mut reader : R ) -> Result < Self , SerializationError > {
255+ let g = E :: G1Affine :: deserialize_uncompressed ( & mut reader) ?;
256+ let gamma_g = E :: G1Affine :: deserialize_uncompressed ( & mut reader) ?;
257+ let h = E :: G2Affine :: deserialize_uncompressed ( & mut reader) ?;
258+ let beta_h = E :: G2Affine :: deserialize_uncompressed ( & mut reader) ?;
259+ let degree_bounds_and_neg_powers_of_h =
260+ Option :: < Vec < ( usize , E :: G2Affine ) > > :: deserialize_uncompressed ( & mut reader) ?;
261+ let supported_degree = usize:: deserialize_uncompressed ( & mut reader) ?;
262+ let max_degree = usize:: deserialize_uncompressed ( & mut reader) ?;
263+
264+ let prepared_h = E :: G2Prepared :: from ( h. clone ( ) ) ;
265+ let prepared_beta_h = E :: G2Prepared :: from ( beta_h. clone ( ) ) ;
266+
267+ Ok ( Self {
268+ g,
269+ gamma_g,
270+ h,
271+ beta_h,
272+ prepared_h,
273+ prepared_beta_h,
274+ degree_bounds_and_neg_powers_of_h,
275+ supported_degree,
276+ max_degree,
277+ } )
278+ }
279+
280+ fn deserialize_unchecked < R : Read > ( mut reader : R ) -> Result < Self , SerializationError > {
281+ let g = E :: G1Affine :: deserialize_unchecked ( & mut reader) ?;
282+ let gamma_g = E :: G1Affine :: deserialize_unchecked ( & mut reader) ?;
283+ let h = E :: G2Affine :: deserialize_unchecked ( & mut reader) ?;
284+ let beta_h = E :: G2Affine :: deserialize_unchecked ( & mut reader) ?;
285+ let degree_bounds_and_neg_powers_of_h =
286+ Option :: < Vec < ( usize , E :: G2Affine ) > > :: deserialize_unchecked ( & mut reader) ?;
287+ let supported_degree = usize:: deserialize_unchecked ( & mut reader) ?;
288+ let max_degree = usize:: deserialize_unchecked ( & mut reader) ?;
289+
290+ let prepared_h = E :: G2Prepared :: from ( h. clone ( ) ) ;
291+ let prepared_beta_h = E :: G2Prepared :: from ( beta_h. clone ( ) ) ;
292+
293+ Ok ( Self {
294+ g,
295+ gamma_g,
296+ h,
297+ beta_h,
298+ prepared_h,
299+ prepared_beta_h,
300+ degree_bounds_and_neg_powers_of_h,
301+ supported_degree,
302+ max_degree,
303+ } )
304+ }
305+ }
306+
170307impl < E : PairingEngine > PCVerifierKey for VerifierKey < E > {
171308 fn max_degree ( & self ) -> usize {
172309 self . max_degree
0 commit comments