use crate::field::field::Field; use crate::generator::WitnessGenerator; use crate::proof::{Hash, Proof2}; use crate::prover::prove; use crate::verifier::verify; use crate::witness::PartialWitness; use crate::gates::gate::{GateRef}; #[derive(Copy, Clone)] pub struct CircuitConfig { pub num_wires: usize, pub num_routed_wires: usize, pub security_bits: usize, pub rate_bits: usize, } impl CircuitConfig { pub fn num_advice_wires(&self) -> usize { self.num_wires - self.num_routed_wires } } /// Circuit data required by the prover or the verifier. pub struct CircuitData { pub(crate) prover_only: ProverOnlyCircuitData, pub(crate) verifier_only: VerifierOnlyCircuitData, pub(crate) common: CommonCircuitData, } impl CircuitData { pub fn prove(&self, inputs: PartialWitness) -> Proof2 { prove(&self.prover_only, &self.common, inputs) } pub fn verify(&self) { verify(&self.verifier_only, &self.common) } } /// Circuit data required by the prover. pub struct ProverCircuitData { pub(crate) prover_only: ProverOnlyCircuitData, pub(crate) common: CommonCircuitData, } impl ProverCircuitData { pub fn prove(&self, inputs: PartialWitness) -> Proof2 { prove(&self.prover_only, &self.common, inputs) } } /// Circuit data required by the prover. pub struct VerifierCircuitData { pub(crate) verifier_only: VerifierOnlyCircuitData, pub(crate) common: CommonCircuitData, } impl VerifierCircuitData { pub fn verify2(&self) { verify(&self.verifier_only, &self.common) } } /// Circuit data required by the prover, but not the verifier. pub(crate) struct ProverOnlyCircuitData { pub generators: Vec>>, } /// Circuit data required by the verifier, but not the prover. pub(crate) struct VerifierOnlyCircuitData {} /// Circuit data required by both the prover and the verifier. pub(crate) struct CommonCircuitData { pub(crate) config: CircuitConfig, pub(crate) degree: usize, /// The types of gates used in this circuit. pub(crate) gates: Vec>, /// A commitment to each constant polynomial. pub(crate) constants_root: Hash, /// A commitment to each permutation polynomial. pub(crate) sigmas_root: Hash, } impl CommonCircuitData { pub fn constraint_degree(&self, config: CircuitConfig) -> usize { self.gates.iter() .map(|g| g.0.degree(config)) .max() .expect("No gates?") } }