From 6bbe1fe6b8687e3808982264ee5982e333a1dbd1 Mon Sep 17 00:00:00 2001 From: Leo Lara Date: Wed, 10 Jul 2024 15:42:41 +0700 Subject: [PATCH 1/4] Refactor halo2 backend (#269) Co-authored-by: Alex Kuzmin --- examples/blake2f.rs | 16 +- examples/factorial.rs | 16 +- examples/fibo_with_padding.rs | 9 +- examples/fibonacci.py | 4 +- examples/fibonacci.rs | 9 +- examples/keccak.rs | 18 +- examples/mimc7.py | 2 +- examples/mimc7.rs | 17 +- examples/poseidon.rs | 16 +- src/frontend/python/README.md | 11 +- src/frontend/python/chiquito/dsl.py | 10 +- src/frontend/python/mod.rs | 38 +-- src/interpreter/mod.rs | 16 +- src/plonkish/backend/halo2.rs | 470 ++++++++++++++++------------ src/plonkish/compiler/unit.rs | 1 + src/plonkish/ir/mod.rs | 1 + src/plonkish/ir/sc.rs | 2 + 17 files changed, 349 insertions(+), 307 deletions(-) diff --git a/examples/blake2f.rs b/examples/blake2f.rs index bf327c55..63a67e74 100644 --- a/examples/blake2f.rs +++ b/examples/blake2f.rs @@ -7,10 +7,7 @@ use chiquito::{ CircuitContext, StepTypeSetupContext, StepTypeWGHandler, }, plonkish::{ - backend::halo2::{ - chiquitoSuperCircuit2Halo2, halo2_verify, ChiquitoHalo2SuperCircuit, DummyRng, - Halo2Prover, PlonkishHalo2, - }, + backend::halo2::{halo2_verify, DummyRng, PlonkishHalo2}, compiler::{ cell_manager::{MaxWidthCellManager, SingleRowCellManager}, config, @@ -1398,8 +1395,7 @@ fn blake2f_super_circuit() -> SuperCircuit } fn main() { - let super_circuit = blake2f_super_circuit::(); - let compiled = chiquitoSuperCircuit2Halo2(&super_circuit); + let mut super_circuit = blake2f_super_circuit::(); // h[0] = hex"48c9bdf267e6096a 3ba7ca8485ae67bb 2bf894fe72f36e3c f1361d5f3af54fa5"; // h[1] = hex"d182e6ad7f520e51 1f6c3e2b8c68059b 6bbd41fbabd9831f 79217e1319cde05b"; @@ -1482,18 +1478,18 @@ fn main() { }; let witness = super_circuit.get_mapping().generate(values); - let mut circuit = ChiquitoHalo2SuperCircuit::new(compiled); let rng = BlockRng::new(DummyRng {}); - let halo2_prover = circuit.create_halo2_prover(9, rng); + let halo2_prover = super_circuit.create_halo2_prover(rng); + println!("k={}", halo2_prover.get_k()); let (proof, instance) = halo2_prover.generate_proof(witness); let result = halo2_verify( proof, - &halo2_prover.setup.params, - &halo2_prover.setup.vk, + halo2_prover.get_params(), + halo2_prover.get_vk(), instance, ); diff --git a/examples/factorial.rs b/examples/factorial.rs index c86a233d..88e5312c 100644 --- a/examples/factorial.rs +++ b/examples/factorial.rs @@ -5,7 +5,7 @@ use chiquito::{ frontend::dsl::{circuit, trace::DSLTraceGenerator}, /* main function for constructing an AST * circuit */ plonkish::{ - backend::halo2::{halo2_verify, DummyRng, Halo2Prover, PlonkishHalo2}, + backend::halo2::{halo2_verify, DummyRng, PlonkishHalo2}, compiler::{ cell_manager::SingleRowCellManager, // input for constructing the compiler compile, // input for constructing the compiler @@ -138,15 +138,16 @@ fn main() { let mut plonkish = generate::(); let rng = BlockRng::new(DummyRng {}); - let halo2_prover = plonkish.create_halo2_prover(10, rng); + let halo2_prover = plonkish.create_halo2_prover(rng); + println!("k={}", halo2_prover.get_k()); let (proof, instance) = halo2_prover.generate_proof(plonkish.assignment_generator.unwrap().generate(0)); let result = halo2_verify( proof, - &halo2_prover.setup.params, - &halo2_prover.setup.vk, + halo2_prover.get_params(), + halo2_prover.get_vk(), instance, ); @@ -159,15 +160,16 @@ fn main() { let mut plonkish = generate::(); let rng = BlockRng::new(DummyRng {}); - let halo2_prover = plonkish.create_halo2_prover(8, rng); + let halo2_prover = plonkish.create_halo2_prover(rng); + println!("k={}", halo2_prover.get_k()); let (proof, instance) = halo2_prover.generate_proof(plonkish.assignment_generator.unwrap().generate(7)); let result = halo2_verify( proof, - &halo2_prover.setup.params, - &halo2_prover.setup.vk, + halo2_prover.get_params(), + halo2_prover.get_vk(), instance, ); diff --git a/examples/fibo_with_padding.rs b/examples/fibo_with_padding.rs index 16e8ad40..496aae6b 100644 --- a/examples/fibo_with_padding.rs +++ b/examples/fibo_with_padding.rs @@ -5,7 +5,7 @@ use chiquito::{ frontend::dsl::{circuit, trace::DSLTraceGenerator}, /* main function for constructing an AST * circuit */ plonkish::{ - backend::halo2::{halo2_verify, DummyRng, Halo2Prover, PlonkishHalo2}, + backend::halo2::{halo2_verify, DummyRng, PlonkishHalo2}, compiler::{ cell_manager::SingleRowCellManager, // input for constructing the compiler compile, // input for constructing the compiler @@ -208,15 +208,16 @@ fn main() { let mut plonkish = fibo_circuit::(); let rng = BlockRng::new(DummyRng {}); - let halo2_prover = plonkish.create_halo2_prover(7, rng); + let halo2_prover = plonkish.create_halo2_prover(rng); + println!("k={}", halo2_prover.get_k()); let (proof, instance) = halo2_prover.generate_proof(plonkish.assignment_generator.unwrap().generate(7)); let result = halo2_verify( proof, - &halo2_prover.setup.params, - &halo2_prover.setup.vk, + halo2_prover.get_params(), + halo2_prover.get_vk(), instance, ); diff --git a/examples/fibonacci.py b/examples/fibonacci.py index 0c7aedfa..be0047b0 100644 --- a/examples/fibonacci.py +++ b/examples/fibonacci.py @@ -80,9 +80,9 @@ def trace(self, n): fibo = Fibonacci() fibo_witness = fibo.gen_witness(7) fibo.halo2_mock_prover( - fibo_witness, k=7 + fibo_witness ) # 2^k specifies the number of PLONKish table rows in Halo2 another_fibo_witness = fibo.gen_witness(4) -fibo.halo2_mock_prover(another_fibo_witness, k=7) +fibo.halo2_mock_prover(another_fibo_witness) fibo.to_pil(fibo_witness, "FiboCircuit") diff --git a/examples/fibonacci.rs b/examples/fibonacci.rs index cc465808..f5661d51 100644 --- a/examples/fibonacci.rs +++ b/examples/fibonacci.rs @@ -6,7 +6,7 @@ use chiquito::{ * circuit */ plonkish::{ backend::{ - halo2::{halo2_verify, DummyRng, Halo2Prover, PlonkishHalo2}, + halo2::{halo2_verify, DummyRng, PlonkishHalo2}, hyperplonk::ChiquitoHyperPlonkCircuit, }, compiler::{ @@ -136,15 +136,16 @@ fn main() { let rng = BlockRng::new(DummyRng {}); - let halo2_prover = chiquito.create_halo2_prover(7, rng); + let halo2_prover = chiquito.create_halo2_prover(rng); + println!("k={}", halo2_prover.get_k()); let (proof, instance) = halo2_prover.generate_proof(chiquito.assignment_generator.unwrap().generate(())); let result = halo2_verify( proof, - &halo2_prover.setup.params, - &halo2_prover.setup.vk, + halo2_prover.get_params(), + halo2_prover.get_vk(), instance, ); diff --git a/examples/keccak.rs b/examples/keccak.rs index 87e745b0..9637e541 100644 --- a/examples/keccak.rs +++ b/examples/keccak.rs @@ -3,10 +3,7 @@ use chiquito::{ lb::LookupTable, super_circuit, trace::DSLTraceGenerator, CircuitContext, StepTypeWGHandler, }, plonkish::{ - backend::halo2::{ - chiquitoSuperCircuit2Halo2, halo2_verify, ChiquitoHalo2SuperCircuit, DummyRng, - Halo2Prover, PlonkishHalo2, - }, + backend::halo2::{halo2_verify, DummyRng, PlonkishHalo2}, compiler::{ cell_manager::{MaxWidthCellManager, SingleRowCellManager}, config, @@ -2255,24 +2252,21 @@ fn main() { bytes: vec![0, 1, 2, 3, 4, 5, 6, 7], }; - let super_circuit = keccak_super_circuit::(circuit_param.bytes.len()); - - let compiled = chiquitoSuperCircuit2Halo2(&super_circuit); - - let mut circuit = ChiquitoHalo2SuperCircuit::new(compiled); + let mut super_circuit = keccak_super_circuit::(circuit_param.bytes.len()); let rng = BlockRng::new(DummyRng {}); let witness = super_circuit.get_mapping().generate(circuit_param); - let halo2_prover = circuit.create_halo2_prover(9, rng); + let halo2_prover = super_circuit.create_halo2_prover(rng); + println!("k={}", halo2_prover.get_k()); let (proof, instance) = halo2_prover.generate_proof(witness); let result = halo2_verify( proof, - &halo2_prover.setup.params, - &halo2_prover.setup.vk, + halo2_prover.get_params(), + halo2_prover.get_vk(), instance, ); diff --git a/examples/mimc7.py b/examples/mimc7.py index f17028fc..a23e78c1 100644 --- a/examples/mimc7.py +++ b/examples/mimc7.py @@ -167,4 +167,4 @@ def mapping(self, x_in_value, k_value): mimc7_super_witness = mimc7.gen_witness(F(1), F(2)) # for key, value in mimc7_super_witness.items(): # print(f"{key}: {str(value)}") -mimc7.halo2_mock_prover(mimc7_super_witness, k=10) +mimc7.halo2_mock_prover(mimc7_super_witness) diff --git a/examples/mimc7.rs b/examples/mimc7.rs index 2eba4be4..83c0514f 100644 --- a/examples/mimc7.rs +++ b/examples/mimc7.rs @@ -5,10 +5,7 @@ use halo2_proofs::halo2curves::{bn256::Fr, group::ff::PrimeField}; use chiquito::{ frontend::dsl::{lb::LookupTable, super_circuit, trace::DSLTraceGenerator, CircuitContext}, plonkish::{ - backend::halo2::{ - chiquitoSuperCircuit2Halo2, halo2_verify, ChiquitoHalo2SuperCircuit, DummyRng, - Halo2Prover, PlonkishHalo2, - }, + backend::halo2::{halo2_verify, DummyRng, PlonkishHalo2}, compiler::{ cell_manager::SingleRowCellManager, config, step_selector::SimpleStepSelectorBuilder, }, @@ -202,23 +199,21 @@ fn main() { let x_in_value = Fr::from_str_vartime("1").expect("expected a number"); let k_value = Fr::from_str_vartime("2").expect("expected a number"); - let super_circuit = mimc7_super_circuit::(); - let compiled = chiquitoSuperCircuit2Halo2(&super_circuit); - - let mut circuit = ChiquitoHalo2SuperCircuit::new(compiled); + let mut super_circuit = mimc7_super_circuit::(); let rng = BlockRng::new(DummyRng {}); let witness = super_circuit.get_mapping().generate((x_in_value, k_value)); - let halo2_prover = circuit.create_halo2_prover(10, rng); + let halo2_prover = super_circuit.create_halo2_prover(rng); + println!("k={}", halo2_prover.get_k()); let (proof, instance) = halo2_prover.generate_proof(witness); let result = halo2_verify( proof, - &halo2_prover.setup.params, - &halo2_prover.setup.vk, + halo2_prover.get_params(), + halo2_prover.get_vk(), instance, ); diff --git a/examples/poseidon.rs b/examples/poseidon.rs index 440cd158..685bcad2 100644 --- a/examples/poseidon.rs +++ b/examples/poseidon.rs @@ -1,10 +1,7 @@ use chiquito::{ frontend::dsl::{lb::LookupTable, super_circuit, trace::DSLTraceGenerator, CircuitContext}, plonkish::{ - backend::halo2::{ - chiquitoSuperCircuit2Halo2, halo2_verify, ChiquitoHalo2SuperCircuit, DummyRng, - Halo2Prover, PlonkishHalo2, - }, + backend::halo2::{halo2_verify, DummyRng, PlonkishHalo2}, compiler::{ cell_manager::{MaxWidthCellManager, SingleRowCellManager}, config, @@ -704,21 +701,20 @@ fn main() { n_outputs: 1, }; - let super_circuit = poseidon_super_circuit(lens); - let compiled = chiquitoSuperCircuit2Halo2(&super_circuit); + let mut super_circuit = poseidon_super_circuit(lens); let witness = super_circuit.get_mapping().generate(values); - let mut circuit = ChiquitoHalo2SuperCircuit::new(compiled); let rng = BlockRng::new(DummyRng {}); - let halo2_prover = circuit.create_halo2_prover(12, rng); + let halo2_prover = super_circuit.create_halo2_prover(rng); + println!("k={}", halo2_prover.get_k()); let (proof, instance) = halo2_prover.generate_proof(witness); let result = halo2_verify( proof, - &halo2_prover.setup.params, - &halo2_prover.setup.vk, + halo2_prover.get_params(), + halo2_prover.get_vk(), instance, ); diff --git a/src/frontend/python/README.md b/src/frontend/python/README.md index caa4fe15..5d24caf4 100644 --- a/src/frontend/python/README.md +++ b/src/frontend/python/README.md @@ -1,11 +1,13 @@ # Quick Start + ## Setup + Chiquito's Python frontend uses PyO3 and Maturin to expose Rust APIs to Python. Maturin requires the user to locally build a Python virtual environment. Run the following script to create a Python virtual environment, install required packages, and build the project. ```bash # Clone this repo git clone https://github.com/privacy-scaling-explorations/chiquito/ -# Navigate to the repository root directory +# Navigate to the repository root directory cd chiquito # Create a virtual environment python3 -m venv .env @@ -20,22 +22,25 @@ maturin develop If the above doesn't work, follow the guide here: https://pyo3.rs/main/getting_started#python ## Testing with examples + Run fibonacci.py example file using the following script in the virtual environment: ```bash -python3 example/fibonacci.py +python3 examples/fibonacci.py ``` Run mimc7.py example: ```bash -python example/mimc7.py +python examples/mimc7.py ``` If setup is correct, all Halo2 and Chiquito Debug messages for generating and verifying proof should appear in the terminal. # Technical Design + Python front end → Python AST object/TraceWitness → serialize to JSON string → pass JSON string to Rust using PyO3 → deserialize JSON string to Chiquito AST/TraceWitness → store AST in Rust `HashMap` → pass back UUID to Python → generate and verify proof from Python with AST UUID and TraceWitness JSON ## Notes: + Rust bindings to expose to Python, boilerplate functions, and `Deserialize` trait implementations for Rust Chiquito AST, TraceWitness, and their sub types are all in [src/frontend/python/mod.rs](https://github.com/privacy-scaling-explorations/chiquito/blob/main/src/frontend/python/mod.rs) diff --git a/src/frontend/python/chiquito/dsl.py b/src/frontend/python/chiquito/dsl.py index ee41004f..a8b25146 100644 --- a/src/frontend/python/chiquito/dsl.py +++ b/src/frontend/python/chiquito/dsl.py @@ -75,9 +75,7 @@ def gen_witness(self: SuperCircuit, *args: Any) -> Dict[int, TraceWitness]: ) # so that we can generate different witness mapping in the next gen_witness() call return super_witness - def halo2_mock_prover( - self: SuperCircuit, super_witness: Dict[int, TraceWitness], k: int = 16 - ): + def halo2_mock_prover(self: SuperCircuit, super_witness: Dict[int, TraceWitness]): witness_json = {} for rust_id, witness in super_witness.items(): if rust_id not in self.ast.sub_circuits: @@ -86,7 +84,7 @@ def halo2_mock_prover( ) witness_json[rust_id] = witness.get_witness_json() rust_chiquito.super_circuit_halo2_mock_prover( - list(self.ast.sub_circuits.keys()), witness_json, k + list(self.ast.sub_circuits.keys()), witness_json ) @@ -218,12 +216,12 @@ def gen_witness(self: Circuit, *args) -> TraceWitness: def get_ast_json(self: Circuit) -> str: return json.dumps(self.ast, cls=CustomEncoder, indent=4) - def halo2_mock_prover(self: Circuit, witness: TraceWitness, k: int = 16): + def halo2_mock_prover(self: Circuit, witness: TraceWitness): if self.rust_id == 0: ast_json: str = self.get_ast_json() self.rust_id: int = rust_chiquito.ast_to_halo2(ast_json) witness_json: str = witness.get_witness_json() - rust_chiquito.halo2_mock_prover(witness_json, self.rust_id, k) + rust_chiquito.halo2_mock_prover(witness_json, self.rust_id) def to_pil( self: Circuit, witness: TraceWitness, circuit_name: str = "Circuit" diff --git a/src/frontend/python/mod.rs b/src/frontend/python/mod.rs index 53bd20c4..876785ed 100644 --- a/src/frontend/python/mod.rs +++ b/src/frontend/python/mod.rs @@ -8,10 +8,7 @@ use crate::{ frontend::dsl::{StepTypeHandler, SuperCircuitContext}, pil::backend::powdr_pil::chiquito2Pil, plonkish::{ - backend::halo2::{ - chiquito2Halo2, chiquitoSuperCircuit2Halo2, halo2_verify, ChiquitoHalo2, - ChiquitoHalo2SuperCircuit, DummyRng, Halo2Prover, PlonkishHalo2, - }, + backend::halo2::{chiquito2Halo2, halo2_verify, ChiquitoHalo2, DummyRng, PlonkishHalo2}, compiler::{ cell_manager::SingleRowCellManager, compile, config, step_selector::SimpleStepSelectorBuilder, PlonkishCompilationResult, @@ -121,7 +118,6 @@ fn add_assignment_generator_to_rust_id( pub fn chiquito_super_circuit_halo2_mock_prover( rust_ids: Vec, super_witness: HashMap, - k: usize, ) { let mut super_circuit_ctx = SuperCircuitContext::::default(); @@ -134,8 +130,7 @@ pub fn chiquito_super_circuit_halo2_mock_prover( add_assignment_generator_to_rust_id(assignment, rust_id); } - let super_circuit = super_circuit_ctx.compile(); - let compiled = chiquitoSuperCircuit2Halo2(&super_circuit); + let mut super_circuit = super_circuit_ctx.compile(); let mut mapping_ctx = MappingContext::default(); for rust_id in rust_ids { @@ -151,18 +146,16 @@ pub fn chiquito_super_circuit_halo2_mock_prover( let super_assignments = mapping_ctx.get_super_assignments(); - let mut circuit = ChiquitoHalo2SuperCircuit::new(compiled); - let rng = BlockRng::new(DummyRng {}); - let halo2_prover = circuit.create_halo2_prover(k as u32, rng); + let halo2_prover = super_circuit.create_halo2_prover(rng); let (proof, instance) = halo2_prover.generate_proof(super_assignments); let result = halo2_verify( proof, - &halo2_prover.setup.params, - &halo2_prover.setup.vk, + halo2_prover.get_params(), + halo2_prover.get_vk(), instance, ); @@ -184,7 +177,7 @@ fn rust_id_to_halo2(uuid: UUID) -> CircuitMapStore { /// Runs `MockProver` for a single circuit given JSON of `TraceWitness` and `rust_id` of the /// circuit. -pub fn chiquito_halo2_mock_prover(witness_json: &str, rust_id: UUID, k: usize) { +pub fn chiquito_halo2_mock_prover(witness_json: &str, rust_id: UUID) { let trace_witness: TraceWitness = serde_json::from_str(witness_json).expect("Json deserialization to TraceWitness failed."); let (_, compiled, assignment_generator) = rust_id_to_halo2(rust_id); @@ -192,11 +185,11 @@ pub fn chiquito_halo2_mock_prover(witness_json: &str, rust_id: UUID, k: usize) { let rng = BlockRng::new(DummyRng {}); let mut plonkish = PlonkishCompilationResult { - circuit: compiled.circuit, + circuit: compiled.plonkish_ir, assignment_generator, }; - let halo2_prover = plonkish.create_halo2_prover(k as u32, rng); + let halo2_prover = plonkish.create_halo2_prover(rng); let (proof, instance) = halo2_prover.generate_proof( plonkish @@ -207,8 +200,8 @@ pub fn chiquito_halo2_mock_prover(witness_json: &str, rust_id: UUID, k: usize) { let result = halo2_verify( proof, - &halo2_prover.setup.params, - &halo2_prover.setup.vk, + halo2_prover.get_params(), + halo2_prover.get_vk(), instance, ); @@ -1912,16 +1905,15 @@ fn ast_map_store(json: &PyString) -> u128 { } #[pyfunction] -fn halo2_mock_prover(witness_json: &PyString, rust_id: &PyLong, k: &PyLong) { +fn halo2_mock_prover(witness_json: &PyString, rust_id: &PyLong) { chiquito_halo2_mock_prover( witness_json.to_str().expect("PyString conversion failed."), rust_id.extract().expect("PyLong conversion failed."), - k.extract().expect("PyLong conversion failed."), ); } #[pyfunction] -fn super_circuit_halo2_mock_prover(rust_ids: &PyList, super_witness: &PyDict, k: &PyLong) { +fn super_circuit_halo2_mock_prover(rust_ids: &PyList, super_witness: &PyDict) { let uuids = rust_ids .iter() .map(|rust_id| { @@ -1950,11 +1942,7 @@ fn super_circuit_halo2_mock_prover(rust_ids: &PyList, super_witness: &PyDict, k: }) .collect::>(); - chiquito_super_circuit_halo2_mock_prover( - uuids, - super_witness, - k.extract().expect("PyLong conversion failed."), - ) + chiquito_super_circuit_halo2_mock_prover(uuids, super_witness) } #[pymodule] diff --git a/src/interpreter/mod.rs b/src/interpreter/mod.rs index b8068ff7..94bb3394 100644 --- a/src/interpreter/mod.rs +++ b/src/interpreter/mod.rs @@ -321,7 +321,7 @@ fn get_block_stmts(stmt: &Statement) -> Vec> ChiquitoField for T { } } -#[allow(non_snake_case)] -pub fn chiquito2Halo2 + Hash>(circuit: Circuit) -> ChiquitoHalo2 { - ChiquitoHalo2::new(circuit) -} +trait Halo2Configurable { + fn compile_middleware( + &mut self, + num_circuit_rows: usize, + ) -> Result<(CompiledCircuit, u32), Error> { + let mut cs = self.configure_cs(); -fn compile_middleware + Hash, C: Halo2Configurable>( - k: u32, - circuit: &mut C, -) -> Result, Error> { - let (cs, preprocessing) = circuit.configure(k)?; - - Ok(CompiledCircuit { - cs: cs.clone().into(), - preprocessing, - }) + let preprocessing = self.preprocessing(&mut cs); + + let occupied_rows = num_circuit_rows + cs.minimum_rows(); + let k = occupied_rows.next_power_of_two().trailing_zeros(); + let n = 2usize.pow(k); + + Ok(( + CompiledCircuit { + cs: cs.clone().into(), + preprocessing: preprocessing.extend(n), + }, + k, + )) + } + + fn configure_cs(&mut self) -> ConstraintSystem; + fn preprocessing(&self, cs: &mut ConstraintSystem) -> PreprocessingCompact; } -#[allow(non_snake_case)] -pub fn chiquitoSuperCircuit2Halo2 + Hash, MappingArgs>( - super_circuit: &SuperCircuit, -) -> Vec> { - super_circuit - .get_sub_circuits() - .iter() - .map(|c| chiquito2Halo2((*c).clone())) - .collect() +pub trait Halo2WitnessGenerator { + fn instance(&self, witness: &W) -> Vec>; + fn assigned_witness( + &self, + witness: &W, + params_n: usize, + num_advice_columns: usize, + ) -> Vec>>; } #[derive(Clone, Debug, Default)] pub struct ChiquitoHalo2> { pub debug: bool, - pub circuit: Circuit, + pub(crate) plonkish_ir: Circuit, advice_columns: HashMap>, fixed_columns: HashMap>, @@ -115,45 +123,23 @@ pub struct ChiquitoHalo2> { ir_id: UUID, } -trait Halo2Configurable { - fn configure(&mut self, k: u32) -> Result<(ConstraintSystem, Preprocessing), Error> { - let mut cs = self.configure_cs(); - let n = 2usize.pow(k); - - if n < cs.minimum_rows() { - return Err(Error::Backend(ErrorBack::NotEnoughRowsAvailable { - current_k: k, - })); - } - - let preprocessing = self.preprocessing(&mut cs, n); - - Ok((cs.clone(), preprocessing)) - } - - fn configure_cs(&mut self) -> ConstraintSystem; - fn preprocessing(&self, cs: &mut ConstraintSystem, n: usize) -> Preprocessing; -} - impl Halo2Configurable for ChiquitoHalo2 { - fn preprocessing(&self, cs: &mut ConstraintSystem, n: usize) -> Preprocessing { - let fixed_count = self.circuit.fixed_assignments.0.len(); - let mut fixed = vec![vec![F::default(); n]; fixed_count]; + fn preprocessing(&self, cs: &mut ConstraintSystem) -> PreprocessingCompact { + let fixed_count = self.plonkish_ir.fixed_assignments.0.len(); + let mut fixed = vec![vec![]; fixed_count]; - for (column, values) in self.circuit.fixed_assignments.iter() { + for (column, values) in self.plonkish_ir.fixed_assignments.iter() { let column = self.convert_fixed_column(column); - for (offset, value) in values.iter().enumerate() { - fixed[column.index][offset] = *value; - } + fixed[column.index].extend(values.iter().cloned()); } let mut copies = vec![]; self.collect_permutations(cs, &mut copies); - Preprocessing { + PreprocessingCompact { permutation: AssemblyMid { copies }, - fixed, + fixed_compact: fixed, } } @@ -168,12 +154,34 @@ impl Halo2Configurable for ChiquitoHalo2 { } } +/// "Compact" preprocessing +/// Created before the circuit size is known (here the height of the fixed assignments is defined +/// only by the number of assigned values) +struct PreprocessingCompact { + permutation: AssemblyMid, + fixed_compact: Vec>, +} + +impl PreprocessingCompact { + /// Extend the preprocessing to the full circuit size + fn extend(mut self, n: usize) -> Preprocessing { + self.fixed_compact + .iter_mut() + .for_each(|f| f.extend(iter::repeat(F::default()).take(n - f.len()))); + + Preprocessing { + permutation: self.permutation, + fixed: self.fixed_compact, + } + } +} + impl + Hash> ChiquitoHalo2 { pub fn new(circuit: Circuit) -> ChiquitoHalo2 { let ir_id = circuit.id; ChiquitoHalo2 { debug: true, - circuit, + plonkish_ir: circuit, advice_columns: Default::default(), fixed_columns: Default::default(), instance_column: Default::default(), @@ -185,7 +193,7 @@ impl + Hash> ChiquitoHalo2 { let mut advice_columns = HashMap::>::new(); let mut fixed_columns = HashMap::>::new(); - for column in self.circuit.columns.iter() { + for column in self.plonkish_ir.columns.iter() { match column.ctype { cAdvice => { let halo2_column = to_halo2_advice(meta, column); @@ -225,15 +233,15 @@ impl + Hash> ChiquitoHalo2 { } fn configure_sub_circuit(&mut self, meta: &mut ConstraintSystem) { - if !self.circuit.exposed.is_empty() { + if !self.plonkish_ir.exposed.is_empty() { self.instance_column = Some(meta.instance_column()); } - if !self.circuit.polys.is_empty() { + if !self.plonkish_ir.polys.is_empty() { meta.create_gate("main", |meta| { let mut constraints: Vec<(&'static str, Expression)> = Vec::new(); - for poly in self.circuit.polys.iter() { + for poly in self.plonkish_ir.polys.iter() { let converted = self.convert_poly(meta, &poly.expr); let annotation = Box::leak( format!("{} => {:?}", poly.annotation, converted).into_boxed_str(), @@ -245,7 +253,7 @@ impl + Hash> ChiquitoHalo2 { }); } - for lookup in self.circuit.lookups.iter() { + for lookup in self.plonkish_ir.lookups.iter() { let annotation: &'static str = Box::leak(lookup.annotation.clone().into_boxed_str()); meta.lookup_any(annotation, |meta| { let mut exprs = Vec::new(); @@ -339,7 +347,7 @@ impl + Hash> ChiquitoHalo2 { cs: &mut ConstraintSystem, copies: &mut Vec<(CellMid, CellMid)>, ) { - self.circuit + self.plonkish_ir .exposed .iter() .enumerate() @@ -377,15 +385,26 @@ impl + Hash> ChiquitoHalo2 { } } -fn to_halo2_advice( - meta: &mut ConstraintSystem, - column: &cColumn, -) -> Column { - match column.phase { - 0 => meta.advice_column_in(FirstPhase), - 1 => meta.advice_column_in(SecondPhase), - 2 => meta.advice_column_in(ThirdPhase), - _ => panic!("jarll wrong phase"), +impl Halo2WitnessGenerator> for ChiquitoHalo2 { + fn instance(&self, witness: &Assignments) -> Vec> { + if !self.plonkish_ir.exposed.is_empty() { + vec![self.plonkish_ir.instance(witness)] + } else { + vec![] + } + } + + fn assigned_witness( + &self, + witness: &Assignments, + params_n: usize, + num_advice_columns: usize, + ) -> Vec>> { + let mut assigned_witness = vec![Some(vec![F::default(); params_n]); num_advice_columns]; + + assign_witness(self, witness, &mut assigned_witness); + + assigned_witness } } @@ -395,11 +414,47 @@ pub struct ChiquitoHalo2SuperCircuit> { } impl + Hash> ChiquitoHalo2SuperCircuit { - pub fn new(sub_circuits: Vec>) -> Self { + fn new(sub_circuits: Vec>) -> Self { Self { sub_circuits } } } +impl Halo2WitnessGenerator> for ChiquitoHalo2SuperCircuit { + fn instance(&self, witness: &SuperAssignments) -> Vec> { + let mut instance = Vec::new(); + + for circuit in self.sub_circuits.iter() { + if !circuit.plonkish_ir.exposed.is_empty() { + let instance_values = circuit.plonkish_ir.instance( + witness + .get(&circuit.ir_id) + .expect("No matching witness found for given UUID."), + ); + instance.push(instance_values); + } + } + + instance + } + + fn assigned_witness( + &self, + witness: &SuperAssignments, + params_n: usize, + num_advice_columns: usize, + ) -> Vec>> { + let mut assigned_witness = vec![Some(vec![F::default(); params_n]); num_advice_columns]; + + for circuit in self.sub_circuits.iter() { + if let Some(assignments) = witness.get(&circuit.ir_id) { + assign_witness(circuit, assignments, &mut assigned_witness); + } + } + + assigned_witness + } +} + impl Halo2Configurable for ChiquitoHalo2SuperCircuit { fn configure_cs(&mut self) -> ConstraintSystem { let mut cs = ConstraintSystem::default(); @@ -432,7 +487,7 @@ impl Halo2Configurable for ChiquitoHalo2SuperCircuit cs } - fn preprocessing(&self, cs: &mut ConstraintSystem, n: usize) -> Preprocessing { + fn preprocessing(&self, cs: &mut ConstraintSystem) -> PreprocessingCompact { let fixed_columns: HashMap> = self.sub_circuits .iter() @@ -442,23 +497,21 @@ impl Halo2Configurable for ChiquitoHalo2SuperCircuit }); let fixed_count = fixed_columns.len(); - let mut fixed = vec![vec![F::default(); n]; fixed_count]; + let mut fixed = vec![vec![]; fixed_count]; let mut copies = vec![]; for subcircuit in self.sub_circuits.iter() { - for (column, values) in subcircuit.circuit.fixed_assignments.iter() { + for (column, values) in subcircuit.plonkish_ir.fixed_assignments.iter() { let column = fixed_columns.get(&column.uuid()).unwrap(); - for (offset, value) in values.iter().enumerate() { - fixed[column.index][offset] = *value; - } + fixed[column.index].extend(values.iter().cloned()); } subcircuit.collect_permutations(cs, &mut copies); } - Preprocessing { + PreprocessingCompact { permutation: AssemblyMid { copies }, - fixed, + fixed_compact: fixed, } } } @@ -495,18 +548,77 @@ pub fn halo2_verify( } /// Halo2 setup -pub struct Setup { - pub cs: ConstraintSystemMid, - pub params: ParamsKZG, - pub vk: VerifyingKey, - pub pk: ProvingKey, +struct Setup { + k: u32, + cs: ConstraintSystemMid, + params: ParamsKZG, + vk: VerifyingKey, + pk: ProvingKey, rng: BlockRng, } -/// Halo2 prover for a single circuit -pub struct SingleCircuitProver { - pub setup: Setup, - circuit: ChiquitoHalo2, +/// Halo2 prover +pub struct Halo2Prover +where + WG: Halo2WitnessGenerator, +{ + setup: Setup, + wit_gen: WG, + + _p: PhantomData<(F, W)>, +} + +impl> Halo2Prover { + fn new(setup: Setup, wit_gen: WG) -> Halo2Prover { + Halo2Prover { + setup, + wit_gen, + _p: PhantomData, + } + } + + /// Generate halo2 proof. + pub fn generate_proof(&self, witness: W) -> (Vec, Vec>) { + let instance = self.wit_gen.instance(&witness); + + // Proving + let mut transcript = Blake2bWrite::<_, G1Affine, Challenge255<_>>::init(vec![]); + let mut prover = create_prover(&self.setup, &instance, &mut transcript); + + for phase in 0..self.setup.cs.phases() { + let assigned_witness = self.wit_gen.assigned_witness( + &witness, + self.setup.params.n() as usize, + self.setup.cs.num_advice_columns, + ); + + // TODO ignoring the challenges produced by the phase, but can they be useful later? + let _ = prover.commit_phase(phase as u8, assigned_witness).unwrap(); + } + prover.create_proof().unwrap(); + let proof = transcript.finalize(); + + (proof, instance) + } + + /// Get halo2 setup params + pub fn get_params(&self) -> &ParamsKZG { + &self.setup.params + } + + /// Get halo2 verifying key + pub fn get_vk(&self) -> &VerifyingKey { + &self.setup.vk + } + + /// Get halo2 proving key + pub fn get_pk(&self) -> &ProvingKey { + &self.setup.pk + } + + pub fn get_k(&self) -> u32 { + self.setup.k + } } #[allow(clippy::type_complexity)] @@ -545,10 +657,10 @@ fn create_prover<'a>( .unwrap() } -fn assign_witness( - circuit: &ChiquitoHalo2, - witness: &Assignments, - assigned_witness: &mut [Option>], +fn assign_witness>( + circuit: &ChiquitoHalo2, + witness: &Assignments, + assigned_witness: &mut [Option>], ) { for (column, values) in witness.iter() { let circuit_column = circuit.advice_columns.get(&column.uuid()).unwrap(); @@ -559,142 +671,70 @@ fn assign_witness( } } -/// Halo2 prover for a super circuit -pub struct SuperCircuitProver { - pub setup: Setup, - circuit: ChiquitoHalo2SuperCircuit, -} - -pub trait Halo2Prover { - /// Witness type - type W; - /// Generate Halo2 proof - /// #### Arguments - /// * `witness` - circuit witness - /// #### Returns - /// * a tuple of proof and instance values - fn generate_proof(&self, witness: Self::W) -> (Vec, Vec>); -} - -impl Halo2Prover for SuperCircuitProver { - type W = SuperAssignments; - - fn generate_proof(&self, witnesses: Self::W) -> (Vec, Vec>) { - let mut instance = Vec::new(); - - for circuit in self.circuit.sub_circuits.iter() { - if !circuit.circuit.exposed.is_empty() { - let instance_values = circuit.circuit.instance( - witnesses - .get(&circuit.ir_id) - .expect("No matching witness found for given UUID."), - ); - instance.push(instance_values); - } - } - - // Proving - let mut transcript = Blake2bWrite::<_, G1Affine, Challenge255<_>>::init(vec![]); - let mut prover = create_prover(&self.setup, &instance, &mut transcript); - - for phase in 0..self.setup.cs.phases() { - let mut assigned_witness = - vec![ - Some(vec![Fr::default(); self.setup.params.n() as usize]); - self.setup.cs.num_advice_columns - ]; - - for circuit in self.circuit.sub_circuits.iter() { - if let Some(assignments) = witnesses.get(&circuit.ir_id) { - assign_witness(circuit, assignments, &mut assigned_witness); - } - } - - // TODO ignoring the challenges produced by the phase, but can they be useful later? - let _ = prover.commit_phase(phase as u8, assigned_witness).unwrap(); - } - prover.create_proof().unwrap(); - let proof = transcript.finalize(); - - (proof, instance) - } -} - -impl Halo2Prover for SingleCircuitProver { - type W = Assignments; - - fn generate_proof(&self, witness: Self::W) -> (Vec, Vec>) { - let mut instance = Vec::new(); - - if !self.circuit.circuit.exposed.is_empty() { - let instance_values = self.circuit.circuit.instance(&witness); - instance.push(instance_values); - } - - // Proving - let mut transcript = Blake2bWrite::<_, G1Affine, Challenge255<_>>::init(vec![]); - - let mut prover = create_prover(&self.setup, &instance, &mut transcript); - - for phase in 0..self.setup.cs.phases() { - let mut assigned_witness = - vec![ - Some(vec![Fr::default(); self.setup.params.n() as usize]); - self.setup.cs.num_advice_columns - ]; - - assign_witness(&self.circuit, &witness, &mut assigned_witness); - - // TODO ignoring the challenges produced by the phase, but can they be useful later? - let _ = prover.commit_phase(phase as u8, assigned_witness).unwrap(); - } - prover.create_proof().unwrap(); - let proof = transcript.finalize(); - - (proof, instance) - } -} - -pub trait PlonkishHalo2 { +pub trait PlonkishHalo2> { /// Create a Halo2 prover /// /// ### Arguments - /// * `k` - logaritmic size of the circuit /// * `rng` - random number generator /// /// ### Returns /// * a Halo2 prover - fn create_halo2_prover(&mut self, k: u32, rng: BlockRng) -> P; + fn create_halo2_prover(&mut self, rng: BlockRng) -> Halo2Prover; } -impl + Default> PlonkishHalo2> +impl + Default> PlonkishHalo2, ChiquitoHalo2> for PlonkishCompilationResult { - fn create_halo2_prover(&mut self, k: u32, rng: BlockRng) -> SingleCircuitProver { + fn create_halo2_prover( + &mut self, + rng: BlockRng, + ) -> Halo2Prover, ChiquitoHalo2> { let mut circuit = ChiquitoHalo2::new(self.circuit.clone()); - let compiled = compile_middleware(k, &mut circuit).unwrap(); - let setup = create_setup(k, rng, compiled); - SingleCircuitProver { setup, circuit } + let (compiled, k) = circuit.compile_middleware(self.circuit.num_rows).unwrap(); + let setup = create_setup(rng, compiled, k); + + Halo2Prover::new(setup, circuit) } } -impl PlonkishHalo2> for ChiquitoHalo2SuperCircuit { - fn create_halo2_prover(&mut self, k: u32, rng: BlockRng) -> SuperCircuitProver { - let compiled = compile_middleware(k, self).unwrap(); - let setup = create_setup(k, rng, compiled); - SuperCircuitProver { - circuit: self.clone(), - setup, - } +impl PlonkishHalo2, ChiquitoHalo2SuperCircuit> + for SuperCircuit +{ + fn create_halo2_prover( + &mut self, + rng: BlockRng, + ) -> Halo2Prover, ChiquitoHalo2SuperCircuit> { + let compiled = self + .get_sub_circuits() + .iter() + .map(|c| chiquito2Halo2((*c).clone())) + .collect(); + + let mut circuit = ChiquitoHalo2SuperCircuit::new(compiled); + + let tallest_subcircuit_height = circuit + .sub_circuits + .iter() + .map(|c| c.plonkish_ir.num_rows) + .max() + .unwrap_or(0); + + let (compiled, k) = circuit + .compile_middleware(tallest_subcircuit_height) + .unwrap(); + let setup = create_setup(rng, compiled, k); + + Halo2Prover::new(setup, circuit) } } -fn create_setup(k: u32, rng: BlockRng, circuit: CompiledCircuit) -> Setup { +fn create_setup(rng: BlockRng, circuit: CompiledCircuit, k: u32) -> Setup { let params = ParamsKZG::::setup::>(k, rng.clone()); let vk = keygen_vk(¶ms, &circuit).expect("keygen_vk should not fail"); let pk = keygen_pk(¶ms, vk.clone(), &circuit).expect("keygen_pk should not fail"); Setup { + k, cs: circuit.cs, params, vk, @@ -719,3 +759,23 @@ impl BlockRngCore for DummyRng { } } } + +fn to_halo2_advice( + meta: &mut ConstraintSystem, + column: &cColumn, +) -> Column { + match column.phase { + 0 => meta.advice_column_in(FirstPhase), + 1 => meta.advice_column_in(SecondPhase), + 2 => meta.advice_column_in(ThirdPhase), + _ => panic!("jarll wrong phase"), + } +} + +/// LEGACY +#[allow(non_snake_case)] +pub(crate) fn chiquito2Halo2 + Hash>( + circuit: Circuit, +) -> ChiquitoHalo2 { + ChiquitoHalo2::new(circuit) +} diff --git a/src/plonkish/compiler/unit.rs b/src/plonkish/compiler/unit.rs index c12da935..0591f774 100644 --- a/src/plonkish/compiler/unit.rs +++ b/src/plonkish/compiler/unit.rs @@ -273,6 +273,7 @@ impl From> for Circuit { fixed_assignments: unit.fixed_assignments, id: unit.uuid, ast_id: unit.ast_id, + num_rows: unit.num_rows, } } } diff --git a/src/plonkish/ir/mod.rs b/src/plonkish/ir/mod.rs index 8a99138b..6ce59ba0 100644 --- a/src/plonkish/ir/mod.rs +++ b/src/plonkish/ir/mod.rs @@ -26,6 +26,7 @@ pub struct Circuit { pub id: UUID, pub ast_id: UUID, + pub num_rows: usize, } impl Debug for Circuit { diff --git a/src/plonkish/ir/sc.rs b/src/plonkish/ir/sc.rs index 6307b00f..bba229a0 100644 --- a/src/plonkish/ir/sc.rs +++ b/src/plonkish/ir/sc.rs @@ -218,6 +218,7 @@ mod test { fixed_assignments, id: uuid(), ast_id: uuid(), + num_rows: 0, } } @@ -263,6 +264,7 @@ mod test { fixed_assignments, id: uuid(), ast_id: uuid(), + num_rows: 0, } } From 1f43e4df4d0be77e49b6cb7c5d62dd4ab04cbb71 Mon Sep 17 00:00:00 2001 From: Leo Lara Date: Mon, 15 Jul 2024 12:11:35 +0700 Subject: [PATCH 2/4] Padding for chiquito 2024 (#265) --- src/compiler/compiler.rs | 179 ++++++++++++++++++++++++++---- src/compiler/mod.rs | 7 ++ src/compiler/semantic/analyser.rs | 23 +--- src/compiler/semantic/mod.rs | 7 +- src/compiler/semantic/rules.rs | 28 ++--- src/compiler/setup_inter.rs | 135 +++++++++++++++++----- src/interpreter/frame.rs | 2 +- src/interpreter/mod.rs | 76 +++++++------ src/parser/ast/mod.rs | 72 +++++++----- src/parser/ast/tl.rs | 14 +++ src/plonkish/compiler/mod.rs | 3 +- src/plonkish/compiler/unit.rs | 3 + 12 files changed, 399 insertions(+), 150 deletions(-) diff --git a/src/compiler/compiler.rs b/src/compiler/compiler.rs index 74786a42..98126a94 100644 --- a/src/compiler/compiler.rs +++ b/src/compiler/compiler.rs @@ -10,7 +10,13 @@ use crate::{ }, interpreter::InterpreterTraceGenerator, parser::{ - ast::{debug_sym_factory::DebugSymRefFactory, tl::TLDecl, Identifiable, Identifier}, + ast::{ + debug_sym_factory::DebugSymRefFactory, + expression::Expression, + statement::{Statement, TypedIdDecl}, + tl::TLDecl, + DebugSymRef, Identifiable, Identifier, + }, lang::TLDeclsParser, }, plonkish::{self, compiler::PlonkishCompilationResult}, @@ -21,7 +27,7 @@ use crate::{ use super::{ semantic::{SymTable, SymbolCategory}, - setup_inter::{interpret, Setup}, + setup_inter::{interpret, MachineSetup, Setup}, Config, Message, Messages, }; @@ -60,7 +66,10 @@ pub(super) struct Compiler { impl Compiler { /// Creates a configured compiler. - pub fn new(config: Config) -> Self { + pub fn new(mut config: Config) -> Self { + if config.max_steps == 0 { + config.max_steps = 1000; // TODO: organise this better + } Compiler { config, ..Compiler::default() @@ -76,6 +85,7 @@ impl Compiler { let ast = self .parse(source, debug_sym_ref_factory) .map_err(|_| self.messages.clone())?; + let ast = self.add_virtual(ast); let symbols = self.semantic(&ast).map_err(|_| self.messages.clone())?; let setup = Self::interpret(&ast, &symbols); let setup = Self::map_consts(setup); @@ -87,8 +97,12 @@ impl Compiler { circuit }; - let circuit = - circuit.with_trace(InterpreterTraceGenerator::new(ast, symbols, self.mapping)); + let circuit = circuit.with_trace(InterpreterTraceGenerator::new( + ast, + symbols, + self.mapping, + self.config.max_steps, + )); Ok(CompilerResult { messages: self.messages, @@ -114,6 +128,113 @@ impl Compiler { } } + fn add_virtual( + &mut self, + mut ast: Vec>, + ) -> Vec> { + for tldc in ast.iter_mut() { + match tldc { + TLDecl::MachineDecl { + dsym, + id: _, + input_params: _, + output_params, + block, + } => self.add_virtual_to_machine(dsym, output_params, block), + } + } + + ast + } + + fn add_virtual_to_machine( + &mut self, + dsym: &DebugSymRef, + output_params: &Vec>, + block: &mut Statement, + ) { + let dsym = DebugSymRef::into_virtual(dsym); + let output_params = Self::get_decls(output_params); + + if let Statement::Block(_, stmts) = block { + let mut has_final = false; + + for stmt in stmts.iter() { + if let Statement::StateDecl(_, id, _) = stmt + && id.name() == "final" + { + has_final = true + } + } + if !has_final { + stmts.push(Statement::StateDecl( + dsym.clone(), + Identifier::new("final", dsym.clone()), + Box::new(Statement::Block(dsym.clone(), vec![])), + )); + } + + let final_state = Self::find_state_mut("final", stmts).unwrap(); + + let mut padding_transitions = output_params + .iter() + .map(|output_signal| { + Statement::SignalAssignmentAssert( + dsym.clone(), + vec![output_signal.id.next()], + vec![Expression::Query::( + dsym.clone(), + output_signal.id.clone(), + )], + ) + }) + .collect::>(); + + padding_transitions.push(Statement::Transition( + dsym.clone(), + Identifier::new("__padding", dsym.clone()), + Box::new(Statement::Block(dsym.clone(), vec![])), + )); + + Self::add_virtual_to_state(final_state, padding_transitions.clone()); + + stmts.push(Statement::StateDecl( + dsym.clone(), + Identifier::new("__padding", dsym.clone()), + Box::new(Statement::Block(dsym.clone(), padding_transitions)), + )); + } // Semantic analyser must show an error in the else case + } + + fn find_state_mut>( + state_id: S, + stmts: &mut [Statement], + ) -> Option<&mut Statement> { + let state_id = state_id.into(); + let mut final_state: Option<&mut Statement> = None; + + for stmt in stmts.iter_mut() { + if let Statement::StateDecl(_, id, _) = stmt + && id.name() == state_id + { + final_state = Some(stmt) + } + } + + final_state + } + + fn add_virtual_to_state( + state: &mut Statement, + add_statements: Vec>, + ) { + if let Statement::StateDecl(_, _, final_state_stmts) = state { + if let Statement::Block(_, stmts) = final_state_stmts.as_mut() { + stmts.extend(add_statements) + } + } + } + fn semantic(&mut self, ast: &[TLDecl]) -> Result { let result = super::semantic::analyser::analyse(ast); let has_errors = result.messages.has_errors(); @@ -127,26 +248,26 @@ impl Compiler { } } - fn interpret( - ast: &[TLDecl], - symbols: &SymTable, - ) -> Setup { + fn interpret(ast: &[TLDecl], symbols: &SymTable) -> Setup { interpret(ast, symbols) } - fn map_consts(setup: Setup) -> Setup { + fn map_consts(setup: Setup) -> Setup { setup .iter() .map(|(machine_id, machine)| { - let new_machine: HashMap>> = machine - .iter() + let poly_constraints: HashMap>> = machine + .iter_states_poly_constraints() .map(|(step_id, step)| { - let new_step = step.iter().map(|pi| Self::map_pi_consts(pi)).collect(); + let new_step: Vec> = + step.iter().map(|pi| Self::map_pi_consts(pi)).collect(); (step_id.clone(), new_step) }) .collect(); + let new_machine: MachineSetup = + machine.replace_poly_constraints(poly_constraints); (machine_id.clone(), new_machine) }) .collect() @@ -166,17 +287,17 @@ impl Compiler { } } - fn build( - &mut self, - setup: &Setup, - symbols: &SymTable, - ) -> SBPIR { + fn build(&mut self, setup: &Setup, symbols: &SymTable) -> SBPIR { circuit::("circuit", |ctx| { for (machine_id, machine) in setup { self.add_forwards(ctx, symbols, machine_id); self.add_step_type_handlers(ctx, symbols, machine_id); - for state_id in machine.keys() { + ctx.pragma_num_steps(self.config.max_steps); + ctx.pragma_first_step(self.mapping.get_step_type_handler(machine_id, "initial")); + ctx.pragma_last_step(self.mapping.get_step_type_handler(machine_id, "__padding")); + + for state_id in machine.states() { ctx.step_type_def( self.mapping.get_step_type_handler(machine_id, state_id), |ctx| { @@ -239,11 +360,15 @@ impl Compiler { fn translate_queries( &mut self, symbols: &SymTable, - setup: &Setup, + setup: &Setup, machine_id: &str, state_id: &str, ) -> Vec, ()>> { - let exprs = setup.get(machine_id).unwrap().get(state_id).unwrap(); + let exprs = setup + .get(machine_id) + .unwrap() + .get_poly_constraints(state_id) + .unwrap(); exprs .iter() @@ -465,6 +590,18 @@ impl Compiler { } } } + + fn get_decls(stmts: &Vec>) -> Vec> { + let mut result: Vec> = vec![]; + + for stmt in stmts { + if let Statement::SignalDecl(_, ids) = stmt { + result.extend(ids.clone()) + } + } + + result + } } // Basic signal factory. diff --git a/src/compiler/mod.rs b/src/compiler/mod.rs index 5cd5f1f8..2475f8fc 100644 --- a/src/compiler/mod.rs +++ b/src/compiler/mod.rs @@ -19,6 +19,7 @@ mod setup_inter; #[derive(Default)] pub struct Config { pub(self) max_degree: Option, + pub(self) max_steps: usize, } impl Config { @@ -27,6 +28,12 @@ impl Config { self } + + pub fn max_steps(mut self, steps: usize) -> Self { + self.max_steps = steps; + + self + } } /// Compiler message. diff --git a/src/compiler/semantic/analyser.rs b/src/compiler/semantic/analyser.rs index 8a6abb55..3664608d 100644 --- a/src/compiler/semantic/analyser.rs +++ b/src/compiler/semantic/analyser.rs @@ -181,25 +181,6 @@ impl Analyser { } else { unreachable!("the parser should produce machine declaration with a block"); } - - if self - .symbols - .get_symbol(&self.cur_scope, "final".to_string()) - .is_none() - { - let id = Identifier("final".to_string(), 0, block.get_dsym()); - let stmt = Statement::StateDecl( - block.get_dsym(), - id.clone(), - Box::new(Statement::Block(block.get_dsym(), vec![])), - ); - - let sym = SymTableEntry::new(id.name(), block.get_dsym(), SymbolCategory::State, None); - - RULES.apply_new_symbol_statement(self, &stmt, &id, &sym); - - self.symbols.add_symbol(&self.cur_scope, id.name(), sym); - } } fn analyse_state(&mut self, id: Identifier, block: Statement) { @@ -406,7 +387,7 @@ mod test { assert_eq!( format!("{:?}", result), - r#"AnalysisResult { symbols: "/": ScopeTable { symbols: "\"fibo\": SymTableEntry { id: \"fibo\", definition_ref: DebugSymRef { line: 2, cols: \"17-21\" }, usages: [], category: Machine, ty: None }", scope: Global },"//fibo": ScopeTable { symbols: "\"a\": SymTableEntry { id: \"a\", definition_ref: DebugSymRef { line: 5, cols: \"20-21\" }, usages: [DebugSymRef { line: 13, cols: \"17-18\" }, DebugSymRef { line: 16, cols: \"15-17\" }, DebugSymRef { line: 23, cols: \"20-21\" }, DebugSymRef { line: 31, cols: \"20-22\" }], category: Signal, ty: Some(\"field\") },\"b\": SymTableEntry { id: \"b\", definition_ref: DebugSymRef { line: 2, cols: \"40-41\" }, usages: [DebugSymRef { line: 13, cols: \"20-21\" }, DebugSymRef { line: 16, cols: \"30-31\" }, DebugSymRef { line: 16, cols: \"19-21\" }, DebugSymRef { line: 23, cols: \"24-25\" }, DebugSymRef { line: 27, cols: \"20-22\" }, DebugSymRef { line: 31, cols: \"42-43\" }, DebugSymRef { line: 31, cols: \"24-26\" }], category: OutputSignal, ty: Some(\"field\") },\"final\": SymTableEntry { id: \"final\", definition_ref: DebugSymRef { start: \"2:50\", end: \"40:13\" }, usages: [DebugSymRef { line: 26, cols: \"18-23\" }], category: State, ty: None },\"i\": SymTableEntry { id: \"i\", definition_ref: DebugSymRef { line: 5, cols: \"30-31\" }, usages: [DebugSymRef { line: 13, cols: \"14-15\" }, DebugSymRef { line: 25, cols: \"17-18\" }, DebugSymRef { line: 27, cols: \"31-32\" }, DebugSymRef { line: 27, cols: \"16-18\" }, DebugSymRef { line: 31, cols: \"35-36\" }, DebugSymRef { line: 31, cols: \"16-18\" }], category: Signal, ty: None },\"initial\": SymTableEntry { id: \"initial\", definition_ref: DebugSymRef { line: 10, cols: \"19-26\" }, usages: [], category: State, ty: None },\"middle\": SymTableEntry { id: \"middle\", definition_ref: DebugSymRef { line: 20, cols: \"19-25\" }, usages: [DebugSymRef { line: 15, cols: \"17-23\" }, DebugSymRef { line: 30, cols: \"18-24\" }], category: State, ty: None },\"n\": SymTableEntry { id: \"n\", definition_ref: DebugSymRef { line: 2, cols: \"29-30\" }, usages: [DebugSymRef { line: 16, cols: \"36-37\" }, DebugSymRef { line: 16, cols: \"23-25\" }, DebugSymRef { line: 25, cols: \"26-27\" }, DebugSymRef { line: 27, cols: \"41-42\" }, DebugSymRef { line: 27, cols: \"24-26\" }, DebugSymRef { line: 31, cols: \"48-49\" }, DebugSymRef { line: 31, cols: \"28-30\" }], category: InputSignal, ty: None }", scope: Machine },"//fibo/final": ScopeTable { symbols: "", scope: State },"//fibo/initial": ScopeTable { symbols: "\"c\": SymTableEntry { id: \"c\", definition_ref: DebugSymRef { line: 11, cols: \"21-22\" }, usages: [DebugSymRef { line: 13, cols: \"23-24\" }, DebugSymRef { line: 16, cols: \"33-34\" }], category: Signal, ty: None }", scope: State },"//fibo/middle": ScopeTable { symbols: "\"c\": SymTableEntry { id: \"c\", definition_ref: DebugSymRef { line: 21, cols: \"21-22\" }, usages: [DebugSymRef { line: 23, cols: \"14-15\" }, DebugSymRef { line: 27, cols: \"38-39\" }, DebugSymRef { line: 31, cols: \"45-46\" }], category: Signal, ty: None }", scope: State }, messages: [] }"# - ) + r#"AnalysisResult { symbols: /: ScopeTable { symbols: "fibo: SymTableEntry { id: \"fibo\", definition_ref: nofile:2:17, usages: [], category: Machine, ty: None }", scope: Global },//fibo: ScopeTable { symbols: "a: SymTableEntry { id: \"a\", definition_ref: nofile:5:20, usages: [nofile:13:17, nofile:16:15, nofile:23:20, nofile:31:20], category: Signal, ty: Some(\"field\") },b: SymTableEntry { id: \"b\", definition_ref: nofile:2:40, usages: [nofile:13:20, nofile:16:30, nofile:16:19, nofile:23:24, nofile:27:20, nofile:31:42, nofile:31:24], category: OutputSignal, ty: Some(\"field\") },i: SymTableEntry { id: \"i\", definition_ref: nofile:5:30, usages: [nofile:13:14, nofile:25:17, nofile:27:31, nofile:27:16, nofile:31:35, nofile:31:16], category: Signal, ty: None },initial: SymTableEntry { id: \"initial\", definition_ref: nofile:10:19, usages: [], category: State, ty: None },middle: SymTableEntry { id: \"middle\", definition_ref: nofile:20:19, usages: [nofile:15:17, nofile:30:18], category: State, ty: None },n: SymTableEntry { id: \"n\", definition_ref: nofile:2:29, usages: [nofile:16:36, nofile:16:23, nofile:25:26, nofile:27:41, nofile:27:24, nofile:31:48, nofile:31:28], category: InputSignal, ty: None }", scope: Machine },//fibo/initial: ScopeTable { symbols: "c: SymTableEntry { id: \"c\", definition_ref: nofile:11:21, usages: [nofile:13:23, nofile:16:33], category: Signal, ty: None }", scope: State },//fibo/middle: ScopeTable { symbols: "c: SymTableEntry { id: \"c\", definition_ref: nofile:21:21, usages: [nofile:23:14, nofile:27:38, nofile:31:45], category: Signal, ty: None }", scope: State }, messages: [] }"# + ); } } diff --git a/src/compiler/semantic/mod.rs b/src/compiler/semantic/mod.rs index 0d6a6d8b..47d08aaa 100644 --- a/src/compiler/semantic/mod.rs +++ b/src/compiler/semantic/mod.rs @@ -156,7 +156,7 @@ impl Debug for ScopeTable { .symbols .keys() .sorted() - .map(|id| format!("\"{}\": {:?}", id, self.symbols[id])) + .map(|id| format!("{}: {:?}", id, self.symbols[id])) .collect::>() .join(","); @@ -232,7 +232,7 @@ impl Debug for SymTable { .scopes .keys() .sorted() - .map(|scope| format!("\"{}\": {:?}", scope, self.scopes[scope])) + .map(|scope| format!("{}: {:?}", scope, self.scopes[scope])) .collect::>() .join(","); @@ -531,8 +531,6 @@ mod test { let test_cases = [ (396, "a"), (397, "a"), - (395, "final"), - (398, "final"), (460, "a"), (584, "a"), (772, "a"), @@ -566,6 +564,7 @@ mod test { ]; for (offset, expected_id) in test_cases { + println!("{} {}", offset, expected_id); let SymTableEntry { id, .. } = result .symbols .find_symbol_by_offset("some".to_string(), offset) diff --git a/src/compiler/semantic/rules.rs b/src/compiler/semantic/rules.rs index f3bc8207..5bf846e8 100644 --- a/src/compiler/semantic/rules.rs +++ b/src/compiler/semantic/rules.rs @@ -479,7 +479,7 @@ mod test { assert_eq!( format!("{:?}", result.messages), - r#"[SemErr { msg: "use of undeclared variable a", dsym: DebugSymRef { line: 23, cols: "20-21" } }]"# + r#"[SemErr { msg: "use of undeclared variable a", dsym: nofile:23:20 }]"# ) } @@ -536,7 +536,7 @@ mod test { assert_eq!( format!("{:?}", result.messages), - r#"[SemErr { msg: "There cannot be rotation in identifier declaration of fibo", dsym: DebugSymRef { start: "2:9", end: "40:13" } }]"# + r#"[SemErr { msg: "There cannot be rotation in identifier declaration of fibo", dsym: nofile:2:9 }]"# ); let circuit = " @@ -589,7 +589,7 @@ mod test { assert_eq!( format!("{:?}", result.messages), - r#"[SemErr { msg: "There cannot be rotation in identifier declaration of initial", dsym: DebugSymRef { start: "10:12", end: "18:14" } }]"# + r#"[SemErr { msg: "There cannot be rotation in identifier declaration of initial", dsym: nofile:10:12 }]"# ); let circuit = " @@ -642,7 +642,7 @@ mod test { assert_eq!( format!("{:?}", result.messages), - r#"[SemErr { msg: "There cannot be rotation in identifier declaration of c", dsym: DebugSymRef { line: 11, cols: "13-23" } }]"# + r#"[SemErr { msg: "There cannot be rotation in identifier declaration of c", dsym: nofile:11:13 }]"# ) } @@ -703,7 +703,7 @@ mod test { assert_eq!( format!("{:?}", result.messages), - r#"[SemErr { msg: "Cannot declare state nested here", dsym: DebugSymRef { start: "13:17", end: "15:18" } }]"# + r#"[SemErr { msg: "Cannot declare state nested here", dsym: nofile:13:17 }]"# ); let circuit = " @@ -760,7 +760,7 @@ mod test { assert_eq!( format!("{:?}", result.messages), - r#"[SemErr { msg: "Cannot declare state nested here", dsym: DebugSymRef { start: "18:1", end: "20:29" } }]"# + r#"[SemErr { msg: "Cannot declare state nested here", dsym: nofile:18:1 }]"# ); } @@ -818,7 +818,7 @@ mod test { assert_eq!( format!("{:?}", result.messages), - r#"[SemErr { msg: "Cannot assign with <-- or <== to variable wrong with category WGVar, you can only assign to signals. Use = instead.", dsym: DebugSymRef { line: 14, cols: "14-50" } }]"# + r#"[SemErr { msg: "Cannot assign with <-- or <== to variable wrong with category WGVar, you can only assign to signals. Use = instead.", dsym: nofile:14:14 }]"# ); } @@ -878,7 +878,7 @@ mod test { assert_eq!( format!("{:?}", result.messages), - r#"[SemErr { msg: "Cannot use wgvar wrong in statement assert wrong == 3;", dsym: DebugSymRef { line: 24, cols: "14-32" } }, SemErr { msg: "Cannot use wgvar wrong in statement [c] <== [(a + b) + wrong];", dsym: DebugSymRef { line: 26, cols: "14-34" } }]"# + r#"[SemErr { msg: "Cannot use wgvar wrong in statement assert wrong == 3;", dsym: nofile:24:14 }, SemErr { msg: "Cannot use wgvar wrong in statement [c] <== [(a + b) + wrong];", dsym: nofile:26:14 }]"# ) } @@ -943,7 +943,7 @@ mod test { assert_eq!( format!("{:?}", result.messages), - r#"[SemErr { msg: "Cannot declare [i, a, b, c] <== [1, 1, 1, 2]; in the machine, only states, wgvars and signals are allowed", dsym: DebugSymRef { start: "2:9", end: "48:13" } }, SemErr { msg: "Cannot declare if (i + 1) == n { [a] <-- [3]; } else { [b] <== [3]; } in the machine, only states, wgvars and signals are allowed", dsym: DebugSymRef { start: "2:9", end: "48:13" } }]"# + r#"[SemErr { msg: "Cannot declare [i, a, b, c] <== [1, 1, 1, 2]; in the machine, only states, wgvars and signals are allowed", dsym: nofile:2:9 }, SemErr { msg: "Cannot declare if (i + 1) == n { [a] <-- [3]; } else { [b] <== [3]; } in the machine, only states, wgvars and signals are allowed", dsym: nofile:2:9 }]"# ); } @@ -1009,7 +1009,7 @@ mod test { assert_eq!( format!("{:?}", result.messages), - r#"[SemErr { msg: "Cannot redeclare middle in the same scope [\"/\", \"fibo\"]", dsym: DebugSymRef { start: "28:13", end: "43:14" } }, SemErr { msg: "Cannot redeclare n in the same scope [\"/\", \"fibo\"]", dsym: DebugSymRef { line: 20, cols: "13-22" } }, SemErr { msg: "Cannot redeclare c in the same scope [\"/\", \"fibo\", \"middle\"]", dsym: DebugSymRef { line: 30, cols: "14-23" } }]"# + r#"[SemErr { msg: "Cannot redeclare middle in the same scope [\"/\", \"fibo\"]", dsym: nofile:28:13 }, SemErr { msg: "Cannot redeclare n in the same scope [\"/\", \"fibo\"]", dsym: nofile:20:13 }, SemErr { msg: "Cannot redeclare c in the same scope [\"/\", \"fibo\", \"middle\"]", dsym: nofile:30:14 }]"# ); } @@ -1066,7 +1066,7 @@ mod test { assert_eq!( format!("{:?}", result.messages), - r#"[SemErr { msg: "Cannot declare n with type uint, only field and bool are allowed.", dsym: DebugSymRef { line: 2, cols: "22-36" } }, SemErr { msg: "Cannot declare c with type int, only field and bool are allowed.", dsym: DebugSymRef { line: 21, cols: "14-28" } }]"# + r#"[SemErr { msg: "Cannot declare n with type uint, only field and bool are allowed.", dsym: nofile:2:22 }, SemErr { msg: "Cannot declare c with type int, only field and bool are allowed.", dsym: nofile:21:14 }]"# ); } @@ -1132,7 +1132,7 @@ mod test { assert_eq!( format!("{:?}", result.messages), - r#"[SemErr { msg: "Cannot use true in expression 2 + true", dsym: DebugSymRef { line: 15, cols: "42-46" } }, SemErr { msg: "Cannot use true in expression 1 * true", dsym: DebugSymRef { line: 32, cols: "24-28" } }, SemErr { msg: "Cannot use false in expression false - 123", dsym: DebugSymRef { line: 32, cols: "31-36" } }, SemErr { msg: "Cannot use false in expression false * false", dsym: DebugSymRef { line: 32, cols: "50-55" } }, SemErr { msg: "Cannot use false in expression false * false", dsym: DebugSymRef { line: 32, cols: "58-63" } }]"# + r#"[SemErr { msg: "Cannot use true in expression 2 + true", dsym: nofile:15:42 }, SemErr { msg: "Cannot use true in expression 1 * true", dsym: nofile:32:24 }, SemErr { msg: "Cannot use false in expression false - 123", dsym: nofile:32:31 }, SemErr { msg: "Cannot use false in expression false * false", dsym: nofile:32:50 }, SemErr { msg: "Cannot use false in expression false * false", dsym: nofile:32:58 }]"# ); } @@ -1209,7 +1209,7 @@ mod test { assert_eq!( format!("{:?}", result.messages), - r#"[SemErr { msg: "Condition i + 1 in if statement must be a logic expression", dsym: DebugSymRef { start: "36:14", end: "53:15" } }, SemErr { msg: "Signal c in if statement condition must be bool", dsym: DebugSymRef { start: "37:17", end: "39:18" } }, SemErr { msg: "Condition 4 in if statement must be a logic expression", dsym: DebugSymRef { start: "43:17", end: "45:18" } }]"# + r#"[SemErr { msg: "Condition i + 1 in if statement must be a logic expression", dsym: nofile:36:14 }, SemErr { msg: "Signal c in if statement condition must be bool", dsym: nofile:37:17 }, SemErr { msg: "Condition 4 in if statement must be a logic expression", dsym: nofile:43:17 }]"# ); } @@ -1270,7 +1270,7 @@ mod test { assert_eq!( format!("{:?}", result.messages), - r#"[SemErr { msg: "Cannot assign with = to Signal i, you can only assign to WGVars. Use <-- or <== instead.", dsym: DebugSymRef { line: 15, cols: "14-20" } }]"# + r#"[SemErr { msg: "Cannot assign with = to Signal i, you can only assign to WGVars. Use <-- or <== instead.", dsym: nofile:15:14 }]"# ); } } diff --git a/src/compiler/setup_inter.rs b/src/compiler/setup_inter.rs index 4c3120ff..8647b8c5 100644 --- a/src/compiler/setup_inter.rs +++ b/src/compiler/setup_inter.rs @@ -1,18 +1,20 @@ use std::collections::HashMap; +use itertools::Itertools; use num_bigint::BigInt; use crate::{ - parser::ast::{statement::Statement, tl::TLDecl, DebugSymRef, Identifiable, Identifier}, + parser::ast::{ + statement::{Statement, TypedIdDecl}, + tl::TLDecl, + DebugSymRef, Identifiable, Identifier, + }, poly::Expr, }; use super::{abepi::CompilationUnit, semantic::SymTable}; -pub(super) fn interpret( - ast: &[TLDecl], - _symbols: &SymTable, -) -> Setup { +pub(super) fn interpret(ast: &[TLDecl], _symbols: &SymTable) -> Setup { let mut interpreter = SetupInterpreter { abepi: CompilationUnit::default(), setup: Setup::default(), @@ -25,12 +27,99 @@ pub(super) fn interpret( interpreter.setup } -pub(super) type Setup = HashMap>>>; +pub(super) type Setup = HashMap>; -pub(super) struct SetupInterpreter { +pub(super) struct MachineSetup { + poly_constraints: HashMap>>, + + input_signals: Vec>, + output_signals: Vec>, +} + +impl Default for MachineSetup { + fn default() -> Self { + Self { + poly_constraints: HashMap::new(), + input_signals: vec![], + output_signals: vec![], + } + } +} + +impl MachineSetup { + fn new( + inputs: Vec>, + outputs: Vec>, + ) -> Self { + let mut created = Self::default(); + + for input in inputs { + if let Statement::SignalDecl(_, ids) = input { + created.input_signals.extend(ids) + } + } + + for output in outputs { + if let Statement::SignalDecl(_, ids) = output { + created.output_signals.extend(ids) + } + } + + created + } + + fn new_state>(&mut self, id: S) { + self.poly_constraints.insert(id.into(), vec![]); + } + + fn _has_state>(&self, id: S) -> bool { + self.poly_constraints.contains_key(&id.into()) + } + + fn add_poly_constraints>( + &mut self, + state: S, + poly_constraints: Vec>, + ) { + self.poly_constraints + .get_mut(&state.into()) + .unwrap() + .extend(poly_constraints); + } + + pub(super) fn iter_states_poly_constraints( + &self, + ) -> std::collections::hash_map::Iter>> { + self.poly_constraints.iter() + } + + pub(super) fn replace_poly_constraints( + &self, + poly_constraints: HashMap>>, + ) -> MachineSetup { + MachineSetup { + poly_constraints, + input_signals: self.input_signals.clone(), + output_signals: self.output_signals.clone(), + } + } + + pub(super) fn states(&self) -> Vec<&String> { + self.poly_constraints.keys().collect_vec() + } + + pub(super) fn get_poly_constraints>( + &self, + state: S, + ) -> Option<&Vec>> { + self.poly_constraints.get(&state.into()) + } +} + +struct SetupInterpreter { abepi: CompilationUnit, - setup: Setup, + setup: Setup, current_machine: String, current_state: String, @@ -52,24 +141,18 @@ impl SetupInterpreter { fn interpret_machine( &mut self, - dsym: &DebugSymRef, + _dsym: &DebugSymRef, id: &Identifier, - _input_params: &[Statement], - _output_params: &[Statement], + input_params: &[Statement], + output_params: &[Statement], block: &Statement, ) { self.current_machine = id.name(); - self.setup.insert(id.name(), HashMap::default()); + self.setup.insert( + id.name(), + MachineSetup::new(input_params.to_owned(), output_params.to_owned()), + ); self.interpret_machine_statement(block); - - // There is a final state that is empty by default - if !self.setup.get(&id.name()).unwrap().contains_key("final") { - self.interpret_state_decl( - dsym, - &Identifier::new("final", dsym.clone()), - &Statement::Block(dsym.clone(), vec![]), - ) - } } fn interpret_machine_statement(&mut self, stmt: &Statement) { @@ -97,7 +180,7 @@ impl SetupInterpreter { self.setup .get_mut(&self.current_machine) .unwrap() - .insert(id.name(), Vec::default()); + .new_state(id.name()); self.interpret_state_statement(stmt); } @@ -122,15 +205,13 @@ impl SetupInterpreter { SignalDecl(_, _) | WGVarDecl(_, _) => vec![], }; - self.add_pis(result.into_iter().map(|cr| cr.anti_booly).collect()); + self.add_poly_constraints(result.into_iter().map(|cr| cr.anti_booly).collect()); } - fn add_pis(&mut self, pis: Vec>) { + fn add_poly_constraints(&mut self, pis: Vec>) { self.setup .get_mut(&self.current_machine) .unwrap() - .get_mut(&self.current_state) - .unwrap() - .extend(pis); + .add_poly_constraints(&self.current_state, pis); } } diff --git a/src/interpreter/frame.rs b/src/interpreter/frame.rs index 35d11a37..7050755b 100644 --- a/src/interpreter/frame.rs +++ b/src/interpreter/frame.rs @@ -127,7 +127,7 @@ impl<'a, F: Field + Hash> StackFrame<'a, F> { self.enter_state("initial"); } - fn enter_state>(&mut self, next_state: S) { + pub(super) fn enter_state>(&mut self, next_state: S) { self.cur_state = next_state.into(); self.lex_scope.push(self.cur_state.clone()); self.scopes diff --git a/src/interpreter/mod.rs b/src/interpreter/mod.rs index 94bb3394..71c0d043 100644 --- a/src/interpreter/mod.rs +++ b/src/interpreter/mod.rs @@ -22,15 +22,17 @@ mod value; struct Interpreter<'a, F: Field + Hash> { mapping: &'a SymbolSignalMapping, cur_frame: StackFrame<'a, F>, + num_steps: usize, witness: Vec>, } impl<'a, F: Field + Hash> Interpreter<'a, F> { - fn new(symbols: &'a SymTable, mapping: &'a SymbolSignalMapping) -> Self { + fn new(symbols: &'a SymTable, mapping: &'a SymbolSignalMapping, num_steps: usize) -> Self { Self { mapping, cur_frame: StackFrame::new(symbols), + num_steps, witness: Vec::default(), } } @@ -88,17 +90,20 @@ impl<'a, F: Field + Hash> Interpreter<'a, F> { ); } - while next_state.is_some() { - next_state = self.exec_step(dsym, &machine_block)?; + while next_state.is_some() && self.witness.len() < self.num_steps { + next_state = self.exec_step(&machine_block)?; self.transition(&next_state); - if next_state.is_none() && self.cur_frame.get_state().as_str() != "final" { - panic!( - "last state is not final state but {}", - self.cur_frame.get_state() - ); - } + println!("{}", self.witness.len()) + } + + self.cur_frame.enter_state("__padding"); + + while self.witness.len() <= self.num_steps { + self.exec_step(&machine_block)?; + self.transition(&Some("__padding".to_string())); + println!("{}", self.witness.len()) } Ok(()) @@ -106,10 +111,9 @@ impl<'a, F: Field + Hash> Interpreter<'a, F> { fn exec_step( &mut self, - machine_dsym: &DebugSymRef, machine_block: &[Statement], ) -> Result, Message> { - let state_decl = self.find_state_decl(machine_dsym, machine_block).unwrap(); + let state_decl = self.find_state_decl(machine_block).unwrap(); if let Statement::StateDecl(_, _, block) = state_decl { if let Statement::Block(_, stmts) = *block { @@ -220,7 +224,6 @@ impl<'a, F: Field + Hash> Interpreter<'a, F> { fn find_state_decl( &mut self, - machine_dsym: &DebugSymRef, machine_block: &[Statement], ) -> Option> { for stmt in machine_block { @@ -231,16 +234,7 @@ impl<'a, F: Field + Hash> Interpreter<'a, F> { } } - // final state can be omited - if self.cur_frame.get_state() == "final" { - Some(Statement::StateDecl( - machine_dsym.clone(), - Identifier::new(self.cur_frame.get_state(), machine_dsym.clone()), - Box::new(Statement::Block(machine_dsym.clone(), vec![])), - )) - } else { - None - } + None } } @@ -252,9 +246,10 @@ pub fn run( program: &[TLDecl], symbols: &SymTable, mapping: &SymbolSignalMapping, + num_steps: usize, input: HashMap, ) -> Result, Message> { - let mut inter = Interpreter::::new(symbols, mapping); + let mut inter = Interpreter::::new(symbols, mapping, num_steps); inter.run(program, input) } @@ -265,6 +260,7 @@ pub struct InterpreterTraceGenerator { program: Vec>, symbols: SymTable, mapping: SymbolSignalMapping, + num_steps: usize, } impl InterpreterTraceGenerator { @@ -272,11 +268,13 @@ impl InterpreterTraceGenerator { program: Vec>, symbols: SymTable, mapping: SymbolSignalMapping, + num_steps: usize, ) -> Self { Self { program, symbols, mapping, + num_steps, } } @@ -299,7 +297,14 @@ impl TraceGenerator for InterpreterTraceGenerator { type TraceArgs = HashMap; fn generate(&self, args: Self::TraceArgs) -> TraceWitness { - run(&self.program, &self.symbols, &self.mapping, args).unwrap_or_else(|msgs| { + run( + &self.program, + &self.symbols, + &self.mapping, + self.num_steps, + args, + ) + .unwrap_or_else(|msgs| { panic!("errors when running wg interpreter: {:?}", msgs); }) } @@ -383,8 +388,12 @@ mod test { } "; - let compiled = - compile::(code, Config::default(), &DebugSymRefFactory::new("", code)).unwrap(); + let compiled = compile::( + code, + Config::default().max_steps(20), + &DebugSymRefFactory::new("", code), + ) + .unwrap(); let result = compiled .circuit @@ -439,10 +448,12 @@ mod test { } "; - let mut chiquito = - compile::(code, Config::default(), &DebugSymRefFactory::new("", code)).unwrap(); - - chiquito.circuit.num_steps = 12; + let chiquito = compile::( + code, + Config::default().max_steps(20), + &DebugSymRefFactory::new("", code), + ) + .unwrap(); let mut plonkish = chiquito.plonkish(config( SingleRowCellManager {}, @@ -467,6 +478,7 @@ mod test { halo2_prover.get_vk(), instance, ); + assert!(result.is_ok()); } @@ -515,11 +527,9 @@ mod test { } "; - let mut chiquito = + let chiquito = compile::(code, Config::default(), &DebugSymRefFactory::new("", code)).unwrap(); - chiquito.circuit.num_steps = 12; - // TODO: re-stablish evil witness // chiquito // .wit_gen diff --git a/src/parser/ast/mod.rs b/src/parser/ast/mod.rs index 1656e2de..9a855436 100644 --- a/src/parser/ast/mod.rs +++ b/src/parser/ast/mod.rs @@ -12,16 +12,36 @@ pub mod tl; #[derive(Clone)] pub struct DebugSymRef { /// Starting byte number in the file - pub start: usize, + start: usize, /// Ending byte number in the file - pub end: usize, + end: usize, /// Source file reference file: Arc>, + /// Virtual: created by the compiler, not present in source code + virt: bool, } impl DebugSymRef { pub fn new(start: usize, end: usize, file: Arc>) -> DebugSymRef { - DebugSymRef { start, end, file } + DebugSymRef { + start, + end, + file, + virt: false, + } + } + + /// Convert to virtual: created by the compiler, not present in source code. + pub fn into_virtual(other: &DebugSymRef) -> DebugSymRef { + let mut other = other.clone(); + other.virt = true; + + other + } + + /// Returns whether it is virtual: created by the compiler, not present in source code. + pub fn is_virtual(&self) -> bool { + self.virt } fn get_column_number(&self, line_index: usize, start: usize) -> usize { @@ -61,12 +81,12 @@ impl DebugSymRef { self.get_column_number(line_idx, self.start) } - fn get_line_end(&self) -> usize { + pub fn get_line_end(&self) -> usize { let line_idx = self.get_line_index(self.end); self.get_line_number(line_idx) } - fn get_col_end(&self) -> usize { + pub fn get_col_end(&self) -> usize { let line_idx = self.get_line_index(self.end); self.get_column_number(line_idx, self.end) } @@ -79,7 +99,11 @@ impl DebugSymRef { /// `filename`. The proximity score is calculated as the size of the symbol. /// If the offset is not within the symbol, returns `None`. pub fn proximity_score(&self, filename: &String, offset: usize) -> Option { - if self.get_filename() == *filename && self.start <= offset && offset <= self.end { + if !self.is_virtual() + && self.get_filename() == *filename + && self.start <= offset + && offset <= self.end + { Some(self.end - self.start) } else { None @@ -91,35 +115,21 @@ impl Debug for DebugSymRef { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { if !self.file.name().is_empty() { // Produces clickable output in the terminal - return write!( + write!( f, "{}:{}:{}", self.file.name(), self.get_line_start(), self.get_col_start() - ); - } - - let mut debug_print = f.debug_struct("DebugSymRef"); - - if self.get_line_start() == self.get_line_end() { - debug_print.field("line", &self.get_line_start()).field( - "cols", - &format!("{}-{}", self.get_col_start(), self.get_col_end()), - ); + ) } else { - debug_print - .field( - "start", - &format!("{}:{}", self.get_line_start(), self.get_col_start()), - ) - .field( - "end", - &format!("{}:{}", self.get_line_end(), self.get_col_end()), - ); + write!( + f, + "nofile:{}:{}", + self.get_line_start(), + self.get_col_start() + ) } - - debug_print.finish() } } @@ -142,6 +152,10 @@ impl Identifier { pub(crate) fn debug_sym_ref(&self) -> DebugSymRef { self.2.clone() } + + pub(crate) fn next(&self) -> Self { + Self(self.0.clone(), self.1 + 1, self.2.clone()) + } } impl Debug for Identifier { @@ -213,6 +227,7 @@ mod test { start: 0, end: 1, file: Arc::new(SimpleFile::new("file_path".to_string(), "".to_string())), + virt: false, }; let result = Identifier::new("abc", debug_sym_ref.clone()); @@ -238,6 +253,7 @@ mod test { start: 10, end: 12, file: Arc::new(SimpleFile::new(file_path.clone(), "".to_string())), + virt: false, }; assert_eq!(debug_sym_ref.proximity_score(&file_path, 9), None); diff --git a/src/parser/ast/tl.rs b/src/parser/ast/tl.rs index 91f4b043..4bfa4e68 100644 --- a/src/parser/ast/tl.rs +++ b/src/parser/ast/tl.rs @@ -2,6 +2,20 @@ use std::fmt::Debug; use super::{statement::Statement, DebugSymRef, Identifiable, Identifier}; +pub struct AST(Vec>); + +impl AST { + pub fn machines_iter_mut(&mut self) -> std::slice::IterMut> { + self.0.iter_mut() + } + + pub fn find_machine(&self, id_machine: V) -> Option<&TLDecl> { + self.0.iter().find(|tldecl| match tldecl { + TLDecl::MachineDecl { id, .. } => *id == id_machine, + }) + } +} + #[derive(Clone)] pub enum TLDecl { MachineDecl { diff --git a/src/plonkish/compiler/mod.rs b/src/plonkish/compiler/mod.rs index cacb59ec..50a14d05 100644 --- a/src/plonkish/compiler/mod.rs +++ b/src/plonkish/compiler/mod.rs @@ -84,6 +84,7 @@ pub fn compile_phase1< panic!("Cannot calculate the number of rows"); } unit.num_rows = unit.num_steps * (unit.placement.first_step_height() as usize); + unit.additional_rows = unit.placement.first_step_height() as usize; compile_fixed(ast, &mut unit); @@ -100,7 +101,7 @@ pub fn compile_phase1< unit.selector.clone(), (*v).clone(), AutoTraceGenerator::from(ast), - unit.num_rows, + unit.num_rows + unit.additional_rows, unit.uuid, ) }); diff --git a/src/plonkish/compiler/unit.rs b/src/plonkish/compiler/unit.rs index 0591f774..cbd27888 100644 --- a/src/plonkish/compiler/unit.rs +++ b/src/plonkish/compiler/unit.rs @@ -38,6 +38,8 @@ pub struct CompilationUnit { pub last_step: Option<(Option, Column)>, pub num_rows: usize, + /// Additional rows for the last padding step instance that doesn't have the q_enable = 1 + pub additional_rows: usize, pub polys: Vec>, pub lookups: Vec>, @@ -74,6 +76,7 @@ impl Default for CompilationUnit { last_step: Default::default(), num_rows: Default::default(), + additional_rows: Default::default(), polys: Default::default(), lookups: Default::default(), From 847259d2241286694ad3e60bbad4a372ab9e9831 Mon Sep 17 00:00:00 2001 From: Alex Kuzmin <6849426+alxkzmn@users.noreply.github.com> Date: Wed, 17 Jul 2024 22:27:59 +0800 Subject: [PATCH 3/4] Use real trusted setup instead of a random generator (#272) --- examples/blake2f.rs | 8 ++-- examples/factorial.rs | 11 ++--- examples/fibo_with_padding.rs | 7 ++- examples/fibonacci.rs | 7 ++- examples/keccak.rs | 7 ++- examples/mimc7.rs | 7 ++- examples/poseidon.rs | 7 ++- examples/ptau/hermez-raw-11 | Bin 0 -> 262404 bytes src/frontend/python/mod.rs | 13 ++--- src/interpreter/mod.rs | 14 ++---- src/plonkish/backend/halo2.rs | 87 ++++++++++++++++++++++------------ 11 files changed, 88 insertions(+), 80 deletions(-) create mode 100644 examples/ptau/hermez-raw-11 diff --git a/examples/blake2f.rs b/examples/blake2f.rs index 63a67e74..b459bfba 100644 --- a/examples/blake2f.rs +++ b/examples/blake2f.rs @@ -7,7 +7,7 @@ use chiquito::{ CircuitContext, StepTypeSetupContext, StepTypeWGHandler, }, plonkish::{ - backend::halo2::{halo2_verify, DummyRng, PlonkishHalo2}, + backend::halo2::{halo2_verify, Halo2Provable}, compiler::{ cell_manager::{MaxWidthCellManager, SingleRowCellManager}, config, @@ -19,7 +19,6 @@ use chiquito::{ sbpir::query::Queriable, }; use halo2_proofs::halo2curves::{bn256::Fr, group::ff::PrimeField}; -use rand_chacha::rand_core::block::BlockRng; use std::{fmt::Write, hash::Hash}; pub const IV_LEN: usize = 8; @@ -1479,9 +1478,8 @@ fn main() { let witness = super_circuit.get_mapping().generate(values); - let rng = BlockRng::new(DummyRng {}); - - let halo2_prover = super_circuit.create_halo2_prover(rng); + let params_path = "examples/ptau/hermez-raw-11"; + let halo2_prover = super_circuit.create_halo2_prover(params_path); println!("k={}", halo2_prover.get_k()); let (proof, instance) = halo2_prover.generate_proof(witness); diff --git a/examples/factorial.rs b/examples/factorial.rs index 88e5312c..c9d6beb2 100644 --- a/examples/factorial.rs +++ b/examples/factorial.rs @@ -5,7 +5,7 @@ use chiquito::{ frontend::dsl::{circuit, trace::DSLTraceGenerator}, /* main function for constructing an AST * circuit */ plonkish::{ - backend::halo2::{halo2_verify, DummyRng, PlonkishHalo2}, + backend::halo2::{halo2_verify, Halo2Provable}, compiler::{ cell_manager::SingleRowCellManager, // input for constructing the compiler compile, // input for constructing the compiler @@ -23,7 +23,6 @@ use chiquito::{ poly::ToField, }; use halo2_proofs::halo2curves::bn256::Fr; -use rand_chacha::rand_core::block::BlockRng; const MAX_FACTORIAL: usize = 10; @@ -136,9 +135,9 @@ fn generate + Hash>() -> PlonkishCompilationResult(); - let rng = BlockRng::new(DummyRng {}); + let params_path = "examples/ptau/hermez-raw-11"; - let halo2_prover = plonkish.create_halo2_prover(rng); + let halo2_prover = plonkish.create_halo2_prover(params_path); println!("k={}", halo2_prover.get_k()); let (proof, instance) = @@ -158,9 +157,9 @@ fn main() { } let mut plonkish = generate::(); - let rng = BlockRng::new(DummyRng {}); + let params_path = "examples/ptau/hermez-raw-11"; - let halo2_prover = plonkish.create_halo2_prover(rng); + let halo2_prover = plonkish.create_halo2_prover(params_path); println!("k={}", halo2_prover.get_k()); let (proof, instance) = diff --git a/examples/fibo_with_padding.rs b/examples/fibo_with_padding.rs index 496aae6b..f63b8cba 100644 --- a/examples/fibo_with_padding.rs +++ b/examples/fibo_with_padding.rs @@ -5,7 +5,7 @@ use chiquito::{ frontend::dsl::{circuit, trace::DSLTraceGenerator}, /* main function for constructing an AST * circuit */ plonkish::{ - backend::halo2::{halo2_verify, DummyRng, PlonkishHalo2}, + backend::halo2::{halo2_verify, Halo2Provable}, compiler::{ cell_manager::SingleRowCellManager, // input for constructing the compiler compile, // input for constructing the compiler @@ -23,7 +23,6 @@ use chiquito::{ poly::ToField, }; use halo2_proofs::halo2curves::bn256::Fr; -use rand_chacha::rand_core::block::BlockRng; // This example file extends the rust example file 'fibonacci.rs', // describing usage of multiple steptypes, padding, and exposing signals. @@ -206,9 +205,9 @@ fn fibo_circuit + Hash>( // standard main function for a Halo2 circuit fn main() { let mut plonkish = fibo_circuit::(); - let rng = BlockRng::new(DummyRng {}); + let params_path = "examples/ptau/hermez-raw-11"; - let halo2_prover = plonkish.create_halo2_prover(rng); + let halo2_prover = plonkish.create_halo2_prover(params_path); println!("k={}", halo2_prover.get_k()); let (proof, instance) = diff --git a/examples/fibonacci.rs b/examples/fibonacci.rs index f5661d51..67bb1a14 100644 --- a/examples/fibonacci.rs +++ b/examples/fibonacci.rs @@ -6,7 +6,7 @@ use chiquito::{ * circuit */ plonkish::{ backend::{ - halo2::{halo2_verify, DummyRng, PlonkishHalo2}, + halo2::{halo2_verify, Halo2Provable}, hyperplonk::ChiquitoHyperPlonkCircuit, }, compiler::{ @@ -27,7 +27,6 @@ use chiquito::{ sbpir::SBPIR, }; use halo2_proofs::halo2curves::bn256::Fr; -use rand_chacha::rand_core::block::BlockRng; // the main circuit function: returns the compiled IR of a Chiquito circuit // Generic types F, (), (u64, 64) stand for: @@ -134,9 +133,9 @@ fn fibo_circuit + Hash>() -> FiboReturn { fn main() { let (mut chiquito, _) = fibo_circuit::(); - let rng = BlockRng::new(DummyRng {}); + let params_path = "examples/ptau/hermez-raw-11"; - let halo2_prover = chiquito.create_halo2_prover(rng); + let halo2_prover = chiquito.create_halo2_prover(params_path); println!("k={}", halo2_prover.get_k()); let (proof, instance) = diff --git a/examples/keccak.rs b/examples/keccak.rs index 9637e541..cb491bcd 100644 --- a/examples/keccak.rs +++ b/examples/keccak.rs @@ -3,7 +3,7 @@ use chiquito::{ lb::LookupTable, super_circuit, trace::DSLTraceGenerator, CircuitContext, StepTypeWGHandler, }, plonkish::{ - backend::halo2::{halo2_verify, DummyRng, PlonkishHalo2}, + backend::halo2::{halo2_verify, Halo2Provable}, compiler::{ cell_manager::{MaxWidthCellManager, SingleRowCellManager}, config, @@ -14,7 +14,6 @@ use chiquito::{ poly::ToExpr, sbpir::query::Queriable, }; -use rand_chacha::rand_core::block::BlockRng; use std::{hash::Hash, ops::Neg}; use halo2_proofs::halo2curves::{bn256::Fr, group::ff::PrimeField}; @@ -2254,11 +2253,11 @@ fn main() { let mut super_circuit = keccak_super_circuit::(circuit_param.bytes.len()); - let rng = BlockRng::new(DummyRng {}); + let params_path = "examples/ptau/hermez-raw-11"; let witness = super_circuit.get_mapping().generate(circuit_param); - let halo2_prover = super_circuit.create_halo2_prover(rng); + let halo2_prover = super_circuit.create_halo2_prover(params_path); println!("k={}", halo2_prover.get_k()); let (proof, instance) = halo2_prover.generate_proof(witness); diff --git a/examples/mimc7.rs b/examples/mimc7.rs index 83c0514f..a5c5bd7d 100644 --- a/examples/mimc7.rs +++ b/examples/mimc7.rs @@ -5,7 +5,7 @@ use halo2_proofs::halo2curves::{bn256::Fr, group::ff::PrimeField}; use chiquito::{ frontend::dsl::{lb::LookupTable, super_circuit, trace::DSLTraceGenerator, CircuitContext}, plonkish::{ - backend::halo2::{halo2_verify, DummyRng, PlonkishHalo2}, + backend::halo2::{halo2_verify, Halo2Provable}, compiler::{ cell_manager::SingleRowCellManager, config, step_selector::SimpleStepSelectorBuilder, }, @@ -15,7 +15,6 @@ use chiquito::{ }; use mimc7_constants::ROUND_CONSTANTS; -use rand_chacha::rand_core::block::BlockRng; // MiMC7 always has 91 rounds pub const ROUNDS: usize = 91; @@ -201,11 +200,11 @@ fn main() { let mut super_circuit = mimc7_super_circuit::(); - let rng = BlockRng::new(DummyRng {}); + let params_path = "examples/ptau/hermez-raw-11"; let witness = super_circuit.get_mapping().generate((x_in_value, k_value)); - let halo2_prover = super_circuit.create_halo2_prover(rng); + let halo2_prover = super_circuit.create_halo2_prover(params_path); println!("k={}", halo2_prover.get_k()); let (proof, instance) = halo2_prover.generate_proof(witness); diff --git a/examples/poseidon.rs b/examples/poseidon.rs index 685bcad2..598d8491 100644 --- a/examples/poseidon.rs +++ b/examples/poseidon.rs @@ -1,7 +1,7 @@ use chiquito::{ frontend::dsl::{lb::LookupTable, super_circuit, trace::DSLTraceGenerator, CircuitContext}, plonkish::{ - backend::halo2::{halo2_verify, DummyRng, PlonkishHalo2}, + backend::halo2::{halo2_verify, Halo2Provable}, compiler::{ cell_manager::{MaxWidthCellManager, SingleRowCellManager}, config, @@ -11,7 +11,6 @@ use chiquito::{ }, sbpir::query::Queriable, }; -use rand_chacha::rand_core::block::BlockRng; use std::hash::Hash; @@ -704,9 +703,9 @@ fn main() { let mut super_circuit = poseidon_super_circuit(lens); let witness = super_circuit.get_mapping().generate(values); - let rng = BlockRng::new(DummyRng {}); + let params_path = "examples/ptau/hermez-raw-11"; - let halo2_prover = super_circuit.create_halo2_prover(rng); + let halo2_prover = super_circuit.create_halo2_prover(params_path); println!("k={}", halo2_prover.get_k()); let (proof, instance) = halo2_prover.generate_proof(witness); diff --git a/examples/ptau/hermez-raw-11 b/examples/ptau/hermez-raw-11 new file mode 100644 index 0000000000000000000000000000000000000000..2205b7297824a5a183a80a1988d429d6848e486b GIT binary patch literal 262404 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

|WTpeNn*<=0S`2VFfYFnI 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 z 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

gB;i#1r?>tsogN}W&>t~OmK6FgRZLptcK<* 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

|D{W5sA8&6rFE!X5 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 literal 0 HcmV?d00001 diff --git a/src/frontend/python/mod.rs b/src/frontend/python/mod.rs index 876785ed..5323a838 100644 --- a/src/frontend/python/mod.rs +++ b/src/frontend/python/mod.rs @@ -2,13 +2,12 @@ use pyo3::{ prelude::*, types::{PyDict, PyList, PyLong, PyString}, }; -use rand_chacha::rand_core::block::BlockRng; use crate::{ frontend::dsl::{StepTypeHandler, SuperCircuitContext}, pil::backend::powdr_pil::chiquito2Pil, plonkish::{ - backend::halo2::{chiquito2Halo2, halo2_verify, ChiquitoHalo2, DummyRng, PlonkishHalo2}, + backend::halo2::{chiquito2Halo2, halo2_verify, ChiquitoHalo2, Halo2Provable}, compiler::{ cell_manager::SingleRowCellManager, compile, config, step_selector::SimpleStepSelectorBuilder, PlonkishCompilationResult, @@ -146,9 +145,8 @@ pub fn chiquito_super_circuit_halo2_mock_prover( let super_assignments = mapping_ctx.get_super_assignments(); - let rng = BlockRng::new(DummyRng {}); - - let halo2_prover = super_circuit.create_halo2_prover(rng); + let params_path = "examples/ptau/hermez-raw-11"; + let halo2_prover = super_circuit.create_halo2_prover(params_path); let (proof, instance) = halo2_prover.generate_proof(super_assignments); @@ -182,14 +180,13 @@ pub fn chiquito_halo2_mock_prover(witness_json: &str, rust_id: UUID) { serde_json::from_str(witness_json).expect("Json deserialization to TraceWitness failed."); let (_, compiled, assignment_generator) = rust_id_to_halo2(rust_id); - let rng = BlockRng::new(DummyRng {}); - let mut plonkish = PlonkishCompilationResult { circuit: compiled.plonkish_ir, assignment_generator, }; - let halo2_prover = plonkish.create_halo2_prover(rng); + let params_path = "examples/ptau/hermez-raw-11"; + let halo2_prover = plonkish.create_halo2_prover(params_path); let (proof, instance) = halo2_prover.generate_proof( plonkish diff --git a/src/interpreter/mod.rs b/src/interpreter/mod.rs index 71c0d043..c9730bff 100644 --- a/src/interpreter/mod.rs +++ b/src/interpreter/mod.rs @@ -326,16 +326,15 @@ fn get_block_stmts(stmt: &Statement) -> Vec, params: ParamsKZG, vk: VerifyingKey, pk: ProvingKey, - rng: BlockRng, } /// Halo2 prover @@ -617,7 +618,7 @@ impl> Halo2Prover { } pub fn get_k(&self) -> u32 { - self.setup.k + self.setup.params.k() } } @@ -632,7 +633,7 @@ fn create_prover<'a>( KZGCommitmentScheme, ProverSHPLONK<'a, Bn256>, Challenge255, - BlockRng, + OsRng, Blake2bWrite, G1Affine, Challenge255>, H2cEngine, > { @@ -651,7 +652,7 @@ fn create_prover<'a>( &setup.params, &setup.pk, instance.to_vec(), - setup.rng.clone(), + OsRng, // this rng is used by the prover to generate blinding factors transcript, ) .unwrap() @@ -671,39 +672,68 @@ fn assign_witness>( } } -pub trait PlonkishHalo2> { +pub trait Halo2Provable> { /// Create a Halo2 prover /// /// ### Arguments - /// * `rng` - random number generator + /// * `params_path` - path to trusted setup file /// /// ### Returns /// * a Halo2 prover - fn create_halo2_prover(&mut self, rng: BlockRng) -> Halo2Prover; + fn create_halo2_prover(&mut self, params_path: &str) -> Halo2Prover; + + /// Create a Halo2 test prover. ⚠️ Not for production use! ⚠️ + /// This prover uses a dummy RNG that outputs fixed values. + /// + /// ### Returns + /// * a test Halo2 prover + fn create_test_prover(&mut self) -> Halo2Prover; } -impl + Default> PlonkishHalo2, ChiquitoHalo2> +impl, T: Halo2Compilable> Halo2Provable for T { + fn create_halo2_prover(&mut self, params_path: &str) -> Halo2Prover { + let (circuit, compiled, k) = self.halo2_compile(); + let mut params_fs = File::open(params_path).expect("couldn't load params"); + let mut params = ParamsKZG::::read(&mut params_fs).expect("Failed to read params"); + if params.k() < k { + panic!( + "The provided trusted setup size {} ({params_path}) does not satisfy the circuit size {k}", + params.k(), + ); + } + if params.k() > k { + params.downsize(k); + } + Halo2Prover::new(create_setup(compiled, params), circuit) + } + + fn create_test_prover(&mut self) -> Halo2Prover { + let (circuit, compiled, k) = self.halo2_compile(); + + let params = ParamsKZG::::setup::>(k, BlockRng::new(DummyRng {})); + + Halo2Prover::new(create_setup(compiled, params), circuit) + } +} + +trait Halo2Compilable> { + /// Implementation-specific circuit compilation + fn halo2_compile(&mut self) -> (WG, CompiledCircuit, u32); +} + +impl + Default> Halo2Compilable, ChiquitoHalo2> for PlonkishCompilationResult { - fn create_halo2_prover( - &mut self, - rng: BlockRng, - ) -> Halo2Prover, ChiquitoHalo2> { + fn halo2_compile(&mut self) -> (ChiquitoHalo2, CompiledCircuit, u32) { let mut circuit = ChiquitoHalo2::new(self.circuit.clone()); let (compiled, k) = circuit.compile_middleware(self.circuit.num_rows).unwrap(); - let setup = create_setup(rng, compiled, k); - - Halo2Prover::new(setup, circuit) + (circuit, compiled, k) } } - -impl PlonkishHalo2, ChiquitoHalo2SuperCircuit> +impl Halo2Compilable, ChiquitoHalo2SuperCircuit> for SuperCircuit { - fn create_halo2_prover( - &mut self, - rng: BlockRng, - ) -> Halo2Prover, ChiquitoHalo2SuperCircuit> { + fn halo2_compile(&mut self) -> (ChiquitoHalo2SuperCircuit, CompiledCircuit, u32) { let compiled = self .get_sub_circuits() .iter() @@ -722,24 +752,19 @@ impl PlonkishHalo2, ChiquitoHalo2SuperCirc let (compiled, k) = circuit .compile_middleware(tallest_subcircuit_height) .unwrap(); - let setup = create_setup(rng, compiled, k); - - Halo2Prover::new(setup, circuit) + (circuit, compiled, k) } } -fn create_setup(rng: BlockRng, circuit: CompiledCircuit, k: u32) -> Setup { - let params = ParamsKZG::::setup::>(k, rng.clone()); +fn create_setup(circuit: CompiledCircuit, params: ParamsKZG) -> Setup { let vk = keygen_vk(¶ms, &circuit).expect("keygen_vk should not fail"); let pk = keygen_pk(¶ms, vk.clone(), &circuit).expect("keygen_pk should not fail"); Setup { - k, cs: circuit.cs, params, vk, pk, - rng, } } From a142e84900960b523076d5eeafc8bdbf9bc78d53 Mon Sep 17 00:00:00 2001 From: Alex Kuzmin <6849426+alxkzmn@users.noreply.github.com> Date: Mon, 29 Jul 2024 17:35:36 +0800 Subject: [PATCH 4/4] Remove chiquito2halo2 function in halo2 backend (#276) --- examples/factorial.py | 4 +- examples/fibonacci.py | 4 +- examples/mimc7.py | 2 +- examples/poseidon.py | 239 +++++++++++++--------------- src/frontend/python/chiquito/dsl.py | 16 +- src/frontend/python/mod.rs | 65 ++++---- src/plonkish/backend/halo2.rs | 14 +- src/plonkish/compiler/mod.rs | 3 +- src/plonkish/ir/assignments.rs | 2 +- 9 files changed, 158 insertions(+), 191 deletions(-) diff --git a/examples/factorial.py b/examples/factorial.py index 6963a3f9..8648a87b 100644 --- a/examples/factorial.py +++ b/examples/factorial.py @@ -106,7 +106,7 @@ def test_zero(self): ) assert last_assignments[0] == 0 # i assert last_assignments[1] == 1 # x - factorial.halo2_mock_prover(factorial_witness) + factorial.halo2_mock_prover(factorial_witness, "examples/ptau/hermez-raw-11") def test_basic(self): factorial = Factorial() @@ -116,7 +116,7 @@ def test_basic(self): ) assert last_assignments[0] == 7 # i assert last_assignments[1] == 5040 # x - factorial.halo2_mock_prover(factorial_witness) + factorial.halo2_mock_prover(factorial_witness, "examples/ptau/hermez-raw-11") if __name__ == "__main__": diff --git a/examples/fibonacci.py b/examples/fibonacci.py index be0047b0..371e7414 100644 --- a/examples/fibonacci.py +++ b/examples/fibonacci.py @@ -80,9 +80,9 @@ def trace(self, n): fibo = Fibonacci() fibo_witness = fibo.gen_witness(7) fibo.halo2_mock_prover( - fibo_witness + fibo_witness, "examples/ptau/hermez-raw-11" ) # 2^k specifies the number of PLONKish table rows in Halo2 another_fibo_witness = fibo.gen_witness(4) -fibo.halo2_mock_prover(another_fibo_witness) +fibo.halo2_mock_prover(another_fibo_witness, "examples/ptau/hermez-raw-11") fibo.to_pil(fibo_witness, "FiboCircuit") diff --git a/examples/mimc7.py b/examples/mimc7.py index a23e78c1..68c70c9c 100644 --- a/examples/mimc7.py +++ b/examples/mimc7.py @@ -167,4 +167,4 @@ def mapping(self, x_in_value, k_value): mimc7_super_witness = mimc7.gen_witness(F(1), F(2)) # for key, value in mimc7_super_witness.items(): # print(f"{key}: {str(value)}") -mimc7.halo2_mock_prover(mimc7_super_witness) +mimc7.halo2_mock_prover(mimc7_super_witness, "examples/ptau/hermez-raw-11") diff --git a/examples/poseidon.py b/examples/poseidon.py index 1d81233b..5f8cd5df 100644 --- a/examples/poseidon.py +++ b/examples/poseidon.py @@ -18,14 +18,10 @@ def setup(self): self.pragma_num_steps(self.lens) - self.table = self.new_table( - table() - .add(self.row) - .add(self.value) - ) + self.table = self.new_table(table().add(self.row).add(self.value)) def fixed_gen(self): - for i, round_key in enumerate(self.constants[0:self.lens]): + for i, round_key in enumerate(self.constants[0 : self.lens]): self.assign(i, self.row, F(i)) self.assign(i, self.value, F(round_key)) @@ -41,14 +37,10 @@ def setup(self): self.pragma_num_steps(self.lens) - self.table = self.new_table( - table() - .add(self.row) - .add(self.value) - ) + self.table = self.new_table(table().add(self.row).add(self.value)) def fixed_gen(self): - for i, round_key in enumerate(self.matrix[0:self.lens]): + for i, round_key in enumerate(self.matrix[0 : self.lens]): self.assign(i, self.row, F(i)) self.assign(i, self.value, F(round_key)) @@ -70,19 +62,11 @@ def setup(self): else: self.constr(eq(inputs[i - 1] + constants[i], x_vec[i])) - self.add_lookup( - self.circuit.constants_table - .apply(i) - .apply(constants[i]) - ) + self.add_lookup(self.circuit.constants_table.apply(i).apply(constants[i])) self.constr( eq( - x_vec[i] - * x_vec[i] - * x_vec[i] - * x_vec[i] - * x_vec[i], + x_vec[i] * x_vec[i] * x_vec[i] * x_vec[i] * x_vec[i], sboxs[i], ) ) @@ -91,9 +75,9 @@ def setup(self): m_offset = i * param_t for j in range(0, param_t): self.add_lookup( - self.circuit.matrix_table - .apply(m_offset + j) - .apply(matrix[m_offset + j]) + self.circuit.matrix_table.apply(m_offset + j).apply( + matrix[m_offset + j] + ) ) lc = sboxs[0] * matrix[m_offset] @@ -115,7 +99,9 @@ def wg(self, round_values): self.assign(signal, F(value)) for i in range(0, self.circuit.param_t): - self.assign(self.circuit.constants[i], F(round_values["constant_values"][i])) + self.assign( + self.circuit.constants[i], F(round_values["constant_values"][i]) + ) if i < len(round_values["input_values"]): self.assign(self.circuit.inputs[i], F(round_values["input_values"][i])) else: @@ -139,27 +125,25 @@ def setup(self): for i in range(0, param_t): self.constr(eq(inputs[i] + constants[i], x_vec[i])) - self.constr(eq( - x_vec[i] - * x_vec[i] - * x_vec[i] - * x_vec[i] - * x_vec[i], - sboxs[i], - )) + self.constr( + eq( + x_vec[i] * x_vec[i] * x_vec[i] * x_vec[i] * x_vec[i], + sboxs[i], + ) + ) self.add_lookup( - self.circuit.constants_table - .apply(self.circuit.round * param_t + i) - .apply(constants[i]), + self.circuit.constants_table.apply( + self.circuit.round * param_t + i + ).apply(constants[i]), ) for i in range(0, param_t): m_offset = i * param_t for j in range(0, param_t): self.add_lookup( - self.circuit.matrix_table - .apply(m_offset + j) - .apply(matrix[m_offset + j]), + self.circuit.matrix_table.apply(m_offset + j).apply( + matrix[m_offset + j] + ), ) lc = sboxs[0] * matrix[m_offset] @@ -169,19 +153,16 @@ def setup(self): self.constr(eq(lc, outs[i])) self.transition(eq(outs[i], inputs[i].next())) - self.transition( - eq(self.circuit.round + 1, self.circuit.round.next()) - ) + self.transition(eq(self.circuit.round + 1, self.circuit.round.next())) def wg(self, round_values): - for signal, value in zip( - self.circuit.matrix, - round_values["matrix_values"] - ): + for signal, value in zip(self.circuit.matrix, round_values["matrix_values"]): self.assign(signal, F(value)) for i in range(0, self.circuit.param_t): - self.assign(self.circuit.constants[i], F(round_values["constant_values"][i])) + self.assign( + self.circuit.constants[i], F(round_values["constant_values"][i]) + ) self.assign(self.circuit.inputs[i], F(round_values["input_values"][i])) self.assign(self.circuit.x_vec[i], F(round_values["x_values"][i])) self.assign(self.circuit.sboxs[i], F(round_values["sbox_values"][i])) @@ -205,19 +186,15 @@ def setup(self): for i in range(0, param_t): self.constr(eq(inputs[i] + constants[i], x_vec[i])) self.add_lookup( - self.circuit.constants_table - .apply(self.circuit.round * param_t + i) - .apply(constants[i]), + self.circuit.constants_table.apply( + self.circuit.round * param_t + i + ).apply(constants[i]), ) for i in range(0, param_c): self.constr( eq( - x_vec[i] - * x_vec[i] - * x_vec[i] - * x_vec[i] - * x_vec[i], + x_vec[i] * x_vec[i] * x_vec[i] * x_vec[i] * x_vec[i], sboxs[i], ) ) @@ -226,9 +203,9 @@ def setup(self): m_offset = i * param_t for j in range(0, param_t): self.add_lookup( - self.circuit.matrix_table - .apply(m_offset + j) - .apply(matrix[m_offset + j]), + self.circuit.matrix_table.apply(m_offset + j).apply( + matrix[m_offset + j] + ), ) lc = sboxs[0] * matrix[m_offset] @@ -240,24 +217,21 @@ def setup(self): self.constr(eq(lc, outs[i])) self.transition(eq(outs[i], inputs[i].next())) - self.transition( - eq(self.circuit.round + 1, self.circuit.round.next()) - ) + self.transition(eq(self.circuit.round + 1, self.circuit.round.next())) def wg(self, round_values): - for signal, value in zip( - self.circuit.matrix, - round_values["matrix_values"] - ): + for signal, value in zip(self.circuit.matrix, round_values["matrix_values"]): self.assign(signal, F(value)) for i in range(0, self.circuit.param_t): - self.assign(self.circuit.constants[i], F(round_values["constant_values"][i])) + self.assign( + self.circuit.constants[i], F(round_values["constant_values"][i]) + ) self.assign(self.circuit.inputs[i], F(round_values["input_values"][i])) self.assign(self.circuit.outs[i], F(round_values["out_values"][i])) self.assign(self.circuit.x_vec[i], F(round_values["x_values"][i])) - for i, sbox in enumerate(self.circuit.sboxs[0:self.circuit.param_c]): + for i, sbox in enumerate(self.circuit.sboxs[0 : self.circuit.param_c]): self.assign(sbox, F(round_values["sbox_values"][i])) self.assign(self.circuit.round, F(round_values["round"])) @@ -276,30 +250,28 @@ def setup(self): for i in range(0, param_t): self.constr(eq(inputs[i] + constants[i], x_vec[i])) - self.constr(eq( - x_vec[i] - * x_vec[i] - * x_vec[i] - * x_vec[i] - * x_vec[i], - sboxs[i], - )) + self.constr( + eq( + x_vec[i] * x_vec[i] * x_vec[i] * x_vec[i] * x_vec[i], + sboxs[i], + ) + ) self.add_lookup( - self.circuit.constants_table - .apply(self.circuit.round * param_t + i) - .apply(constants[i]), + self.circuit.constants_table.apply( + self.circuit.round * param_t + i + ).apply(constants[i]), ) for i in range(0, param_t): m_offset = i * param_t for j in range(0, param_t): self.add_lookup( - self.circuit.matrix_table - .apply(m_offset + j) - .apply(matrix[m_offset + j]) + self.circuit.matrix_table.apply(m_offset + j).apply( + matrix[m_offset + j] + ) ) - for i, out in enumerate(outs[0:self.circuit.lens["n_outputs"]]): + for i, out in enumerate(outs[0 : self.circuit.lens["n_outputs"]]): m_offset = i * param_t lc = sboxs[0] * matrix[m_offset] for s in range(1, param_t): @@ -307,22 +279,18 @@ def setup(self): self.constr(eq(lc, out)) def wg(self, round_values): - for signal, value in zip( - self.circuit.matrix, - round_values["matrix_values"] - ): + for signal, value in zip(self.circuit.matrix, round_values["matrix_values"]): self.assign(signal, F(value)) for i in range(0, self.circuit.param_t): - self.assign(self.circuit.constants[i], F(round_values["constant_values"][i])) + self.assign( + self.circuit.constants[i], F(round_values["constant_values"][i]) + ) self.assign(self.circuit.inputs[i], F(round_values["input_values"][i])) self.assign(self.circuit.x_vec[i], F(round_values["x_values"][i])) self.assign(self.circuit.sboxs[i], F(round_values["sbox_values"][i])) - for signal, value in zip( - self.circuit.outs, - round_values["out_values"] - ): + for signal, value in zip(self.circuit.outs, round_values["out_values"]): self.assign(signal, F(value)) self.assign(self.circuit.round, F(round_values["round"])) @@ -340,8 +308,13 @@ def setup(self): assert self.lens["n_inputs"] < self.param_t assert self.lens["n_outputs"] < self.param_t - self.matrix = [self.forward("matrix_" + str(i)) for i in range(0, self.param_t * self.param_t)] - self.constants = [self.forward("constant_" + str(i)) for i in range(0, self.param_t)] + self.matrix = [ + self.forward("matrix_" + str(i)) + for i in range(0, self.param_t * self.param_t) + ] + self.constants = [ + self.forward("constant_" + str(i)) for i in range(0, self.param_t) + ] self.inputs = [self.forward("input_" + str(i)) for i in range(0, self.param_t)] self.outs = [self.forward("output_" + str(i)) for i in range(0, self.param_t)] self.sboxs = [self.forward("sbox_" + str(i)) for i in range(0, self.param_t)] @@ -349,10 +322,18 @@ def setup(self): self.round = self.forward("round") - self.step_first_round = self.step_type(PoseidonStepFirstRound(self, "step_first_round")) - self.step_full_round = self.step_type(PoseidonStepFullRound(self, "step_full_round")) - self.step_partial_round = self.step_type(PoseidonStepPartialRound(self, "step_partial_round")) - self.step_last_round = self.step_type(PoseidonStepLastRound(self, "step_last_round")) + self.step_first_round = self.step_type( + PoseidonStepFirstRound(self, "step_first_round") + ) + self.step_full_round = self.step_type( + PoseidonStepFullRound(self, "step_full_round") + ) + self.step_partial_round = self.step_type( + PoseidonStepPartialRound(self, "step_partial_round") + ) + self.step_last_round = self.step_type( + PoseidonStepLastRound(self, "step_last_round") + ) self.pragma_first_step(self.step_first_round) self.pragma_last_step(self.step_last_round) @@ -382,7 +363,7 @@ def trace(self, values): sbox_values = [] for x_value in x_values: - sbox_values.append(x_value ** 5) + sbox_values.append(x_value**5) outputs = [] for i in range(0, param_t): @@ -408,10 +389,9 @@ def trace(self, values): for i in range(1, int(param_t / 2) + 1): x_values = [ - inputs[j] + constant_values[i * param_t + j] - for j in range(0, param_t) + inputs[j] + constant_values[i * param_t + j] for j in range(0, param_t) ] - sbox_values = [x_value ** 5 for x_value in x_values] + sbox_values = [x_value**5 for x_value in x_values] def method(j): m_offset = j * param_t @@ -420,12 +400,10 @@ def method(j): out_value += sbox_values[s] * matrix_values[m_offset + s] return out_value - outputs = [ - method(j) for j in range(0, param_t) - ] + outputs = [method(j) for j in range(0, param_t)] round_values = { "input_values": inputs, - "constant_values": constant_values[i * param_t:(i + 1) * param_t], + "constant_values": constant_values[i * param_t : (i + 1) * param_t], "matrix_values": matrix_values, "x_values": x_values, "sbox_values": sbox_values, @@ -440,7 +418,7 @@ def method(j): inputs[j] + constant_values[j + int(i + param_f / 2) * param_t] for j in range(0, param_t) ] - sbox_values = [x_value ** 5 for x_value in x_values] + sbox_values = [x_value**5 for x_value in x_values] def method(t): m_offset = t * param_t @@ -451,13 +429,13 @@ def method(t): out_value += x_values[k] * matrix_values[m_offset + k] return out_value - outputs = [ - method(j) for j in range(0, param_t) - ] + outputs = [method(j) for j in range(0, param_t)] round_values = { "input_values": inputs, - "constant_values": constant_values[int(i + param_f / 2) * param_t:int(i + param_f / 2 + 1) * param_t], + "constant_values": constant_values[ + int(i + param_f / 2) * param_t : int(i + param_f / 2 + 1) * param_t + ], "matrix_values": matrix_values, "x_values": x_values, "sbox_values": sbox_values, @@ -469,10 +447,11 @@ def method(t): for i in range(0, int(param_f / 2) - 1): x_values = [ - inputs[j] + constant_values[(i + int(param_f / 2) + param_p) * param_t + j] + inputs[j] + + constant_values[(i + int(param_f / 2) + param_p) * param_t + j] for j in range(0, param_t) ] - sbox_values = [x_value ** 5 for x_value in x_values] + sbox_values = [x_value**5 for x_value in x_values] def method(j): m_offset = j * param_t @@ -481,12 +460,14 @@ def method(j): out_value += sbox_values[s] * matrix_values[m_offset + s] return out_value - outputs = [ - method(j) for j in range(0, param_t) - ] + outputs = [method(j) for j in range(0, param_t)] round_values = { "input_values": inputs, - "constant_values": constant_values[(i + int(param_f / 2) + param_p) * param_t:(i + int(param_f / 2) + param_p + 1) * param_t], + "constant_values": constant_values[ + (i + int(param_f / 2) + param_p) + * param_t : (i + int(param_f / 2) + param_p + 1) + * param_t + ], "matrix_values": matrix_values, "x_values": x_values, "sbox_values": sbox_values, @@ -500,7 +481,7 @@ def method(j): inputs[i] + constant_values[i + (param_p + param_f - 1) * param_t] for i in range(0, param_t) ] - sbox_values = [x_value ** 5 for x_value in x_values] + sbox_values = [x_value**5 for x_value in x_values] def method(i): m_offset = i * param_t @@ -509,15 +490,14 @@ def method(i): out_value += sbox_values[s] * matrix_values[m_offset + s] return out_value - outputs = [ - method(i) - for i in range(0, values["n_outputs"]) - ] + outputs = [method(i) for i in range(0, values["n_outputs"])] print("[poseidon hash] outputs = ", outputs) round_values = { "input_values": inputs, - "constant_values": constant_values[(param_p + param_f - 1) * param_t:(param_p + param_f) * param_t], + "constant_values": constant_values[ + (param_p + param_f - 1) * param_t : (param_p + param_f) * param_t + ], "matrix_values": matrix_values, "x_values": x_values, "sbox_values": sbox_values, @@ -533,9 +513,7 @@ def setup(self): self.constants_circuit = self.sub_circuit( PoseidonConstants(self, n_inputs=n_inputs) ) - self.matrix_circuit = self.sub_circuit( - PoseidonMatrix(self, n_inputs=n_inputs) - ) + self.matrix_circuit = self.sub_circuit(PoseidonMatrix(self, n_inputs=n_inputs)) self.poseidon_circuit = self.sub_circuit( PoseidonCircuit( self, @@ -553,9 +531,7 @@ class Examples: def test_basic(self): # Arrange values = { - "inputs": [ - 1, 1, 1, 1, 1, 1 - ], + "inputs": [1, 1, 1, 1, 1, 1], "n_outputs": 1, } lens = { @@ -567,7 +543,7 @@ def test_basic(self): # Act poseidon = PoseidonSuperCircuit(lens=lens) witness = poseidon.gen_witness(values) - poseidon.halo2_mock_prover(witness) + poseidon.halo2_mock_prover(witness, "examples/ptau/hermez-raw-11") # Assert circuit_trace = list(witness.values())[0] @@ -583,7 +559,8 @@ def test_basic(self): if __name__ == "__main__": x = Examples() for method in [ - method for method in dir(x) + method + for method in dir(x) if callable(getattr(x, method)) if not method.startswith("_") ]: diff --git a/src/frontend/python/chiquito/dsl.py b/src/frontend/python/chiquito/dsl.py index a8b25146..9c8e71ab 100644 --- a/src/frontend/python/chiquito/dsl.py +++ b/src/frontend/python/chiquito/dsl.py @@ -75,7 +75,9 @@ def gen_witness(self: SuperCircuit, *args: Any) -> Dict[int, TraceWitness]: ) # so that we can generate different witness mapping in the next gen_witness() call return super_witness - def halo2_mock_prover(self: SuperCircuit, super_witness: Dict[int, TraceWitness]): + def halo2_mock_prover( + self: SuperCircuit, super_witness: Dict[int, TraceWitness], params_path: str + ): witness_json = {} for rust_id, witness in super_witness.items(): if rust_id not in self.ast.sub_circuits: @@ -84,7 +86,9 @@ def halo2_mock_prover(self: SuperCircuit, super_witness: Dict[int, TraceWitness] ) witness_json[rust_id] = witness.get_witness_json() rust_chiquito.super_circuit_halo2_mock_prover( - list(self.ast.sub_circuits.keys()), witness_json + list(self.ast.sub_circuits.keys()), + witness_json, + params_path, ) @@ -216,19 +220,19 @@ def gen_witness(self: Circuit, *args) -> TraceWitness: def get_ast_json(self: Circuit) -> str: return json.dumps(self.ast, cls=CustomEncoder, indent=4) - def halo2_mock_prover(self: Circuit, witness: TraceWitness): + def halo2_mock_prover(self: Circuit, witness: TraceWitness, params_path: str): if self.rust_id == 0: ast_json: str = self.get_ast_json() - self.rust_id: int = rust_chiquito.ast_to_halo2(ast_json) + self.rust_id: int = rust_chiquito.ast_to_plonkish(ast_json) witness_json: str = witness.get_witness_json() - rust_chiquito.halo2_mock_prover(witness_json, self.rust_id) + rust_chiquito.halo2_mock_prover(witness_json, self.rust_id, params_path) def to_pil( self: Circuit, witness: TraceWitness, circuit_name: str = "Circuit" ) -> str: if self.rust_id == 0: ast_json: str = self.get_ast_json() - self.rust_id: int = rust_chiquito.ast_to_halo2(ast_json) + self.rust_id: int = rust_chiquito.ast_to_plonkish(ast_json) witness_json: str = witness.get_witness_json() rust_chiquito.to_pil(witness_json, self.rust_id, circuit_name) diff --git a/src/frontend/python/mod.rs b/src/frontend/python/mod.rs index 5323a838..c08c6ef5 100644 --- a/src/frontend/python/mod.rs +++ b/src/frontend/python/mod.rs @@ -7,7 +7,7 @@ use crate::{ frontend::dsl::{StepTypeHandler, SuperCircuitContext}, pil::backend::powdr_pil::chiquito2Pil, plonkish::{ - backend::halo2::{chiquito2Halo2, halo2_verify, ChiquitoHalo2, Halo2Provable}, + backend::halo2::{halo2_verify, Halo2Provable}, compiler::{ cell_manager::SingleRowCellManager, compile, config, step_selector::SimpleStepSelectorBuilder, PlonkishCompilationResult, @@ -30,7 +30,7 @@ use std::{cell::RefCell, collections::HashMap, fmt}; type CircuitMapStore = ( SBPIR, - ChiquitoHalo2, + Option>, Option>, ); type CircuitMap = RefCell>; @@ -51,22 +51,25 @@ impl TraceGenerator for PythonTraceGenerator { } /// Parses JSON into `ast::Circuit` and compile. Generates a Rust UUID. Inserts tuple of -/// (`ast::Circuit`, `ChiquitoHalo2`, `AssignmentGenerator`, _) to `CIRCUIT_MAP` with the Rust UUID -/// as the key. Return the Rust UUID to Python. The last field of the tuple, `TraceWitness`, is left -/// as None, for `chiquito_add_witness_to_rust_id` to insert. -pub fn chiquito_ast_to_halo2(ast_json: &str) -> UUID { +/// (`ast::Circuit`, `PlonkishCompilationResult`, `AssignmentGenerator`, _) to `CIRCUIT_MAP` with +/// the Rust UUID as the key. Return the Rust UUID to Python. The last field of the tuple, +/// `TraceWitness`, is left as None, for `chiquito_add_witness_to_rust_id` to insert. +pub fn chiquito_ast_to_plonkish(ast_json: &str) -> UUID { let circuit: SBPIR = serde_json::from_str(ast_json).expect("Json deserialization to Circuit failed."); let config = config(SingleRowCellManager {}, SimpleStepSelectorBuilder {}); let plonkish = compile(config, &circuit); - let chiquito_halo2 = chiquito2Halo2(plonkish.circuit); let uuid = uuid(); CIRCUIT_MAP.with(|circuit_map| { circuit_map.borrow_mut().insert( uuid, - (circuit, chiquito_halo2, plonkish.assignment_generator), + ( + circuit, + Some(plonkish.clone()), + plonkish.assignment_generator, + ), ); }); @@ -83,9 +86,7 @@ pub fn chiquito_ast_map_store(ast_json: &str) -> UUID { let uuid = uuid(); CIRCUIT_MAP.with(|circuit_map| { - circuit_map - .borrow_mut() - .insert(uuid, (circuit, ChiquitoHalo2::default(), None)); + circuit_map.borrow_mut().insert(uuid, (circuit, None, None)); }); uuid @@ -173,27 +174,18 @@ fn rust_id_to_halo2(uuid: UUID) -> CircuitMapStore { }) } -/// Runs `MockProver` for a single circuit given JSON of `TraceWitness` and `rust_id` of the +/// Runs the Halo2 prover for a single circuit given JSON of `TraceWitness` and `rust_id` of the /// circuit. -pub fn chiquito_halo2_mock_prover(witness_json: &str, rust_id: UUID) { +pub fn chiquito_halo2_prover(witness_json: &str, rust_id: UUID, params_path: &str) { let trace_witness: TraceWitness = serde_json::from_str(witness_json).expect("Json deserialization to TraceWitness failed."); - let (_, compiled, assignment_generator) = rust_id_to_halo2(rust_id); - - let mut plonkish = PlonkishCompilationResult { - circuit: compiled.plonkish_ir, - assignment_generator, - }; - - let params_path = "examples/ptau/hermez-raw-11"; - let halo2_prover = plonkish.create_halo2_prover(params_path); + let (_, plonkish, assignment_generator) = rust_id_to_halo2(rust_id); - let (proof, instance) = halo2_prover.generate_proof( - plonkish - .assignment_generator - .unwrap() - .generate(trace_witness), - ); + let halo2_prover = plonkish + .expect("Plonkish compilation is missing") + .create_halo2_prover(params_path); + let (proof, instance) = + halo2_prover.generate_proof(assignment_generator.unwrap().generate(trace_witness)); let result = halo2_verify( proof, @@ -1876,8 +1868,8 @@ fn convert_and_print_trace_witness(json: &PyString) { } #[pyfunction] -fn ast_to_halo2(json: &PyString) -> u128 { - let uuid = chiquito_ast_to_halo2(json.to_str().expect("PyString conversion failed.")); +fn ast_to_plonkish(json: &PyString) -> u128 { + let uuid = chiquito_ast_to_plonkish(json.to_str().expect("PyString conversion failed.")); uuid } @@ -1885,9 +1877,9 @@ fn ast_to_halo2(json: &PyString) -> u128 { #[pyfunction] fn to_pil(witness_json: &PyString, rust_id: &PyLong, circuit_name: &PyString) -> String { let pil = chiquito_ast_to_pil( - witness_json.to_str().expect("PyString convertion failed."), - rust_id.extract().expect("PyLong convertion failed."), - circuit_name.to_str().expect("PyString convertion failed."), + witness_json.to_str().expect("PyString conversion failed."), + rust_id.extract().expect("PyLong conversion failed."), + circuit_name.to_str().expect("PyString conversion failed."), ); println!("{}", pil); @@ -1902,10 +1894,11 @@ fn ast_map_store(json: &PyString) -> u128 { } #[pyfunction] -fn halo2_mock_prover(witness_json: &PyString, rust_id: &PyLong) { - chiquito_halo2_mock_prover( +fn halo2_mock_prover(witness_json: &PyString, rust_id: &PyLong, params_path: &str) { + chiquito_halo2_prover( witness_json.to_str().expect("PyString conversion failed."), rust_id.extract().expect("PyLong conversion failed."), + params_path, ); } @@ -1946,7 +1939,7 @@ fn super_circuit_halo2_mock_prover(rust_ids: &PyList, super_witness: &PyDict) { fn rust_chiquito(_py: Python, m: &PyModule) -> PyResult<()> { m.add_function(wrap_pyfunction!(convert_and_print_ast, m)?)?; m.add_function(wrap_pyfunction!(convert_and_print_trace_witness, m)?)?; - m.add_function(wrap_pyfunction!(ast_to_halo2, m)?)?; + m.add_function(wrap_pyfunction!(ast_to_plonkish, m)?)?; m.add_function(wrap_pyfunction!(to_pil, m)?)?; m.add_function(wrap_pyfunction!(ast_map_store, m)?)?; m.add_function(wrap_pyfunction!(halo2_mock_prover, m)?)?; diff --git a/src/plonkish/backend/halo2.rs b/src/plonkish/backend/halo2.rs index 773b4090..aef4a75c 100644 --- a/src/plonkish/backend/halo2.rs +++ b/src/plonkish/backend/halo2.rs @@ -113,7 +113,7 @@ pub trait Halo2WitnessGenerator { ) -> Vec>>; } -#[derive(Clone, Debug, Default)] +#[derive(Clone, Debug)] pub struct ChiquitoHalo2> { pub debug: bool, @@ -721,7 +721,7 @@ trait Halo2Compilable> { fn halo2_compile(&mut self) -> (WG, CompiledCircuit, u32); } -impl + Default> Halo2Compilable, ChiquitoHalo2> +impl + Clone + Default> Halo2Compilable, ChiquitoHalo2> for PlonkishCompilationResult { fn halo2_compile(&mut self) -> (ChiquitoHalo2, CompiledCircuit, u32) { @@ -737,7 +737,7 @@ impl Halo2Compilable, ChiquitoHalo2SuperCircui let compiled = self .get_sub_circuits() .iter() - .map(|c| chiquito2Halo2((*c).clone())) + .map(|c| ChiquitoHalo2::new(c.clone())) .collect(); let mut circuit = ChiquitoHalo2SuperCircuit::new(compiled); @@ -796,11 +796,3 @@ fn to_halo2_advice( _ => panic!("jarll wrong phase"), } } - -/// LEGACY -#[allow(non_snake_case)] -pub(crate) fn chiquito2Halo2 + Hash>( - circuit: Circuit, -) -> ChiquitoHalo2 { - ChiquitoHalo2::new(circuit) -} diff --git a/src/plonkish/compiler/mod.rs b/src/plonkish/compiler/mod.rs index 50a14d05..7d656f9d 100644 --- a/src/plonkish/compiler/mod.rs +++ b/src/plonkish/compiler/mod.rs @@ -54,7 +54,8 @@ pub fn compile< } } -pub struct PlonkishCompilationResult { +#[derive(Clone)] +pub struct PlonkishCompilationResult> { pub circuit: Circuit, pub assignment_generator: Option>, } diff --git a/src/plonkish/ir/assignments.rs b/src/plonkish/ir/assignments.rs index afc1cae7..711f29f2 100644 --- a/src/plonkish/ir/assignments.rs +++ b/src/plonkish/ir/assignments.rs @@ -94,7 +94,7 @@ pub struct AssignmentGenerator> { ir_id: UUID, } -impl Clone for AssignmentGenerator +impl Clone for AssignmentGenerator where TG: TraceGenerator + Clone, {