move circuit and witness load functions outside of circuit struct

This commit is contained in:
poma 2020-01-31 17:45:38 +08:00
parent 27ad5eb7c5
commit c8f7e68f3a
No known key found for this signature in database
GPG Key ID: BA20CB01FE165657
4 changed files with 54 additions and 53 deletions

@ -4,7 +4,7 @@ extern crate exitcode;
use std::fs::File; use std::fs::File;
use phase2::parameters::MPCParameters; use phase2::parameters::MPCParameters;
use phase2::circom_circuit::CircomCircuit; use phase2::circom_circuit::circuit_from_json_file;
fn main() { fn main() {
let args: Vec<String> = std::env::args().collect(); let args: Vec<String> = std::env::args().collect();
@ -20,7 +20,7 @@ fn main() {
// Import the circuit and create the initial parameters using phase 1 // Import the circuit and create the initial parameters using phase 1
println!("Creating initial parameters for {}...", circuit_filename); println!("Creating initial parameters for {}...", circuit_filename);
let params = { let params = {
let c = CircomCircuit::from_json_file(&circuit_filename); let c = circuit_from_json_file(&circuit_filename);
MPCParameters::new(c, should_filter_points_at_infinity).unwrap() MPCParameters::new(c, should_filter_points_at_infinity).unwrap()
}; };

@ -9,12 +9,13 @@ extern crate itertools;
use std::fs; use std::fs;
use bellman_ce::pairing::bn256::Bn256; use bellman_ce::pairing::bn256::Bn256;
use phase2::circom_circuit::{ use phase2::circom_circuit::{
CircomCircuit,
load_params_file, load_params_file,
prove, prove,
verify, verify,
create_rng, create_rng,
proof_to_json_file proof_to_json_file,
circuit_from_json_file,
witness_from_json_file
}; };
fn main() { fn main() {
@ -31,8 +32,8 @@ fn main() {
let rng = create_rng(); let rng = create_rng();
let params = load_params_file(params_filename); let params = load_params_file(params_filename);
let mut circuit = CircomCircuit::from_json_file(circuit_filename); let mut circuit = circuit_from_json_file(circuit_filename);
circuit.witness = Some(CircomCircuit::<Bn256>::witness_from_json_file(witness_filename)); circuit.witness = Some(witness_from_json_file::<Bn256>(witness_filename));
println!("Proving..."); println!("Proving...");
let proof = prove(circuit.clone(), &params, rng).unwrap(); let proof = prove(circuit.clone(), &params, rng).unwrap();

@ -4,7 +4,7 @@ extern crate exitcode;
use std::fs::OpenOptions; use std::fs::OpenOptions;
use phase2::parameters::*; use phase2::parameters::*;
use phase2::circom_circuit::CircomCircuit; use phase2::circom_circuit::circuit_from_json_file;
fn main() { fn main() {
let args: Vec<String> = std::env::args().collect(); let args: Vec<String> = std::env::args().collect();
@ -34,7 +34,7 @@ fn main() {
let contribution = verify_contribution(&old_params, &new_params).expect("should verify"); let contribution = verify_contribution(&old_params, &new_params).expect("should verify");
let should_filter_points_at_infinity = false; let should_filter_points_at_infinity = false;
let verification_result = new_params.verify(CircomCircuit::from_json_file(&circuit_filename), should_filter_points_at_infinity).unwrap(); let verification_result = new_params.verify(circuit_from_json_file(&circuit_filename), should_filter_points_at_infinity).unwrap();
assert!(contains_contribution(&verification_result, &contribution)); assert!(contains_contribution(&verification_result, &contribution));
println!("Contribution {} verified.", new_params_filename); println!("Contribution {} verified.", new_params_filename);
} }

@ -3,7 +3,7 @@ extern crate rand;
use std::str; use std::str;
use std::fs; use std::fs;
use std::fs::OpenOptions; use std::fs::{OpenOptions, File};
use std::io::{Read, Write}; use std::io::{Read, Write};
use std::collections::BTreeMap; use std::collections::BTreeMap;
use std::iter::repeat; use std::iter::repeat;
@ -110,50 +110,6 @@ pub struct CircomCircuit<E: Engine> {
} }
impl<'a, E: Engine> CircomCircuit<E> { impl<'a, E: Engine> CircomCircuit<E> {
pub fn from_json_file(filename: &str) -> CircomCircuit::<E> {
let reader = OpenOptions::new()
.read(true)
.open(filename)
.expect("unable to open.");
return CircomCircuit::from_json(reader);
}
pub fn from_json<R: Read>(reader: R) -> CircomCircuit::<E> {
let circuit_json: CircuitJson = serde_json::from_reader(reader).unwrap();
let num_inputs = circuit_json.num_inputs + circuit_json.num_outputs + 1;
let num_aux = circuit_json.num_variables - num_inputs;
let convert_constraint = |lc: &BTreeMap<String, String>| {
lc.iter().map(|(index, coeff)| (index.parse().unwrap(), E::Fr::from_str(coeff).unwrap())).collect_vec()
};
let constraints = circuit_json.constraints.iter().map(
|c| (convert_constraint(&c[0]), convert_constraint(&c[1]), convert_constraint(&c[2]))
).collect_vec();
return CircomCircuit {
num_inputs: num_inputs,
num_aux: num_aux,
num_constraints: circuit_json.num_variables,
witness: None,
constraints: constraints,
};
}
pub fn witness_from_json_file(filename: &str) -> Vec<E::Fr> {
let reader = OpenOptions::new()
.read(true)
.open(filename)
.expect("unable to open.");
return CircomCircuit::<E>::witness_from_json(reader);
}
pub fn witness_from_json<R: Read>(reader: R) -> Vec<E::Fr>{
let witness: Vec<String> = serde_json::from_reader(reader).unwrap();
return witness.into_iter().map(|x| E::Fr::from_str(&x).unwrap()).collect::<Vec<E::Fr>>();
}
pub fn get_public_inputs(&self) -> Option<Vec<E::Fr>> { pub fn get_public_inputs(&self) -> Option<Vec<E::Fr>> {
return match self.witness.clone() { return match self.witness.clone() {
None => None, None => None,
@ -349,6 +305,50 @@ pub fn verification_key_json_file(params: &Parameters<Bn256>, filename: &str) ->
return fs::write(filename, str.as_bytes()); return fs::write(filename, str.as_bytes());
} }
pub fn witness_from_json_file<E: Engine>(filename: &str) -> Vec<E::Fr> {
let reader = OpenOptions::new()
.read(true)
.open(filename)
.expect("unable to open.");
return witness_from_json::<E, File>(reader);
}
pub fn witness_from_json<E: Engine, R: Read>(reader: R) -> Vec<E::Fr>{
let witness: Vec<String> = serde_json::from_reader(reader).unwrap();
return witness.into_iter().map(|x| E::Fr::from_str(&x).unwrap()).collect::<Vec<E::Fr>>();
}
pub fn circuit_from_json_file<E: Engine>(filename: &str) -> CircomCircuit::<E> {
let reader = OpenOptions::new()
.read(true)
.open(filename)
.expect("unable to open.");
return circuit_from_json(reader);
}
pub fn circuit_from_json<E: Engine, R: Read>(reader: R) -> CircomCircuit::<E> {
let circuit_json: CircuitJson = serde_json::from_reader(reader).unwrap();
let num_inputs = circuit_json.num_inputs + circuit_json.num_outputs + 1;
let num_aux = circuit_json.num_variables - num_inputs;
let convert_constraint = |lc: &BTreeMap<String, String>| {
lc.iter().map(|(index, coeff)| (index.parse().unwrap(), E::Fr::from_str(coeff).unwrap())).collect_vec()
};
let constraints = circuit_json.constraints.iter().map(
|c| (convert_constraint(&c[0]), convert_constraint(&c[1]), convert_constraint(&c[2]))
).collect_vec();
return CircomCircuit {
num_inputs: num_inputs,
num_aux: num_aux,
num_constraints: circuit_json.num_variables,
witness: None,
constraints: constraints,
};
}
pub fn create_rng() -> Box<dyn Rng> { pub fn create_rng() -> Box<dyn Rng> {
return Box::new(OsRng::new().unwrap()) return Box::new(OsRng::new().unwrap())
} }