Skip to content

Commit 0c62a1d

Browse files
authored
Merge pull request #18 from dapplion/serde-compact
Implement compact byte serde
2 parents 8f4153c + 4b46c98 commit 0c62a1d

10 files changed

Lines changed: 183 additions & 23 deletions

src/commitments.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ use std::ops::{Add, Mul};
2929
/// A GroupCommitment object
3030
///
3131
/// $GroupCommitment((G , H); T ; r ) = cm_T = (cm_{T,1} , cm_{T,2} ) = (r G , T + r H)$
32+
///
33+
/// CanonicalSerde produces compact representation since they type has no dyn vecs
3234
#[derive(Copy, Clone, CanonicalDeserialize, CanonicalSerialize, Debug, PartialEq, Eq)]
3335
pub struct GroupCommitment {
3436
/// Given $GroupCommitment((G , H); T ; r )$ this is $rG$

src/crs.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,11 @@ impl CurdleproofsCrs {
6767
.collect::<Vec<_>>();
6868
CurdleproofsCrs::from_points(ell, &points).expect("unexpected points len")
6969
}
70+
71+
pub fn log2_n(&self) -> usize {
72+
let n = self.vec_H.len() + self.vec_G.len();
73+
(n as f64).log2().ceil() as usize
74+
}
7075
}
7176

7277
type G1AffineHex = String;

src/curdleproofs.rs

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
pub use ark_bls12_381::{Fr, G1Affine, G1Projective};
33
use ark_ec::{AffineRepr, CurveGroup};
44
pub use ark_serialize::{CanonicalDeserialize, CanonicalSerialize, SerializationError};
5+
use ark_serialize::{Read, Write};
56
use ark_std::rand::RngCore;
67
use ark_std::{UniformRand, Zero};
78

@@ -20,12 +21,13 @@ use crate::same_scalar_argument::SameScalarProof;
2021

2122
use crate::N_BLINDERS;
2223

24+
/// Generate a randomly generated CRS
2325
pub fn generate_crs(ell: usize) -> CurdleproofsCrs {
2426
CurdleproofsCrs::generate_crs(ell)
2527
}
2628

2729
/// A Curdleproofs proof object
28-
#[derive(Clone, Debug, CanonicalSerialize, CanonicalDeserialize)]
30+
#[derive(Clone, Debug)]
2931
pub struct CurdleproofsProof {
3032
A: G1Projective,
3133
cm_T: GroupCommitment,
@@ -294,6 +296,31 @@ impl CurdleproofsProof {
294296
// Do the final verification on our MSM accumulator
295297
msm_accumulator.verify()
296298
}
299+
300+
pub fn serialize<W: Write>(&self, mut w: W) -> Result<(), SerializationError> {
301+
self.A.serialize_compressed(&mut w)?;
302+
self.cm_T.serialize_compressed(&mut w)?;
303+
self.cm_U.serialize_compressed(&mut w)?;
304+
self.R.serialize_compressed(&mut w)?;
305+
self.S.serialize_compressed(&mut w)?;
306+
self.same_perm_proof.serialize(&mut w)?;
307+
self.same_scalar_proof.serialize_compressed(&mut w)?;
308+
self.same_multiscalar_proof.serialize(&mut w)?;
309+
Ok(())
310+
}
311+
312+
pub fn deserialize<R: Read>(mut r: R, log2_n: usize) -> Result<Self, SerializationError> {
313+
Ok(Self {
314+
A: G1Projective::deserialize_compressed(&mut r)?,
315+
cm_T: GroupCommitment::deserialize_compressed(&mut r)?,
316+
cm_U: GroupCommitment::deserialize_compressed(&mut r)?,
317+
R: G1Projective::deserialize_compressed(&mut r)?,
318+
S: G1Projective::deserialize_compressed(&mut r)?,
319+
same_perm_proof: SamePermutationProof::deserialize(&mut r, log2_n)?,
320+
same_scalar_proof: SameScalarProof::deserialize_compressed(&mut r)?,
321+
same_multiscalar_proof: SameMultiscalarProof::deserialize(&mut r, log2_n)?,
322+
})
323+
}
297324
}
298325

299326
#[cfg(test)]

src/grand_product_argument.rs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use std::ops::Mul;
55
use ark_bls12_381::{Fr, G1Affine, G1Projective};
66
use ark_ec::CurveGroup;
77
use ark_ff::{Field, One};
8-
use ark_serialize::{CanonicalDeserialize, CanonicalSerialize};
8+
use ark_serialize::{CanonicalDeserialize, CanonicalSerialize, Read, SerializationError, Write};
99
use ark_std::rand::RngCore;
1010
use ark_std::Zero;
1111

