implement high-level helper api

This commit is contained in:
Alex Vlasov 2019-02-10 19:44:53 +03:00
parent f98b6eaaf4
commit b7d59787ed
4 changed files with 82 additions and 17 deletions

@ -0,0 +1,33 @@
use ff::{Field};
use pairing::{Engine, CurveProjective};
use std::marker::PhantomData;
use rand::{Rand, Rng};
use super::{Proof, SxyAdvice};
use super::batch::Batch;
use super::poly::{SxEval, SyEval};
use super::parameters::{Parameters};
use super::helper::{Aggregate};
use crate::SynthesisError;
use crate::sonic::transcript::{Transcript, TranscriptProtocol};
use crate::sonic::util::*;
use crate::sonic::cs::{Backend, SynthesisDriver};
use crate::{Circuit};
use crate::sonic::sonic::AdaptorCircuit;
use crate::sonic::srs::SRS;
use crate::sonic::cs::Nonassigning;
use super::helper::create_aggregate as create_aggregate_sonic_circuit;
pub fn create_aggregate<E: Engine, C: Circuit<E> + Clone>(
circuit: C,
inputs: &[(Proof<E>, SxyAdvice<E>)],
params: &Parameters<E>,
) -> Aggregate<E>
{
let adapted_circuit = AdaptorCircuit(circuit);
create_aggregate_sonic_circuit::<_, _, Nonassigning>(&adapted_circuit, inputs, params)
}

