use serde feature to compute the digest of the shape (#132)
Srinath Setty srinath@microsoft.com
Tue, 31 Jan 2023 10:32:49 -0800
2 files changed,
25 insertions(+),
25 deletions(-)
M
examples/minroot.rs
→
examples/minroot.rs
@@ -5,6 +5,7 @@ type G1 = pasta_curves::pallas::Point;
type G2 = pasta_curves::vesta::Point; use ::bellperson::{gadgets::num::AllocatedNum, ConstraintSystem, SynthesisError}; use ff::PrimeField; +use flate2::{write::ZlibEncoder, Compression}; use nova_snark::{ traits::{ circuit::{StepCircuit, TrivialTestCircuit},@@ -267,6 +268,14 @@ start.elapsed()
); assert!(res.is_ok()); let compressed_snark = res.unwrap(); + + let mut encoder = ZlibEncoder::new(Vec::new(), Compression::default()); + bincode::serialize_into(&mut encoder, &compressed_snark).unwrap(); + let compressed_snark_encoded = encoder.finish().unwrap(); + println!( + "CompressedSNARK::len {:?} bytes", + compressed_snark_encoded.len() + ); // verify the compressed SNARK println!("Verifying a CompressedSNARK...");
M
src/r1cs.rs
→
src/r1cs.rs
@@ -9,7 +9,7 @@ gadgets::utils::scalar_as_base,
traits::{AbsorbInROTrait, AppendToTranscriptTrait, Group, ROTrait}, }; use core::cmp::max; -use ff::{Field, PrimeField}; +use ff::Field; use flate2::{write::ZlibEncoder, Compression}; use itertools::concat; use merlin::Transcript;@@ -311,27 +311,28 @@ A: &[(usize, usize, G::Scalar)],
B: &[(usize, usize, G::Scalar)], C: &[(usize, usize, G::Scalar)], ) -> G::Scalar { - let shape_serialized = R1CSShapeSerialized { + #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] + struct R1CSShapeWithoutDigest<G: Group> { + num_cons: usize, + num_vars: usize, + num_io: usize, + A: Vec<(usize, usize, G::Scalar)>, + B: Vec<(usize, usize, G::Scalar)>, + C: Vec<(usize, usize, G::Scalar)>, + } + + let shape = R1CSShapeWithoutDigest::<G> { num_cons, num_vars, num_io, - A: A - .par_iter() - .map(|(i, j, v)| (*i, *j, v.to_repr().as_ref().to_vec())) - .collect(), - B: B - .par_iter() - .map(|(i, j, v)| (*i, *j, v.to_repr().as_ref().to_vec())) - .collect(), - C: C - .par_iter() - .map(|(i, j, v)| (*i, *j, v.to_repr().as_ref().to_vec())) - .collect(), + A: A.to_vec(), + B: B.to_vec(), + C: C.to_vec(), }; // obtain a vector of bytes representing the R1CS shape let mut encoder = ZlibEncoder::new(Vec::new(), Compression::default()); - bincode::serialize_into(&mut encoder, &shape_serialized).unwrap(); + bincode::serialize_into(&mut encoder, &shape).unwrap(); let shape_bytes = encoder.finish().unwrap(); // convert shape_bytes into a short digest@@ -429,16 +430,6 @@ C: C_padded,
digest, } } -} - -#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)] -struct R1CSShapeSerialized { - num_cons: usize, - num_vars: usize, - num_io: usize, - A: Vec<(usize, usize, Vec<u8>)>, - B: Vec<(usize, usize, Vec<u8>)>, - C: Vec<(usize, usize, Vec<u8>)>, } impl<G: Group> AppendToTranscriptTrait for R1CSShape<G> {