plonky2/src/prover.rs

75 lines
2.5 KiB
Rust
Raw Normal View History

2021-03-25 15:20:14 -07:00
use std::time::Instant;
use log::info;
2021-02-09 21:25:21 -08:00
use crate::circuit_data::{CommonCircuitData, ProverOnlyCircuitData};
2021-03-25 15:20:14 -07:00
use crate::field::fft::{fft, ifft, lde};
2021-02-09 21:25:21 -08:00
use crate::field::field::Field;
2021-03-21 11:17:00 -07:00
use crate::generator::generate_partial_witness;
2021-03-25 15:20:14 -07:00
use crate::hash::{compress, hash_n_to_hash, hash_n_to_m, hash_or_noop, merkle_root_bit_rev_order};
use crate::proof::{Hash, Proof2};
use crate::util::{log2_ceil, reverse_index_bits};
2021-03-21 11:57:33 -07:00
use crate::wire::Wire;
2021-03-21 11:17:00 -07:00
use crate::witness::PartialWitness;
2021-03-25 15:20:14 -07:00
use rayon::prelude::*;
2021-02-09 21:25:21 -08:00
2021-03-21 11:17:00 -07:00
pub(crate) fn prove<F: Field>(
2021-02-09 21:25:21 -08:00
prover_data: &ProverOnlyCircuitData<F>,
common_data: &CommonCircuitData<F>,
2021-03-21 11:17:00 -07:00
inputs: PartialWitness<F>,
2021-02-09 21:25:21 -08:00
) -> Proof2<F> {
2021-03-21 11:17:00 -07:00
let mut witness = inputs;
2021-03-25 15:20:14 -07:00
let start_witness = Instant::now();
info!("Running {} generators", prover_data.generators.len());
2021-03-21 11:17:00 -07:00
generate_partial_witness(&mut witness, &prover_data.generators);
2021-03-25 15:20:14 -07:00
info!("Witness generation took {}s", start_witness.elapsed().as_secs_f32());
2021-03-21 11:17:00 -07:00
2021-03-21 11:57:33 -07:00
let config = common_data.config;
let num_wires = config.num_wires;
2021-03-25 15:20:14 -07:00
let start_wire_ldes = Instant::now();
// TODO: Simplify using lde_multiple.
// TODO: Parallelize.
2021-03-21 11:57:33 -07:00
let wire_ldes = (0..num_wires)
2021-03-25 15:20:14 -07:00
.map(|i| compute_wire_lde(i, &witness, common_data.degree, config.rate_bits))
2021-03-21 11:57:33 -07:00
.collect::<Vec<_>>();
2021-03-25 15:20:14 -07:00
info!("Computing wire LDEs took {}s", start_wire_ldes.elapsed().as_secs_f32());
let start_wires_root = Instant::now();
let wires_root = merkle_root_bit_rev_order(wire_ldes);
info!("Merklizing wire LDEs took {}s", start_wires_root.elapsed().as_secs_f32());
2021-03-21 11:57:33 -07:00
2021-03-25 15:20:14 -07:00
let plonk_z_vecs = todo!();
let plonk_z_ldes = todo!();
let plonk_z_root = merkle_root_bit_rev_order(plonk_z_ldes);
2021-03-21 11:57:33 -07:00
2021-03-25 15:20:14 -07:00
let plonk_t_vecs = todo!();
let plonk_t_ldes = todo!();
let plonk_t_root = merkle_root_bit_rev_order(plonk_t_ldes);
2021-03-21 11:57:33 -07:00
let openings = todo!();
2021-03-21 11:17:00 -07:00
Proof2 {
2021-03-21 11:57:33 -07:00
wires_root,
plonk_z_root,
plonk_t_root,
openings,
}
}
fn compute_wire_lde<F: Field>(
input: usize,
witness: &PartialWitness<F>,
degree: usize,
2021-03-25 15:20:14 -07:00
rate_bits: usize,
2021-03-21 11:57:33 -07:00
) -> Vec<F> {
2021-03-25 15:20:14 -07:00
let wire_values = (0..degree)
2021-03-21 19:50:05 -07:00
// Some gates do not use all wires, and we do not require that generators populate unused
// wires, so some wire values will not be set. We can set these to any value; here we
// arbitrary pick zero. Ideally we would verify that no constraints operate on these unset
// wires, but that isn't trivial.
.map(|gate| witness.try_get_wire(Wire { gate, input }).unwrap_or(F::ZERO))
2021-03-21 11:57:33 -07:00
.collect();
2021-03-25 15:20:14 -07:00
lde(wire_values, rate_bits)
2021-02-09 21:25:21 -08:00
}