diff --git a/co-noir/co-ultrahonk/src/lib.rs b/co-noir/co-ultrahonk/src/lib.rs index b78543a8..ac756818 100644 --- a/co-noir/co-ultrahonk/src/lib.rs +++ b/co-noir/co-ultrahonk/src/lib.rs @@ -1,5 +1,6 @@ pub(crate) mod parse; pub mod prelude; +pub(crate) mod prover; pub(crate) mod types; use ark_ec::pairing::Pairing; diff --git a/co-noir/co-ultrahonk/src/prelude.rs b/co-noir/co-ultrahonk/src/prelude.rs index ed5c6081..eb989702 100644 --- a/co-noir/co-ultrahonk/src/prelude.rs +++ b/co-noir/co-ultrahonk/src/prelude.rs @@ -1,6 +1,7 @@ pub use crate::parse::{ builder_variable::SharedBuilderVariable, CoUltraCircuitBuilder, PlainCoBuilder, Rep3CoBuilder, }; +pub use crate::prover::CoUltraHonk; pub use crate::types::ProvingKey; // Re-exporting the following traits from `ultrahonk`: pub use ultrahonk::prelude::HonkProof; diff --git a/co-noir/co-ultrahonk/src/prover.rs b/co-noir/co-ultrahonk/src/prover.rs new file mode 100644 index 00000000..7a33762e --- /dev/null +++ b/co-noir/co-ultrahonk/src/prover.rs @@ -0,0 +1,38 @@ +use crate::types::ProvingKey; +use mpc_core::traits::PrimeFieldMpcProtocol; +use std::marker::PhantomData; +use ultrahonk::prelude::{ + HonkCurve, HonkProof, HonkProofResult, TranscriptFieldType, TranscriptType, + POSEIDON2_BN254_T4_PARAMS, +}; + +pub struct CoUltraHonk> +where + T: PrimeFieldMpcProtocol, +{ + pub(crate) driver: T, + phantom_data: PhantomData