@@ -244,6 +244,21 @@ impl GrandProductProof {
244244

245245
Ok(())
246246
}
247+
248+
pub fn serialize<W: Write>(&self, mut w: W) -> Result<(), SerializationError> {
249+
self.C.serialize_compressed(&mut w)?;
250+
self.r_p.serialize_compressed(&mut w)?;
251+
self.ipa_proof.serialize(&mut w)?;
252+
Ok(())
253+
}
254+
255+
pub fn deserialize<R: Read>(mut r: R, log2_n: usize) -> Result<Self, SerializationError> {
256+
Ok(Self {
257+
C: G1Projective::deserialize_compressed(&mut r)?,
258+
r_p: Fr::deserialize_compressed(&mut r)?,
259+
ipa_proof: InnerProductProof::deserialize(&mut r, log2_n)?,
260+
})
261+
}
247262
}
248263

249264
#[cfg(test)]

src/inner_product_argument.rs

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use std::ops::Mul;
44
use ark_bls12_381::{Fr, G1Affine, G1Projective};
55
use ark_ec::CurveGroup;
66
use ark_ff::{batch_inversion, Field};
7-
use ark_serialize::{CanonicalDeserialize, CanonicalSerialize};
7+
use ark_serialize::{CanonicalDeserialize, CanonicalSerialize, Read, SerializationError, Write};
88
use ark_std::rand::RngCore;
99
use ark_std::{One, Zero};
1010

@@ -13,6 +13,8 @@ use merlin::Transcript;
1313
use crate::errors::ProofError;
1414
use crate::msm_accumulator::MsmAccumulator;
1515
use crate::transcript::CurdleproofsTranscript;
16+
use crate::util::deserialize_g1projective_vec;
17+
use crate::util::serialize_g1projective_vec;
1618
use crate::util::{
1719
generate_blinders, get_verification_scalars_bitstring, inner_product, msm, msm_from_projective,
1820
};
@@ -322,6 +324,31 @@ impl InnerProductProof {
322324

323325
Ok(())
324326
}
327+
328+
pub fn serialize<W: Write>(&self, mut w: W) -> Result<(), SerializationError> {
329+
self.B_c.serialize_compressed(&mut w)?;
330+
self.B_d.serialize_compressed(&mut w)?;
331+
serialize_g1projective_vec(&self.vec_L_C, &mut w)?;
332+
serialize_g1projective_vec(&self.vec_R_C, &mut w)?;
333+
serialize_g1projective_vec(&self.vec_L_D, &mut w)?;
334+
serialize_g1projective_vec(&self.vec_R_D, &mut w)?;
335+
self.c_final.serialize_compressed(&mut w)?;
336+
self.d_final.serialize_compressed(&mut w)?;
337+
Ok(())
338+
}
339+
340+
pub fn deserialize<R: Read>(mut r: R, log2_n: usize) -> Result<Self, SerializationError> {
341+
Ok(Self {
342+
B_c: G1Projective::deserialize_compressed(&mut r)?,
343+
B_d: G1Projective::deserialize_compressed(&mut r)?,
344+
vec_L_C: deserialize_g1projective_vec(&mut r, log2_n)?,
345+
vec_R_C: deserialize_g1projective_vec(&mut r, log2_n)?,
346+
vec_L_D: deserialize_g1projective_vec(&mut r, log2_n)?,
347+
vec_R_D: deserialize_g1projective_vec(&mut r, log2_n)?,
348+
c_final: Fr::deserialize_compressed(&mut r)?,
349+
d_final: Fr::deserialize_compressed(&mut r)?,
350+
})
351+
}
325352
}
326353

327354
#[cfg(test)]

src/same_multiscalar_argument.rs

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,15 @@ use std::ops::Mul;
44
use ark_bls12_381::{Fr, G1Affine, G1Projective};
55
use ark_ec::CurveGroup;
66
use ark_ff::{batch_inversion, Field, One};
7+
use ark_serialize::Read;
8+
use ark_serialize::SerializationError;
9+
use ark_serialize::Write;
710
use ark_serialize::{CanonicalDeserialize, CanonicalSerialize};
811
use ark_std::rand::RngCore;
912

1013
use crate::transcript::CurdleproofsTranscript;
14+
use crate::util::deserialize_g1projective_vec;
15+
use crate::util::serialize_g1projective_vec;
1116
use merlin::Transcript;
1217

1318
use crate::errors::ProofError;
@@ -17,7 +22,7 @@ use crate::util::{
1722
};
1823

