arnaucube
arnaucube/NovaPublic Self-hosted repository
use serde feature to compute the digest of the shape (#132)

Srinath Setty srinath@microsoft.com
Tue, 31 Jan 2023 10:32:49 -0800
commit

746af53e08b4442ccf156e41069c42bd8e2e959c

parent

13964b6f168d872a56de6742ca1d36a84fce10c3

2 files changed, 25 insertions(+), 25 deletions(-)

jump to
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> {