Tweak APIs

This commit is contained in:
Daniel Lubarov 2021-03-21 11:17:00 -07:00
parent ca7f20bf45
commit 75b9340000
9 changed files with 54 additions and 28 deletions

View File

@ -1,11 +1,11 @@
use std::collections::HashSet; use std::collections::HashSet;
use crate::circuit_data::CircuitConfig; use crate::circuit_data::{CircuitConfig, CircuitData, ProverCircuitData, VerifierCircuitData};
use crate::field::field::Field; use crate::field::field::Field;
use crate::gates::constant::ConstantGate2;
use crate::gates::gate::{GateInstance, GateRef}; use crate::gates::gate::{GateInstance, GateRef};
use crate::generator::{CopyGenerator, WitnessGenerator}; use crate::generator::{CopyGenerator, WitnessGenerator};
use crate::target::Target; use crate::target::Target;
use crate::gates::constant::ConstantGate2;
use crate::wire::Wire; use crate::wire::Wire;
pub struct CircuitBuilder2<F: Field> { pub struct CircuitBuilder2<F: Field> {
@ -91,4 +91,19 @@ impl<F: Field> CircuitBuilder2<F> {
let gate = self.add_gate(ConstantGate2::get(), vec![c]); let gate = self.add_gate(ConstantGate2::get(), vec![c]);
Target::Wire(Wire { gate, input: ConstantGate2::WIRE_OUTPUT }) Target::Wire(Wire { gate, input: ConstantGate2::WIRE_OUTPUT })
} }
/// Builds a "full circuit", with both prover and verifier data.
pub fn build(&self) -> CircuitData<F> {
todo!()
}
/// Builds a "prover circuit", with data needed to generate proofs but not verify them.
pub fn build_prover(&self) -> ProverCircuitData<F> {
todo!()
}
/// Builds a "verifier circuit", with data needed to verify proofs but not generate them.
pub fn build_verifier(&self) -> VerifierCircuitData<F> {
todo!()
}
} }

View File

@ -1,8 +1,10 @@
use crate::field::fft::FftPrecomputation; use crate::field::fft::FftPrecomputation;
use crate::field::field::Field; use crate::field::field::Field;
use crate::generator::WitnessGenerator;
use crate::proof::{Hash, Proof2}; use crate::proof::{Hash, Proof2};
use crate::prover::prove2; use crate::prover::prove;
use crate::verifier::verify2; use crate::verifier::verify;
use crate::witness::PartialWitness;
#[derive(Copy, Clone)] #[derive(Copy, Clone)]
pub struct CircuitConfig { pub struct CircuitConfig {
@ -25,12 +27,12 @@ pub struct CircuitData<F: Field> {
} }
impl<F: Field> CircuitData<F> { impl<F: Field> CircuitData<F> {
pub fn prove2(&self) -> Proof2<F> { pub fn prove(&self, inputs: PartialWitness<F>) -> Proof2<F> {
prove2(&self.prover_only, &self.common) prove(&self.prover_only, &self.common, inputs)
} }
pub fn verify2(&self) { pub fn verify(&self) {
verify2(&self.verifier_only, &self.common) verify(&self.verifier_only, &self.common)
} }
} }
@ -41,8 +43,8 @@ pub struct ProverCircuitData<F: Field> {
} }
impl<F: Field> ProverCircuitData<F> { impl<F: Field> ProverCircuitData<F> {
pub fn prove2(&self) -> Proof2<F> { pub fn prove(&self, inputs: PartialWitness<F>) -> Proof2<F> {
prove2(&self.prover_only, &self.common) prove(&self.prover_only, &self.common, inputs)
} }
} }
@ -54,14 +56,13 @@ pub struct VerifierCircuitData<F: Field> {
impl<F: Field> VerifierCircuitData<F> { impl<F: Field> VerifierCircuitData<F> {
pub fn verify2(&self) { pub fn verify2(&self) {
verify2(&self.verifier_only, &self.common) verify(&self.verifier_only, &self.common)
} }
} }
/// Circuit data required by the prover, but not the verifier. /// Circuit data required by the prover, but not the verifier.
pub(crate) struct ProverOnlyCircuitData<F: Field> { pub(crate) struct ProverOnlyCircuitData<F: Field> {
/// A precomputation used for FFTs of degree 8n, where n is the number of gates. pub generators: Vec<Box<dyn WitnessGenerator<F>>>,
pub fft_precomputation_8n: FftPrecomputation<F>,
} }
/// Circuit data required by the verifier, but not the prover. /// Circuit data required by the verifier, but not the prover.
@ -78,7 +79,4 @@ pub(crate) struct CommonCircuitData<F: Field> {
/// A commitment to each permutation polynomial. /// A commitment to each permutation polynomial.
pub sigmas_root: Hash<F>, pub sigmas_root: Hash<F>,
/// A precomputation used for FFTs of degree n, where n is the number of gates.
pub fft_precomputation_n: FftPrecomputation<F>,
} }