1924
/// A $SameMsm$ proof object
20-
#[derive(Clone, Debug, CanonicalSerialize, CanonicalDeserialize)]
25+
#[derive(Clone, Debug)]
2126
pub struct SameMultiscalarProof {
2227
B_a: G1Projective,
2328
B_t: G1Projective,
@@ -254,6 +259,34 @@ impl SameMultiscalarProof {
254259
msm_accumulator.accumulate_check(&point_lhs, &vec_x_times_s, vec_U, rng);
255260
Ok(())
256261
}
262+
263+
pub fn serialize<W: Write>(&self, mut w: W) -> Result<(), SerializationError> {
264+
self.B_a.serialize_compressed(&mut w)?;
265+
self.B_t.serialize_compressed(&mut w)?;
266+
self.B_u.serialize_compressed(&mut w)?;
267+
serialize_g1projective_vec(&self.vec_L_A, &mut w)?;
268+
serialize_g1projective_vec(&self.vec_L_T, &mut w)?;
269+
serialize_g1projective_vec(&self.vec_L_U, &mut w)?;
270+
serialize_g1projective_vec(&self.vec_R_A, &mut w)?;
271+
serialize_g1projective_vec(&self.vec_R_T, &mut w)?;
272+
serialize_g1projective_vec(&self.vec_R_U, &mut w)?;
273+
self.x_final.serialize_compressed(&mut w)?;
274+
Ok(())
275+
}
276+
pub fn deserialize<R: Read>(mut r: R, log2_n: usize) -> Result<Self, SerializationError> {
277+
Ok(Self {
278+
B_a: G1Projective::deserialize_compressed(&mut r)?,
279+
B_t: G1Projective::deserialize_compressed(&mut r)?,
280+
B_u: G1Projective::deserialize_compressed(&mut r)?,
281+
vec_L_A: deserialize_g1projective_vec(&mut r, log2_n)?,
282+
vec_L_T: deserialize_g1projective_vec(&mut r, log2_n)?,
283+
vec_L_U: deserialize_g1projective_vec(&mut r, log2_n)?,
284+
vec_R_A: deserialize_g1projective_vec(&mut r, log2_n)?,
285+
vec_R_T: deserialize_g1projective_vec(&mut r, log2_n)?,
286+
vec_R_U: deserialize_g1projective_vec(&mut r, log2_n)?,
287+
x_final: Fr::deserialize_compressed(&mut r)?,
288+
})
289+
}
257290
}
258291

259292
#[cfg(test)]

src/same_permutation_argument.rs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use core::iter;
33
use std::ops::Mul;
44

55
use ark_bls12_381::{Fr, G1Affine, G1Projective};
6-
use ark_serialize::{CanonicalDeserialize, CanonicalSerialize};
6+
use ark_serialize::{CanonicalDeserialize, CanonicalSerialize, Read, SerializationError, Write};
77
use ark_std::rand::RngCore;
88

99
use crate::transcript::CurdleproofsTranscript;
@@ -15,7 +15,7 @@ use crate::msm_accumulator::MsmAccumulator;
1515
use crate::util::{get_permutation, msm};
1616

1717
/// A same permutation proof object
18-
#[derive(Clone, Debug, CanonicalSerialize, CanonicalDeserialize)]
18+
#[derive(Clone, Debug)]
1919
pub struct SamePermutationProof {
2020
B: G1Projective,
2121

@@ -169,6 +169,19 @@ impl SamePermutationProof {
169169

170170
Ok(())
171171
}
172+
173+
pub fn serialize<W: Write>(&self, mut w: W) -> Result<(), SerializationError> {
174+
self.B.serialize_compressed(&mut w)?;
175+
self.grand_product_proof.serialize(&mut w)?;
176+
Ok(())
177+
}
178+
179+
pub fn deserialize<R: Read>(mut r: R, log2_n: usize) -> Result<Self, SerializationError> {
180+
Ok(Self {
181+
B: G1Projective::deserialize_compressed(&mut r)?,
182+
grand_product_proof: GrandProductProof::deserialize(&mut r, log2_n)?,
183+
})
184+
}
172185
}
173186

174187
#[cfg(test)]

src/same_scalar_argument.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ use crate::errors::ProofError;
1212
use crate::transcript::CurdleproofsTranscript;
1313
use merlin::Transcript;
1414

15+
/// CanonicalSerde produces compact representation since they type has no dyn vecs
1516
#[derive(Clone, Debug, CanonicalSerialize, CanonicalDeserialize)]
1617
pub struct SameScalarProof {
1718
cm_A: GroupCommitment,

src/util.rs

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33
#![allow(non_snake_case)]
44

55
use ark_bls12_381::{Fr, G1Affine, G1Projective};
6-
use ark_ec::{AffineRepr, CurveGroup};
6+
use ark_serialize::{CanonicalDeserialize, CanonicalSerialize, Read, SerializationError, Write};
77
use ark_std::rand::RngCore;
88
use ark_std::{UniformRand, Zero};
99

10-
use ark_ec::VariableBaseMSM;
10+
use ark_ec::{AffineRepr, CurveGroup, VariableBaseMSM};
1111
use core::iter;
1212
use std::ops::Mul;
1313

@@ -112,3 +112,22 @@ pub(crate) fn sum_affine_points(affine_points: &[G1Affine]) -> G1Affine {
112112
.sum::<G1Projective>()
113113
.into_affine()
114114
}
115+
116+
pub fn deserialize_g1projective_vec<R: Read>(
117+
mut r: R,
118+
n: usize,
119+
) -> Result<Vec<G1Projective>, SerializationError> {
120+
(0..n)
121+
.map(|_| G1Projective::deserialize_compressed(&mut r))
122+
.collect()
123+
}
124+
125+
pub fn serialize_g1projective_vec<W: Write>(
126+
v: &[G1Projective],
127+
mut w: W,
128+
) -> Result<(), SerializationError> {
129+
for p in v {
130+
p.serialize_compressed(&mut w)?;
131+
}
132+
Ok(())
133+
}

0 commit comments

Comments
 (0)