, +} + +impl> CoUltraHonk +where + T: PrimeFieldMpcProtocol, +{ + pub fn new(driver: T) -> Self { + Self { + driver, + phantom_data: PhantomData, + } + } + + pub fn prove( + &mut self, + proving_key: ProvingKey, + ) -> HonkProofResult> { + tracing::trace!("UltraHonk prove"); + + let mut transcript = TranscriptType::new(&POSEIDON2_BN254_T4_PARAMS); + + todo!("prove"); + } +} diff --git a/co-noir/co-ultrahonk/tests/poseidon.rs b/co-noir/co-ultrahonk/tests/poseidon.rs index 41700707..33b2878c 100644 --- a/co-noir/co-ultrahonk/tests/poseidon.rs +++ b/co-noir/co-ultrahonk/tests/poseidon.rs @@ -1,7 +1,7 @@ use ark_bn254::Bn254; -use co_ultrahonk::prelude::{PlainCoBuilder, ProvingKey, SharedBuilderVariable}; +use co_ultrahonk::prelude::{CoUltraHonk, PlainCoBuilder, ProvingKey, SharedBuilderVariable}; use mpc_core::protocols::plain::PlainDriver; -use ultrahonk::Utils; +use ultrahonk::{prelude::HonkProof, Utils}; #[test] fn poseidon_plaindriver_test() { @@ -24,13 +24,13 @@ fn poseidon_plaindriver_test() { let prover_crs = ProvingKey::get_prover_crs(&builder, CRS_PATH_G1).unwrap(); let proving_key = ProvingKey::create(&driver, builder, prover_crs); - // let proof = UltraHonk::prove(proving_key).unwrap(); - // let proof_u8 = proof.to_buffer(); + let mut prover = CoUltraHonk::new(driver); + let proof = prover.prove(proving_key).unwrap(); + let proof_u8 = proof.to_buffer(); let read_proof_u8 = std::fs::read(PROOF_FILE).unwrap(); - // assert_eq!(proof_u8, read_proof_u8); + assert_eq!(proof_u8, read_proof_u8); - // let read_proof = HonkProof::from_buffer(&read_proof_u8).unwrap(); - // assert_eq!(proof, read_proof); - todo!("WIP") + let read_proof = HonkProof::from_buffer(&read_proof_u8).unwrap(); + assert_eq!(proof, read_proof); } diff --git a/co-noir/ultrahonk/src/poseidon2/poseidon2_bn254.rs b/co-noir/ultrahonk/src/poseidon2/poseidon2_bn254.rs index e3b429ca..5c953233 100644 --- a/co-noir/ultrahonk/src/poseidon2/poseidon2_bn254.rs +++ b/co-noir/ultrahonk/src/poseidon2/poseidon2_bn254.rs @@ -130,5 +130,5 @@ lazy_static! { Utils::field_from_hex_string("0x02fcca2934e046bc623adead873579865d03781ae090ad4a8579d2e7a6800355").unwrap(), Utils::field_from_hex_string("0x0ef915f0ac120b876abccceb344a1d36bad3f3c5ab91a8ddcbec2e060d8befac").unwrap(), ]; - pub(crate) static ref POSEIDON2_BN254_T4_PARAMS: Arc> = Arc::new(Poseidon2Params::new(ROUNDS_F, ROUNDS_P, *MAT_DIAG_M_1, EXTERNAL_RC.to_vec(), INTERNAL_RC.to_vec())); + pub static ref POSEIDON2_BN254_T4_PARAMS: Arc> = Arc::new(Poseidon2Params::new(ROUNDS_F, ROUNDS_P, *MAT_DIAG_M_1, EXTERNAL_RC.to_vec(), INTERNAL_RC.to_vec())); } diff --git a/co-noir/ultrahonk/src/poseidon2/poseidon2_params.rs b/co-noir/ultrahonk/src/poseidon2/poseidon2_params.rs index c3ef10d9..36ee292a 100644 --- a/co-noir/ultrahonk/src/poseidon2/poseidon2_params.rs +++ b/co-noir/ultrahonk/src/poseidon2/poseidon2_params.rs @@ -1,7 +1,7 @@ use ark_ff::PrimeField; #[derive(Clone, Debug)] -pub(crate) struct Poseidon2Params { +pub struct Poseidon2Params { pub(crate) rounds_f_beginning: usize, pub(crate) rounds_f_end: usize, pub(crate) rounds_p: usize, diff --git a/co-noir/ultrahonk/src/prelude.rs b/co-noir/ultrahonk/src/prelude.rs index dc5769ce..405bab15 100644 --- a/co-noir/ultrahonk/src/prelude.rs +++ b/co-noir/ultrahonk/src/prelude.rs @@ -1,11 +1,16 @@ pub use crate::decider::polynomial::Polynomial; +pub use crate::honk_curve::HonkCurve; pub use crate::parse::crs::CrsParser; pub use crate::parse::{ acir_format::AcirFormat, builder::{GenericUltraCircuitBuilder, UltraCircuitBuilder, UltraCircuitVariable}, types::{CycleNode, CyclicPermutation, NUM_SELECTORS, NUM_WIRES}, }; +pub use crate::poseidon2::poseidon2_bn254::POSEIDON2_BN254_T4_PARAMS; +pub use crate::prover::HonkProofResult; pub use crate::prover::UltraHonk; +pub use crate::transcript::TranscriptFieldType; +pub use crate::transcript::TranscriptType; pub use crate::types::PrecomputedEntities; pub use crate::types::ProverCrs; pub use crate::types::{HonkProof, ProvingKey}; diff --git a/co-noir/ultrahonk/src/prover.rs b/co-noir/ultrahonk/src/prover.rs index dfe380a2..8cc15870 100644 --- a/co-noir/ultrahonk/src/prover.rs +++ b/co-noir/ultrahonk/src/prover.rs @@ -10,7 +10,7 @@ use crate::{ use ark_ec::pairing::Pairing; use std::{io, marker::PhantomData}; -pub(crate) type HonkProofResult = std::result::Result; +pub type HonkProofResult = std::result::Result; /// The errors that may arise during the computation of a co-PLONK proof. #[derive(Debug, thiserror::Error)] diff --git a/co-noir/ultrahonk/src/transcript.rs b/co-noir/ultrahonk/src/transcript.rs index fbe67dfd..fe2d9974 100644 --- a/co-noir/ultrahonk/src/transcript.rs +++ b/co-noir/ultrahonk/src/transcript.rs @@ -9,10 +9,10 @@ use ark_ec::AffineRepr; use ark_ff::{PrimeField, Zero}; use std::{collections::BTreeMap, ops::Index, sync::Arc}; -pub(crate) type TranscriptFieldType = ark_bn254::Fr; -pub(crate) type TranscriptType = Poseidon2Transcript; +pub type TranscriptFieldType = ark_bn254::Fr; +pub type TranscriptType = Poseidon2Transcript; -pub(super) struct Poseidon2Transcript +pub struct Poseidon2Transcript where F: PrimeField, { @@ -31,7 +31,7 @@ impl Poseidon2Transcript where F: PrimeField, { - pub(crate) fn new(params: &Arc>) -> Self { + pub fn new(params: &Arc>) -> Self { Self { proof_data: Default::default(), manifest: Default::default(),