diff --git a/proof-input/src/merkle_tree/merkle_circuit.rs b/proof-input/src/merkle_tree/merkle_circuit.rs index 5182d99..0bfecef 100644 --- a/proof-input/src/merkle_tree/merkle_circuit.rs +++ b/proof-input/src/merkle_tree/merkle_circuit.rs @@ -1,18 +1,14 @@ use codex_plonky2_circuits::Result; use plonky2::field::extension::Extendable; -use plonky2::field::types::Field; use plonky2::hash::hash_types::{HashOut, HashOutTarget, NUM_HASH_OUT_ELTS, RichField}; use plonky2::iop::witness::{PartialWitness, WitnessWrite}; use plonky2::plonk::circuit_builder::CircuitBuilder; -use plonky2::plonk::config::{AlgebraicHasher, Hasher}; +use plonky2::plonk::config::AlgebraicHasher; use plonky2_poseidon2::poseidon2_hash::poseidon2::Poseidon2; use codex_plonky2_circuits::circuits::merkle_circuit::{MerkleProofTarget, MerkleTreeCircuit, MerkleTreeTargets}; use codex_plonky2_circuits::circuits::serialization::SerializableHashOutTarget; use codex_plonky2_circuits::circuits::utils::{assign_bool_targets, assign_hash_out_targets}; use codex_plonky2_circuits::error::CircuitError; -use crate::utils::usize_to_bits_le; - -use crate::merkle_tree::merkle_safe::MerkleTree; /// the input to the merkle tree circuit #[derive(Clone)] @@ -122,11 +118,15 @@ mod tests { use plonky2::hash::hash_types::HashOut; use plonky2::hash::poseidon::PoseidonHash; use super::*; + use crate::merkle_tree::merkle_safe::MerkleTree; + use plonky2::plonk::config::Hasher; + use crate::utils::usize_to_bits_le; use plonky2::plonk::circuit_data::CircuitConfig; use plonky2::plonk::config::{GenericConfig, PoseidonGoldilocksConfig}; use plonky2::iop::witness::PartialWitness; use plonky2::plonk::circuit_builder::CircuitBuilder; use plonky2_field::goldilocks_field::GoldilocksField; + use plonky2::field::types::Field; #[test] fn test_build_circuit() -> anyhow::Result<()> { diff --git a/proof-input/src/merkle_tree/merkle_safe.rs b/proof-input/src/merkle_tree/merkle_safe.rs index 31b7275..b7d8765 100644 --- a/proof-input/src/merkle_tree/merkle_safe.rs +++ b/proof-input/src/merkle_tree/merkle_safe.rs @@ -3,10 +3,7 @@ // https://github.com/codex-storage/nim-codex/blob/master/codex/merkletree/merkletree.nim use anyhow::{ensure, Result}; -use plonky2::field::goldilocks_field::GoldilocksField; use plonky2::hash::hash_types::{HashOut, RichField}; -use plonky2::hash::poseidon::PoseidonHash; -use plonky2::plonk::config::Hasher; use std::ops::Shr; use plonky2_field::extension::Extendable; use plonky2_poseidon2::poseidon2_hash::poseidon2::Poseidon2; @@ -251,6 +248,9 @@ mod tests { use super::*; use plonky2::field::types::Field; use crate::merkle_tree::key_compress::key_compress; + use plonky2::plonk::config::Hasher; + use plonky2::hash::poseidon::PoseidonHash; + use plonky2::field::goldilocks_field::GoldilocksField; // types used in all tests type F = GoldilocksField; diff --git a/proof-input/src/merkle_tree/test.rs b/proof-input/src/merkle_tree/test.rs index 7c02fdb..ec01e32 100644 --- a/proof-input/src/merkle_tree/test.rs +++ b/proof-input/src/merkle_tree/test.rs @@ -1,31 +1,13 @@ -use plonky2::hash::hash_types::{HashOut, RichField}; -use plonky2_field::extension::Extendable; -use plonky2_poseidon2::poseidon2_hash::poseidon2::Poseidon2; - -fn digest_seq< - F: RichField + Extendable + Poseidon2, - const D: usize, ->(n: usize) -> Vec> { - (0..n) - .map(|i| HashOut { - elements: [ - F::from_canonical_u64((i + 1) as u64), - F::ZERO, - F::ZERO, - F::ZERO, - ], - }) - .collect() -} #[cfg(test)] mod tests { - use super::*; + use plonky2::hash::hash_types::{HashOut, RichField}; + use plonky2_field::extension::Extendable; + use plonky2_poseidon2::poseidon2_hash::poseidon2::Poseidon2; use anyhow::Result; use crate::merkle_tree::merkle_safe::{MerkleProof, MerkleTree}; use plonky2::field::goldilocks_field::GoldilocksField; use plonky2::field::types::Field; - use plonky2::hash::hash_types::HashOut; type F = GoldilocksField; const D: usize = 2; @@ -35,6 +17,22 @@ mod tests { digest: [u64; 4], } + fn digest_seq< + F: RichField + Extendable + Poseidon2, + const D: usize, + >(n: usize) -> Vec> { + (0..n) + .map(|i| HashOut { + elements: [ + F::from_canonical_u64((i + 1) as u64), + F::ZERO, + F::ZERO, + F::ZERO, + ], + }) + .collect() + } + #[test] fn test_merkle_roots() -> Result<()> { let zero = HashOut { diff --git a/proof-input/src/serialization/file_paths.rs b/proof-input/src/serialization/file_paths.rs index ecacefa..5cc4aeb 100644 --- a/proof-input/src/serialization/file_paths.rs +++ b/proof-input/src/serialization/file_paths.rs @@ -1,11 +1,12 @@ /// File constants with full paths - Prover pub const CIRC_INPUT_JSON: &str = "prover_data/input.json"; -pub const PROVER_CIRC_DATA_JSON: &str = "prover_data/prover_circ_data.json"; +pub const PROVER_CIRC_DATA_JSON: &str = "prover_data/prover_circ_data.bin"; pub const TARGETS_JSON: &str = "prover_data/targets.json"; /// File constants with full paths - Verifier -pub const VERIFIER_CIRC_DATA_JSON: &str = "verifier_data/verifier_circ_data.json"; +pub const VERIFIER_CIRC_DATA_JSON: &str = "verifier_data/verifier_circ_data.bin"; pub const PROOF_JSON: &str = "verifier_data/proof.json"; +pub const TREE_PROOF_JSON: &str = "verifier_data/tree_proof.json"; diff --git a/proof-input/src/serialization/json.rs b/proof-input/src/serialization/json.rs index c50b1e2..7ec985d 100644 --- a/proof-input/src/serialization/json.rs +++ b/proof-input/src/serialization/json.rs @@ -1,18 +1,16 @@ -use serde::{Deserialize, Serialize}; +use serde::Serialize; use std::{fs, io}; use std::path::Path; use anyhow::Context; -use crate::gen_input::gen_testing_circuit_input; use plonky2::hash::hash_types::RichField; use plonky2::plonk::circuit_data::{CircuitData, ProverCircuitData, VerifierCircuitData}; use plonky2::plonk::config::{AlgebraicHasher, GenericConfig}; use plonky2_field::extension::Extendable; use plonky2_poseidon2::poseidon2_hash::poseidon2::Poseidon2; -use codex_plonky2_circuits::circuits::sample_cells::SampleCircuitInput; use plonky2::plonk::proof::ProofWithPublicInputs; use serde::de::DeserializeOwned; use plonky2_poseidon2::serialization::{DefaultGateSerializer, DefaultGeneratorSerializer}; -use crate::serialization::file_paths::{PROOF_JSON, PROVER_CIRC_DATA_JSON, TARGETS_JSON, VERIFIER_CIRC_DATA_JSON}; +use crate::serialization::file_paths::{PROOF_JSON, PROVER_CIRC_DATA_JSON, TARGETS_JSON, TREE_PROOF_JSON, VERIFIER_CIRC_DATA_JSON}; /// Writes the provided bytes to the specified file path using `std::fs::write`. pub fn write_bytes_to_file>(data: Vec, path: P) -> io::Result<()> { @@ -141,6 +139,17 @@ pub fn import_targets() -> anyhow::Result Ok(targets) } +/// Function to export tree proof with public input to json file +pub fn export_tree_proof_with_pi( + proof_with_pis: &ProofWithPublicInputs, +) -> anyhow::Result<()> + where + F: RichField + Extendable + Poseidon2 + Serialize, + C: GenericConfig + Serialize, +{ + export_proof_with_pi_to_given_path(proof_with_pis, TREE_PROOF_JSON) +} + /// Function to export proof with public input to json file pub fn export_proof_with_pi( proof_with_pis: &ProofWithPublicInputs, @@ -148,25 +157,39 @@ pub fn export_proof_with_pi( where F: RichField + Extendable + Poseidon2 + Serialize, C: GenericConfig + Serialize, +{ + export_proof_with_pi_to_given_path(proof_with_pis, PROOF_JSON) +} + +/// Function to export proof with public input to json file +/// takes the path +fn export_proof_with_pi_to_given_path( + proof_with_pis: &ProofWithPublicInputs, + path: &str, +) -> anyhow::Result<()> + where + F: RichField + Extendable + Poseidon2 + Serialize, + C: GenericConfig + Serialize, { let proof_serialized= serde_json::to_vec(&proof_with_pis) .map_err(|e| anyhow::anyhow!("Failed to serialize proof with public input: {:?}", e))?; - fs::write(PROOF_JSON , &proof_serialized).expect("Unable to write file"); + fs::write(path , &proof_serialized).expect("Unable to write file"); Ok(()) } #[cfg(test)] mod tests { - use super::*; use crate::params::{C, D, F, HF, Params}; use std::time::Instant; - use codex_plonky2_circuits::circuits::sample_cells::SampleCircuit; + use codex_plonky2_circuits::circuits::sample_cells::{SampleCircuit, SampleCircuitInput}; use plonky2::plonk::circuit_data::{ ProverCircuitData, VerifierCircuitData}; use codex_plonky2_circuits::circuit_helper::Plonky2Circuit; + use codex_plonky2_circuits::circuits::utils::read_bytes_from_file; use plonky2_poseidon2::serialization::{DefaultGateSerializer, DefaultGeneratorSerializer}; - use crate::gen_input::verify_circuit_input; + use crate::gen_input::{gen_testing_circuit_input, verify_circuit_input}; use crate::serialization::circuit_input::{export_circ_input_to_json, generate_and_export_circ_input_to_json, import_circ_input_from_json}; + use crate::serialization::json::{export_proof_with_pi, write_bytes_to_file}; // Test to generate the JSON file #[test]