@ -5,6 +5,7 @@ use std::marker::PhantomData;
use super::{Proof, SxyAdvice}; use super::{Proof, SxyAdvice};
use super::batch::Batch; use super::batch::Batch;
use super::poly::{SxEval, SyEval}; use super::poly::{SxEval, SyEval};
use super::Parameters;
use crate::SynthesisError; use crate::SynthesisError;
@ -27,6 +28,18 @@ pub struct Aggregate<E: Engine> {
} }
pub fn create_aggregate<E: Engine, C: Circuit<E>, S: SynthesisDriver>( pub fn create_aggregate<E: Engine, C: Circuit<E>, S: SynthesisDriver>(
circuit: &C,
inputs: &[(Proof<E>, SxyAdvice<E>)],
params: &Parameters<E>,
) -> Aggregate<E>
{
let n = params.vk.n;
let q = params.vk.q;
create_aggregate_on_srs_using_information::<E, C, S>(circuit, inputs, &params.srs, n, q)
}
pub fn create_aggregate_on_srs<E: Engine, C: Circuit<E>, S: SynthesisDriver>(
circuit: &C, circuit: &C,
inputs: &[(Proof<E>, SxyAdvice<E>)], inputs: &[(Proof<E>, SxyAdvice<E>)],
srs: &SRS<E>, srs: &SRS<E>,
@ -55,6 +68,17 @@ pub fn create_aggregate<E: Engine, C: Circuit<E>, S: SynthesisDriver>(
(tmp.n, tmp.q) (tmp.n, tmp.q)
}; };
create_aggregate_on_srs_using_information::<E, C, S>(circuit, inputs, srs, n, q)
}
pub fn create_aggregate_on_srs_using_information<E: Engine, C: Circuit<E>, S: SynthesisDriver>(
circuit: &C,
inputs: &[(Proof<E>, SxyAdvice<E>)],
srs: &SRS<E>,
n: usize,
q: usize,
) -> Aggregate<E>
{
let mut transcript = Transcript::new(&[]); let mut transcript = Transcript::new(&[]);
let mut y_values: Vec<E::Fr> = Vec::with_capacity(inputs.len()); let mut y_values: Vec<E::Fr> = Vec::with_capacity(inputs.len());
for &(ref proof, ref sxyadvice) in inputs { for &(ref proof, ref sxyadvice) in inputs {

@ -5,19 +5,18 @@ use ff::{Field};
use pairing::{Engine, CurveProjective}; use pairing::{Engine, CurveProjective};
use std::marker::PhantomData; use std::marker::PhantomData;
mod verifier;
mod batch; mod batch;
mod poly; mod poly;
mod helper; pub mod prover;
pub mod verifier;
pub mod helper;
mod parameters; mod parameters;
mod generator; mod generator;
mod adapted_prover; mod adapted_prover;
mod adapted_verifier; mod adapted_verifier;
mod adapted_helper;
pub mod prover;
pub use self::batch::{Batch}; pub use self::batch::{Batch};
pub use self::helper::{Aggregate, create_aggregate};
pub use self::verifier::{MultiVerifier}; pub use self::verifier::{MultiVerifier};
pub use self::generator::{ pub use self::generator::{
@ -29,7 +28,13 @@ pub use self::generator::{
generate_srs, generate_srs,
get_circuit_parameters get_circuit_parameters
}; };
pub use self::parameters::{Proof, SxyAdvice, Parameters, VerifyingKey, PreparedVerifyingKey}; pub use self::parameters::{
Proof,
SxyAdvice,
Parameters,
VerifyingKey,
PreparedVerifyingKey
};
pub use self::adapted_prover::{ pub use self::adapted_prover::{
create_advice, create_advice,
create_advice_on_srs, create_advice_on_srs,
@ -41,4 +46,8 @@ pub use self::adapted_prover::{
pub use self::adapted_verifier::{ pub use self::adapted_verifier::{
verify_proofs, verify_proofs,
verify_aggregate verify_aggregate
};
pub use self::adapted_helper::{
create_aggregate
}; };

@ -480,7 +480,8 @@ fn test_sonic_mimc() {
use bellman::sonic::cs::Basic; use bellman::sonic::cs::Basic;
use bellman::sonic::sonic::AdaptorCircuit; use bellman::sonic::sonic::AdaptorCircuit;
use bellman::sonic::helped::prover::{create_advice_on_srs, create_proof_on_srs}; use bellman::sonic::helped::prover::{create_advice_on_srs, create_proof_on_srs};
use bellman::sonic::helped::{create_aggregate, MultiVerifier}; use bellman::sonic::helped::{MultiVerifier, get_circuit_parameters};
use bellman::sonic::helped::helper::{create_aggregate_on_srs};
println!("creating proof"); println!("creating proof");
let start = Instant::now(); let start = Instant::now();
@ -495,7 +496,7 @@ fn test_sonic_mimc() {
println!("creating aggregate for {} proofs", samples); println!("creating aggregate for {} proofs", samples);
let start = Instant::now(); let start = Instant::now();
let proofs: Vec<_> = (0..samples).map(|_| (proof.clone(), advice.clone())).collect(); let proofs: Vec<_> = (0..samples).map(|_| (proof.clone(), advice.clone())).collect();
let aggregate = create_aggregate::<Bls12, _, Basic>(&AdaptorCircuit(circuit.clone()), &proofs, &srs); let aggregate = create_aggregate_on_srs::<Bls12, _, Basic>(&AdaptorCircuit(circuit.clone()), &proofs, &srs);
println!("done in {:?}", start.elapsed()); println!("done in {:?}", start.elapsed());
{ {
@ -583,7 +584,8 @@ fn test_inputs_into_sonic_mimc() {
use bellman::sonic::cs::Basic; use bellman::sonic::cs::Basic;
use bellman::sonic::sonic::AdaptorCircuit; use bellman::sonic::sonic::AdaptorCircuit;
use bellman::sonic::helped::prover::{create_advice_on_srs, create_proof_on_srs}; use bellman::sonic::helped::prover::{create_advice_on_srs, create_proof_on_srs};
use bellman::sonic::helped::{create_aggregate, MultiVerifier, get_circuit_parameters}; use bellman::sonic::helped::{MultiVerifier, get_circuit_parameters};
use bellman::sonic::helped::helper::{create_aggregate_on_srs};
let info = get_circuit_parameters::<Bn256, _>(circuit.clone()).expect("Must get circuit info"); let info = get_circuit_parameters::<Bn256, _>(circuit.clone()).expect("Must get circuit info");
println!("{:?}", info); println!("{:?}", info);
@ -601,7 +603,7 @@ fn test_inputs_into_sonic_mimc() {
println!("creating aggregate for {} proofs", samples); println!("creating aggregate for {} proofs", samples);
let start = Instant::now(); let start = Instant::now();
let proofs: Vec<_> = (0..samples).map(|_| (proof.clone(), advice.clone())).collect(); let proofs: Vec<_> = (0..samples).map(|_| (proof.clone(), advice.clone())).collect();
let aggregate = create_aggregate::<Bn256, _, Basic>(&AdaptorCircuit(circuit.clone()), &proofs, &srs); let aggregate = create_aggregate_on_srs::<Bn256, _, Basic>(&AdaptorCircuit(circuit.clone()), &proofs, &srs);
println!("done in {:?}", start.elapsed()); println!("done in {:?}", start.elapsed());
{ {
@ -651,19 +653,16 @@ fn test_inputs_into_sonic_mimc() {
#[test] #[test]
fn test_high_level_sonic_api() { fn test_high_level_sonic_api() {
use ff::{Field, PrimeField}; use pairing::bn256::{Bn256};
use pairing::{Engine, CurveAffine, CurveProjective};
use pairing::bn256::{Bn256, Fr};
use std::time::{Instant}; use std::time::{Instant};
use bellman::sonic::helped::{generate_random_parameters, use bellman::sonic::helped::{
generate_random_parameters,
verify_aggregate, verify_aggregate,
verify_proofs, verify_proofs,
create_proof, create_proof,
create_advice, create_advice,
create_aggregate create_aggregate
}; };
use bellman::sonic::cs::Basic;
use bellman::sonic::sonic::AdaptorCircuit;
{ {
// This may not be cryptographically safe, use // This may not be cryptographically safe, use
@ -701,7 +700,7 @@ fn test_high_level_sonic_api() {
println!("creating aggregate for {} proofs", samples); println!("creating aggregate for {} proofs", samples);
let start = Instant::now(); let start = Instant::now();
let proofs: Vec<_> = (0..samples).map(|_| (proof.clone(), advice.clone())).collect(); let proofs: Vec<_> = (0..samples).map(|_| (proof.clone(), advice.clone())).collect();
let aggregate = create_aggregate::<Bn256, _, Basic>(&AdaptorCircuit(circuit.clone()), &proofs, &params.srs); let aggregate = create_aggregate::<Bn256, _>(circuit.clone(), &proofs, &params);
println!("done in {:?}", start.elapsed()); println!("done in {:?}", start.elapsed());
{ {