mirror of
https://github.com/arnaucube/Nova.git
synced 2026-01-12 00:51:28 +01:00
use serde feature to compute the digest of the shape (#132)
This commit is contained in:
@@ -5,6 +5,7 @@ type G1 = pasta_curves::pallas::Point;
|
|||||||
type G2 = pasta_curves::vesta::Point;
|
type G2 = pasta_curves::vesta::Point;
|
||||||
use ::bellperson::{gadgets::num::AllocatedNum, ConstraintSystem, SynthesisError};
|
use ::bellperson::{gadgets::num::AllocatedNum, ConstraintSystem, SynthesisError};
|
||||||
use ff::PrimeField;
|
use ff::PrimeField;
|
||||||
|
use flate2::{write::ZlibEncoder, Compression};
|
||||||
use nova_snark::{
|
use nova_snark::{
|
||||||
traits::{
|
traits::{
|
||||||
circuit::{StepCircuit, TrivialTestCircuit},
|
circuit::{StepCircuit, TrivialTestCircuit},
|
||||||
@@ -268,6 +269,14 @@ fn main() {
|
|||||||
assert!(res.is_ok());
|
assert!(res.is_ok());
|
||||||
let compressed_snark = res.unwrap();
|
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
|
// verify the compressed SNARK
|
||||||
println!("Verifying a CompressedSNARK...");
|
println!("Verifying a CompressedSNARK...");
|
||||||
let start = Instant::now();
|
let start = Instant::now();
|
||||||
|
|||||||
41
src/r1cs.rs
41
src/r1cs.rs
@@ -9,7 +9,7 @@ use super::{
|
|||||||
traits::{AbsorbInROTrait, AppendToTranscriptTrait, Group, ROTrait},
|
traits::{AbsorbInROTrait, AppendToTranscriptTrait, Group, ROTrait},
|
||||||
};
|
};
|
||||||
use core::cmp::max;
|
use core::cmp::max;
|
||||||
use ff::{Field, PrimeField};
|
use ff::Field;
|
||||||
use flate2::{write::ZlibEncoder, Compression};
|
use flate2::{write::ZlibEncoder, Compression};
|
||||||
use itertools::concat;
|
use itertools::concat;
|
||||||
use merlin::Transcript;
|
use merlin::Transcript;
|
||||||
@@ -311,27 +311,28 @@ impl<G: Group> R1CSShape<G> {
|
|||||||
B: &[(usize, usize, G::Scalar)],
|
B: &[(usize, usize, G::Scalar)],
|
||||||
C: &[(usize, usize, G::Scalar)],
|
C: &[(usize, usize, G::Scalar)],
|
||||||
) -> 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_cons,
|
||||||
num_vars,
|
num_vars,
|
||||||
num_io,
|
num_io,
|
||||||
A: A
|
A: A.to_vec(),
|
||||||
.par_iter()
|
B: B.to_vec(),
|
||||||
.map(|(i, j, v)| (*i, *j, v.to_repr().as_ref().to_vec()))
|
C: C.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(),
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// obtain a vector of bytes representing the R1CS shape
|
// obtain a vector of bytes representing the R1CS shape
|
||||||
let mut encoder = ZlibEncoder::new(Vec::new(), Compression::default());
|
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();
|
let shape_bytes = encoder.finish().unwrap();
|
||||||
|
|
||||||
// convert shape_bytes into a short digest
|
// 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> {
|
impl<G: Group> AppendToTranscriptTrait for R1CSShape<G> {
|
||||||
fn append_to_transcript(&self, _label: &'static [u8], transcript: &mut Transcript) {
|
fn append_to_transcript(&self, _label: &'static [u8], transcript: &mut Transcript) {
|
||||||
self
|
self
|
||||||
|
|||||||
Reference in New Issue
Block a user