Skip to content

Commit d64d18b

Browse files
authored
Add serialization for keys (#64)
1 parent 3972bf6 commit d64d18b

File tree

6 files changed

+303
-73
lines changed

6 files changed

+303
-73
lines changed

src/data_structures.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@ pub trait PCUniversalParams:
2323

2424
/// Defines the minimal interface of committer keys for any polynomial
2525
/// commitment scheme.
26-
pub trait PCCommitterKey: Clone + core::fmt::Debug {
26+
pub trait PCCommitterKey:
27+
Clone + core::fmt::Debug + CanonicalSerialize + CanonicalDeserialize
28+
{
2729
/// Outputs the maximum degree supported by the universal parameters
2830
/// `Self` was derived from.
2931
fn max_degree(&self) -> usize;
@@ -34,7 +36,9 @@ pub trait PCCommitterKey: Clone + core::fmt::Debug {
3436

3537
/// Defines the minimal interface of verifier keys for any polynomial
3638
/// commitment scheme.
37-
pub trait PCVerifierKey: Clone + core::fmt::Debug {
39+
pub trait PCVerifierKey:
40+
Clone + core::fmt::Debug + CanonicalSerialize + CanonicalDeserialize
41+
{
3842
/// Outputs the maximum degree supported by the universal parameters
3943
/// `Self` was derived from.
4044
fn max_degree(&self) -> usize;
@@ -74,7 +78,7 @@ pub trait PCPreparedCommitment<UNPREPARED: PCCommitment>: Clone {
7478

7579
/// Defines the minimal interface of commitment randomness for any polynomial
7680
/// commitment scheme.
77-
pub trait PCRandomness: Clone {
81+
pub trait PCRandomness: Clone + CanonicalSerialize + CanonicalDeserialize {
7882
/// Outputs empty randomness that does not hide the commitment.
7983
fn empty() -> Self;
8084

src/ipa_pc/data_structures.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ impl<G: AffineCurve> PCUniversalParams for UniversalParams<G> {
3131

3232
/// `CommitterKey` is used to commit to, and create evaluation proofs for, a given
3333
/// polynomial.
34-
#[derive(Derivative)]
34+
#[derive(Derivative, CanonicalSerialize, CanonicalDeserialize)]
3535
#[derivative(
3636
Default(bound = ""),
3737
Hash(bound = ""),
@@ -149,7 +149,7 @@ impl<G: AffineCurve> PCPreparedCommitment<Commitment<G>> for PreparedCommitment<
149149
}
150150

151151
/// `Randomness` hides the polynomial inside a commitment and is outputted by `InnerProductArg::commit`.
152-
#[derive(Derivative)]
152+
#[derive(Derivative, CanonicalSerialize, CanonicalDeserialize)]
153153
#[derivative(
154154
Default(bound = ""),
155155
Hash(bound = ""),

src/kzg10/data_structures.rs

Lines changed: 97 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,102 @@ pub struct VerifierKey<E: PairingEngine> {
189189
pub prepared_beta_h: E::G2Prepared,
190190
}
191191

192+
impl<E: PairingEngine> CanonicalSerialize for VerifierKey<E> {
193+
fn serialize<W: Write>(&self, mut writer: W) -> Result<(), SerializationError> {
194+
self.g.serialize(&mut writer)?;
195+
self.gamma_g.serialize(&mut writer)?;
196+
self.h.serialize(&mut writer)?;
197+
self.beta_h.serialize(&mut writer)
198+
}
199+
200+
fn serialized_size(&self) -> usize {
201+
self.g.serialized_size()
202+
+ self.gamma_g.serialized_size()
203+
+ self.h.serialized_size()
204+
+ self.beta_h.serialized_size()
205+
}
206+
207+
fn serialize_uncompressed<W: Write>(&self, mut writer: W) -> Result<(), SerializationError> {
208+
self.g.serialize_uncompressed(&mut writer)?;
209+
self.gamma_g.serialize_uncompressed(&mut writer)?;
210+
self.h.serialize_uncompressed(&mut writer)?;
211+
self.beta_h.serialize_uncompressed(&mut writer)
212+
}
213+
214+
fn serialize_unchecked<W: Write>(&self, mut writer: W) -> Result<(), SerializationError> {
215+
self.g.serialize_unchecked(&mut writer)?;
216+
self.gamma_g.serialize_unchecked(&mut writer)?;
217+
self.h.serialize_unchecked(&mut writer)?;
218+
self.beta_h.serialize_unchecked(&mut writer)
219+
}
220+
221+
fn uncompressed_size(&self) -> usize {
222+
self.g.uncompressed_size()
223+
+ self.gamma_g.uncompressed_size()
224+
+ self.h.uncompressed_size()
225+
+ self.beta_h.uncompressed_size()
226+
}
227+
}
228+
229+
impl<E: PairingEngine> CanonicalDeserialize for VerifierKey<E> {
230+
fn deserialize<R: Read>(mut reader: R) -> Result<Self, SerializationError> {
231+
let g = E::G1Affine::deserialize(&mut reader)?;
232+
let gamma_g = E::G1Affine::deserialize(&mut reader)?;
233+
let h = E::G2Affine::deserialize(&mut reader)?;
234+
let beta_h = E::G2Affine::deserialize(&mut reader)?;
235+
236+
let prepared_h = E::G2Prepared::from(h.clone());
237+
let prepared_beta_h = E::G2Prepared::from(beta_h.clone());
238+
239+
Ok(Self {
240+
g,
241+
gamma_g,
242+
h,
243+
beta_h,
244+
prepared_h,
245+
prepared_beta_h,
246+
})
247+
}
248+
249+
fn deserialize_uncompressed<R: Read>(mut reader: R) -> Result<Self, SerializationError> {
250+
let g = E::G1Affine::deserialize_uncompressed(&mut reader)?;
251+
let gamma_g = E::G1Affine::deserialize_uncompressed(&mut reader)?;
252+
let h = E::G2Affine::deserialize_uncompressed(&mut reader)?;
253+
let beta_h = E::G2Affine::deserialize_uncompressed(&mut reader)?;
254+
255+
let prepared_h = E::G2Prepared::from(h.clone());
256+
let prepared_beta_h = E::G2Prepared::from(beta_h.clone());
257+
258+
Ok(Self {
259+
g,
260+
gamma_g,
261+
h,
262+
beta_h,
263+
prepared_h,
264+
prepared_beta_h,
265+
})
266+
}
267+
268+
fn deserialize_unchecked<R: Read>(mut reader: R) -> Result<Self, SerializationError> {
269+
let g = E::G1Affine::deserialize_unchecked(&mut reader)?;
270+
let gamma_g = E::G1Affine::deserialize_unchecked(&mut reader)?;
271+
let h = E::G2Affine::deserialize_unchecked(&mut reader)?;
272+
let beta_h = E::G2Affine::deserialize_unchecked(&mut reader)?;
273+
274+
let prepared_h = E::G2Prepared::from(h.clone());
275+
let prepared_beta_h = E::G2Prepared::from(beta_h.clone());
276+
277+
Ok(Self {
278+
g,
279+
gamma_g,
280+
h,
281+
beta_h,
282+
prepared_h,
283+
prepared_beta_h,
284+
})
285+
}
286+
}
287+
192288
impl<E: PairingEngine> ToBytes for VerifierKey<E> {
193289
#[inline]
194290
fn write<W: Write>(&self, mut writer: W) -> ark_std::io::Result<()> {
@@ -314,7 +410,7 @@ impl<E: PairingEngine> PreparedCommitment<E> {
314410
}
315411

316412
/// `Randomness` hides the polynomial inside a commitment. It is output by `KZG10::commit`.
317-
#[derive(Derivative)]
413+
#[derive(Derivative, CanonicalSerialize, CanonicalDeserialize)]
318414
#[derivative(
319415
Hash(bound = ""),
320416
Clone(bound = ""),

src/marlin_pc/data_structures.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ pub type UniversalParams<E> = kzg10::UniversalParams<E>;
1515

1616
/// `CommitterKey` is used to commit to and create evaluation proofs for a given
1717
/// polynomial.
18-
#[derive(Derivative)]
18+
#[derive(Derivative, CanonicalSerialize, CanonicalDeserialize)]
1919
#[derivative(
2020
Default(bound = ""),
2121
Hash(bound = ""),
@@ -93,7 +93,7 @@ impl<E: PairingEngine> PCCommitterKey for CommitterKey<E> {
9393
}
9494

9595
/// `VerifierKey` is used to check evaluation proofs for a given commitment.
96-
#[derive(Derivative)]
96+
#[derive(Derivative, CanonicalSerialize, CanonicalDeserialize)]
9797
#[derivative(Default(bound = ""), Clone(bound = ""), Debug(bound = ""))]
9898
pub struct VerifierKey<E: PairingEngine> {
9999
/// The verification key for the underlying KZG10 scheme.
@@ -287,7 +287,7 @@ impl<E: PairingEngine> PCPreparedCommitment<Commitment<E>> for PreparedCommitmen
287287
}
288288

289289
/// `Randomness` hides the polynomial inside a commitment. It is output by `KZG10::commit`.
290-
#[derive(Derivative)]
290+
#[derive(Derivative, CanonicalSerialize, CanonicalDeserialize)]
291291
#[derivative(
292292
Hash(bound = ""),
293293
Clone(bound = ""),

src/sonic_pc/data_structures.rs

Lines changed: 141 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ use crate::{
33
BTreeMap, PCCommitterKey, PCPreparedCommitment, PCPreparedVerifierKey, PCVerifierKey, Vec,
44
};
55
use 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.
810
pub 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> {
157159
impl<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+
170307
impl<E: PairingEngine> PCVerifierKey for VerifierKey<E> {
171308
fn max_degree(&self) -> usize {
172309
self.max_degree

0 commit comments

Comments
 (0)