View File

@ -53,7 +53,7 @@ impl<F: Field> SimpleGenerator<F> for SplitGenerator {
vec![self.integer] vec![self.integer]
} }
fn run_once(&mut self, witness: &PartialWitness<F>) -> PartialWitness<F> { fn run_once(&self, witness: &PartialWitness<F>) -> PartialWitness<F> {
let mut integer_value = witness.get_target(self.integer).to_canonical_u64(); let mut integer_value = witness.get_target(self.integer).to_canonical_u64();
let mut result = PartialWitness::new(); let mut result = PartialWitness::new();

View File

@ -114,7 +114,7 @@ impl<F: Field> SimpleGenerator<F> for OutputGenerator<F> {
.collect() .collect()
} }
fn run_once(&mut self, witness: &PartialWitness<F>) -> PartialWitness<F> { fn run_once(&self, witness: &PartialWitness<F>) -> PartialWitness<F> {
let mut local_wire_values = Vec::new(); let mut local_wire_values = Vec::new();
let mut next_wire_values = Vec::new(); let mut next_wire_values = Vec::new();

View File

@ -308,7 +308,7 @@ impl<F: Field> SimpleGenerator<F> for InterpolantGenerator<F> {
deps deps
} }
fn run_once(&mut self, witness: &PartialWitness<F>) -> PartialWitness<F> { fn run_once(&self, witness: &PartialWitness<F>) -> PartialWitness<F> {
let mut result = PartialWitness::new(); let mut result = PartialWitness::new();
for commit_idx in 0..self.gate.num_commits { for commit_idx in 0..self.gate.num_commits {

View File

@ -176,7 +176,7 @@ mod tests {
} }
let generators = gate.0.generators(config, 0, vec![], vec![]); let generators = gate.0.generators(config, 0, vec![], vec![]);
generate_partial_witness(&mut witness, generators); generate_partial_witness(&mut witness, &generators);
let expected_outputs: [F; W] = gmimc_permute_naive( let expected_outputs: [F; W] = gmimc_permute_naive(
permutation_inputs.try_into().unwrap(), permutation_inputs.try_into().unwrap(),

View File

@ -4,9 +4,11 @@ use crate::field::field::Field;
use crate::target::Target; use crate::target::Target;
use crate::witness::PartialWitness; use crate::witness::PartialWitness;
/// Given a `PartialWitness` that has only inputs set, populates the rest of the witness using the
/// given set of generators.
pub(crate) fn generate_partial_witness<F: Field>( pub(crate) fn generate_partial_witness<F: Field>(
witness: &mut PartialWitness<F>, witness: &mut PartialWitness<F>,
mut generators: Vec<Box<dyn WitnessGenerator<F>>>, mut generators: &[Box<dyn WitnessGenerator<F>>],
) { ) {
// Index generator indices by their watched targets. // Index generator indices by their watched targets.
let mut generator_indices_by_watches: HashMap<Target, Vec<usize>> = HashMap::new(); let mut generator_indices_by_watches: HashMap<Target, Vec<usize>> = HashMap::new();
@ -67,14 +69,14 @@ pub trait WitnessGenerator<F: Field>: 'static {
/// flag indicating whether the generator is finished. If the flag is true, the generator will /// flag indicating whether the generator is finished. If the flag is true, the generator will
/// never be run again, otherwise it will be queued for another run next time a target in its /// never be run again, otherwise it will be queued for another run next time a target in its
/// watch list is populated. /// watch list is populated.
fn run(&mut self, witness: &PartialWitness<F>) -> (PartialWitness<F>, bool); fn run(&self, witness: &PartialWitness<F>) -> (PartialWitness<F>, bool);
} }
/// A generator which runs once after a list of dependencies is present in the witness. /// A generator which runs once after a list of dependencies is present in the witness.
pub trait SimpleGenerator<F: Field>: 'static { pub trait SimpleGenerator<F: Field>: 'static {
fn dependencies(&self) -> Vec<Target>; fn dependencies(&self) -> Vec<Target>;
fn run_once(&mut self, witness: &PartialWitness<F>) -> PartialWitness<F>; fn run_once(&self, witness: &PartialWitness<F>) -> PartialWitness<F>;
} }
impl<F: Field, SG: SimpleGenerator<F>> WitnessGenerator<F> for SG { impl<F: Field, SG: SimpleGenerator<F>> WitnessGenerator<F> for SG {
@ -82,7 +84,7 @@ impl<F: Field, SG: SimpleGenerator<F>> WitnessGenerator<F> for SG {
self.dependencies() self.dependencies()
} }
fn run(&mut self, witness: &PartialWitness<F>) -> (PartialWitness<F>, bool) { fn run(&self, witness: &PartialWitness<F>) -> (PartialWitness<F>, bool) {
if witness.contains_all(&self.dependencies()) { if witness.contains_all(&self.dependencies()) {
(self.run_once(witness), true) (self.run_once(witness), true)
} else { } else {
@ -102,7 +104,7 @@ impl<F: Field> SimpleGenerator<F> for CopyGenerator {
vec![self.src] vec![self.src]
} }
fn run_once(&mut self, witness: &PartialWitness<F>) -> PartialWitness<F> { fn run_once(&self, witness: &PartialWitness<F>) -> PartialWitness<F> {
let value = witness.get_target(self.src); let value = witness.get_target(self.src);
PartialWitness::singleton(self.dst, value) PartialWitness::singleton(self.dst, value)
} }

View File

@ -1,10 +1,21 @@
use crate::circuit_data::{CommonCircuitData, ProverOnlyCircuitData}; use crate::circuit_data::{CommonCircuitData, ProverOnlyCircuitData};
use crate::field::field::Field; use crate::field::field::Field;
use crate::generator::generate_partial_witness;
use crate::proof::Proof2; use crate::proof::Proof2;
use crate::witness::PartialWitness;
pub(crate) fn prove2<F: Field>( pub(crate) fn prove<F: Field>(
prover_data: &ProverOnlyCircuitData<F>, prover_data: &ProverOnlyCircuitData<F>,
common_data: &CommonCircuitData<F>, common_data: &CommonCircuitData<F>,
inputs: PartialWitness<F>,
) -> Proof2<F> { ) -> Proof2<F> {
todo!() let mut witness = inputs;
generate_partial_witness(&mut witness, &prover_data.generators);
Proof2 {
wires_root: todo!(),
plonk_z_root: todo!(),
plonk_t_root: todo!(),
openings: todo!(),
}
} }

View File

@ -1,7 +1,7 @@
use crate::circuit_data::{CommonCircuitData, VerifierOnlyCircuitData}; use crate::circuit_data::{CommonCircuitData, VerifierOnlyCircuitData};
use crate::field::field::Field; use crate::field::field::Field;
pub(crate) fn verify2<F: Field>( pub(crate) fn verify<F: Field>(
verifier_data: &VerifierOnlyCircuitData, verifier_data: &VerifierOnlyCircuitData,
common_data: &CommonCircuitData<F>, common_data: &CommonCircuitData<F>,
) { ) {