2021-02-09 21:25:21 -08:00
|
|
|
use crate::field::field::Field;
|
2021-03-21 11:17:00 -07:00
|
|
|
use crate::generator::WitnessGenerator;
|
2021-02-09 21:25:21 -08:00
|
|
|
use crate::proof::{Hash, Proof2};
|
2021-03-21 11:17:00 -07:00
|
|
|
use crate::prover::prove;
|
|
|
|
|
use crate::verifier::verify;
|
|
|
|
|
use crate::witness::PartialWitness;
|
2021-03-25 15:20:14 -07:00
|
|
|
use crate::gates::gate::{GateRef};
|
2021-02-09 21:25:21 -08:00
|
|
|
|
|
|
|
|
#[derive(Copy, Clone)]
|
|
|
|
|
pub struct CircuitConfig {
|
|
|
|
|
pub num_wires: usize,
|
|
|
|
|
pub num_routed_wires: usize,
|
|
|
|
|
pub security_bits: usize,
|
2021-03-25 15:20:14 -07:00
|
|
|
pub rate_bits: usize,
|
2021-02-09 21:25:21 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl CircuitConfig {
|
2021-03-21 11:57:33 -07:00
|
|
|
pub fn num_advice_wires(&self) -> usize {
|
2021-02-09 21:25:21 -08:00
|
|
|
self.num_wires - self.num_routed_wires
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Circuit data required by the prover or the verifier.
|
|
|
|
|
pub struct CircuitData<F: Field> {
|
2021-03-25 15:20:14 -07:00
|
|
|
pub(crate) prover_only: ProverOnlyCircuitData<F>,
|
|
|
|
|
pub(crate) verifier_only: VerifierOnlyCircuitData,
|
|
|
|
|
pub(crate) common: CommonCircuitData<F>,
|
2021-02-09 21:25:21 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl<F: Field> CircuitData<F> {
|
2021-03-21 11:17:00 -07:00
|
|
|
pub fn prove(&self, inputs: PartialWitness<F>) -> Proof2<F> {
|
|
|
|
|
prove(&self.prover_only, &self.common, inputs)
|
2021-02-09 21:25:21 -08:00
|
|
|
}
|
|
|
|
|
|
2021-03-21 11:17:00 -07:00
|
|
|
pub fn verify(&self) {
|
|
|
|
|
verify(&self.verifier_only, &self.common)
|
2021-02-09 21:25:21 -08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Circuit data required by the prover.
|
|
|
|
|
pub struct ProverCircuitData<F: Field> {
|
2021-03-25 15:20:14 -07:00
|
|
|
pub(crate) prover_only: ProverOnlyCircuitData<F>,
|
|
|
|
|
pub(crate) common: CommonCircuitData<F>,
|
2021-02-09 21:25:21 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl<F: Field> ProverCircuitData<F> {
|
2021-03-21 11:17:00 -07:00
|
|
|
pub fn prove(&self, inputs: PartialWitness<F>) -> Proof2<F> {
|
|
|
|
|
prove(&self.prover_only, &self.common, inputs)
|
2021-02-09 21:25:21 -08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Circuit data required by the prover.
|
|
|
|
|
pub struct VerifierCircuitData<F: Field> {
|
2021-03-25 15:20:14 -07:00
|
|
|
pub(crate) verifier_only: VerifierOnlyCircuitData,
|
|
|
|
|
pub(crate) common: CommonCircuitData<F>,
|
2021-02-09 21:25:21 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl<F: Field> VerifierCircuitData<F> {
|
|
|
|
|
pub fn verify2(&self) {
|
2021-03-21 11:17:00 -07:00
|
|
|
verify(&self.verifier_only, &self.common)
|
2021-02-09 21:25:21 -08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Circuit data required by the prover, but not the verifier.
|
|
|
|
|
pub(crate) struct ProverOnlyCircuitData<F: Field> {
|
2021-03-21 11:17:00 -07:00
|
|
|
pub generators: Vec<Box<dyn WitnessGenerator<F>>>,
|
2021-02-09 21:25:21 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// 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<F: Field> {
|
2021-03-25 15:20:14 -07:00
|
|
|
pub(crate) config: CircuitConfig,
|
2021-02-09 21:25:21 -08:00
|
|
|
|
2021-03-25 15:20:14 -07:00
|
|
|
pub(crate) degree: usize,
|
2021-02-09 21:25:21 -08:00
|
|
|
|
2021-03-21 11:57:33 -07:00
|
|
|
/// The types of gates used in this circuit.
|
2021-03-25 15:20:14 -07:00
|
|
|
pub(crate) gates: Vec<GateRef<F>>,
|
2021-03-21 11:57:33 -07:00
|
|
|
|
2021-02-09 21:25:21 -08:00
|
|
|
/// A commitment to each constant polynomial.
|
2021-03-25 15:20:14 -07:00
|
|
|
pub(crate) constants_root: Hash<F>,
|
2021-02-09 21:25:21 -08:00
|
|
|
|
|
|
|
|
/// A commitment to each permutation polynomial.
|
2021-03-25 15:20:14 -07:00
|
|
|
pub(crate) sigmas_root: Hash<F>,
|
2021-02-09 21:25:21 -08:00
|
|
|
}
|
2021-03-21 11:57:33 -07:00
|
|
|
|
|
|
|
|
impl<F: Field> CommonCircuitData<F> {
|
|
|
|
|
pub fn constraint_degree(&self, config: CircuitConfig) -> usize {
|
|
|
|
|
self.gates.iter()
|
|
|
|
|
.map(|g| g.0.degree(config))
|
|
|
|
|
.max()
|
|
|
|
|
.expect("No gates?")
|
|
|
|
|
}
|
|
|
|
|
}
|