use serde feature to compute the digest of the shape (#132)

This commit is contained in:
Srinath Setty
2023-01-31 10:32:49 -08:00
committed by GitHub
parent 13964b6f16
commit 746af53e08
2 changed files with 25 additions and 25 deletions

View File

@@ -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},
@@ -268,6 +269,14 @@ fn main() {
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...");
let start = Instant::now();

View File

@@ -9,7 +9,7 @@ use super::{
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 @@ impl<G: Group> R1CSShape<G> {
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
@@ -431,16 +432,6 @@ impl<G: Group> R1CSShape<G> {
}
}
#[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> {
fn append_to_transcript(&self, _label: &'static [u8], transcript: &mut Transcript) {
self