diff --git a/co-noir/co-ultrahonk/src/parse/proving_key.rs b/co-noir/co-ultrahonk/src/parse/proving_key.rs index 76164222..7a34693b 100644 --- a/co-noir/co-ultrahonk/src/parse/proving_key.rs +++ b/co-noir/co-ultrahonk/src/parse/proving_key.rs @@ -1,6 +1,7 @@ use super::CoUltraCircuitBuilder; use crate::parse::types::TraceData; use crate::types::Polynomials; +use crate::types::ProverWitnessEntities; use crate::types::ProvingKey; use ark_ec::pairing::Pairing; use ark_ff::One; @@ -9,11 +10,15 @@ use mpc_core::traits::PrimeFieldMpcProtocol; use std::marker::PhantomData; use ultrahonk::prelude::ProverCrs; use ultrahonk::prelude::ProvingKey as PlainProvingKey; +use ultrahonk::prelude::UltraCircuitVariable; impl ProvingKey where T: PrimeFieldMpcProtocol, { + const PUBLIC_INPUT_WIRE_INDEX: usize = + ProverWitnessEntities::::W_R; + // We ignore the TraceStructure for now (it is None in barretenberg for UltraHonk) pub fn create(driver: &T, mut circuit: CoUltraCircuitBuilder, crs: ProverCrs

) -> Self { tracing::info!("ProvingKey create"); @@ -50,17 +55,17 @@ where dyadic_circuit_size, ); - todo!("ProvingKey pubinput"); // Construct the public inputs array - // let public_wires_src = proving_key.polynomials.witness.w_r(); - - // for input in public_wires_src - // .iter() - // .skip(proving_key.pub_inputs_offset as usize) - // .take(proving_key.num_public_inputs as usize) - // { - // proving_key.public_inputs.push(*input); - // } + let block = circuit.blocks.get_pub_inputs(); + assert!(block.is_pub_inputs); + for var_idx in block.wires[Self::PUBLIC_INPUT_WIRE_INDEX] + .iter() + .take(proving_key.num_public_inputs as usize) + .cloned() + { + let var = circuit.get_variable(var_idx as usize); + proving_key.public_inputs.push(var.public_into_field()); + } // TODO the following elements are not part of the proving key so far // Set the recursive proof indices diff --git a/co-noir/co-ultrahonk/src/types.rs b/co-noir/co-ultrahonk/src/types.rs index a057736d..90254dad 100644 --- a/co-noir/co-ultrahonk/src/types.rs +++ b/co-noir/co-ultrahonk/src/types.rs @@ -57,7 +57,7 @@ pub(crate) struct ProverWitnessEntities { impl ProverWitnessEntities { const W_L: usize = 0; // column 0 - const W_R: usize = 1; // column 1 + pub(crate) const W_R: usize = 1; // column 1 const W_O: usize = 2; // column 2 const W_4: usize = 3; // column 3 (modified by prover) diff --git a/co-noir/ultrahonk/src/parse/types.rs b/co-noir/ultrahonk/src/parse/types.rs index 72d8dc0e..0406b319 100644 --- a/co-noir/ultrahonk/src/parse/types.rs +++ b/co-noir/ultrahonk/src/parse/types.rs @@ -148,6 +148,10 @@ impl UltraTraceBlocks { &self.poseidon_internal, ] } + + pub fn get_pub_inputs(&self) -> &T { + &self.pub_inputs + } } pub const NUM_WIRES: usize = 4;