use ark_crypto_primitives::sponge::poseidon::PoseidonConfig; use ark_ec::{AffineRepr, CurveGroup}; use ark_ff::PrimeField; use ark_serialize::CanonicalSerialize; use ark_std::Zero; use sha3::{Digest, Sha3_256}; use crate::arith::Arith; use crate::commitment::CommitmentScheme; use crate::Error; pub mod gadgets; pub mod hypercube; pub mod lagrange_poly; pub mod mle; pub mod vec; // expose espresso local modules pub mod espresso; pub use crate::utils::espresso::multilinear_polynomial; pub use crate::utils::espresso::sum_check; pub use crate::utils::espresso::virtual_polynomial; /// For a given x, returns [1, x^1, x^2, ..., x^n-1]; pub fn powers_of(x: F, n: usize) -> Vec { let mut c: Vec = vec![F::zero(); n]; c[0] = F::one(); for i in 1..n { c[i] = c[i - 1] * x; } c } /// returns the coordinates of a commitment point. This is compatible with the arkworks /// GC.to_constraint_field()[..2] pub fn get_cm_coordinates(cm: &C) -> Vec { let zero = (&C::BaseField::zero(), &C::BaseField::zero()); let cm = cm.into_affine(); let (cm_x, cm_y) = cm.xy().unwrap_or(zero); vec![*cm_x, *cm_y] } /// returns the hash of the given public parameters of the Folding Scheme pub fn pp_hash( arith: &impl Arith, cf_arith: &impl Arith, cs_vp: &CS1::VerifierParams, cf_cs_vp: &CS2::VerifierParams, poseidon_config: &PoseidonConfig, ) -> Result where C1: CurveGroup, C2: CurveGroup, CS1: CommitmentScheme, CS2: CommitmentScheme, { let mut hasher = Sha3_256::new(); // Fr & Fq modulus bit size hasher.update(C1::ScalarField::MODULUS_BIT_SIZE.to_le_bytes()); hasher.update(C2::ScalarField::MODULUS_BIT_SIZE.to_le_bytes()); // AugmentedFCircuit Arith params hasher.update(arith.params_to_bytes()); // CycleFold Circuit Arith params hasher.update(cf_arith.params_to_bytes()); // cs_vp & cf_cs_vp (commitments setup) let mut cs_vp_bytes = Vec::new(); cs_vp.serialize_uncompressed(&mut cs_vp_bytes)?; hasher.update(cs_vp_bytes); let mut cf_cs_vp_bytes = Vec::new(); cf_cs_vp.serialize_uncompressed(&mut cf_cs_vp_bytes)?; hasher.update(cf_cs_vp_bytes); // poseidon params let mut poseidon_config_bytes = Vec::new(); poseidon_config .full_rounds .serialize_uncompressed(&mut poseidon_config_bytes)?; poseidon_config .partial_rounds .serialize_uncompressed(&mut poseidon_config_bytes)?; poseidon_config .alpha .serialize_uncompressed(&mut poseidon_config_bytes)?; poseidon_config .ark .serialize_uncompressed(&mut poseidon_config_bytes)?; poseidon_config .mds .serialize_uncompressed(&mut poseidon_config_bytes)?; poseidon_config .rate .serialize_uncompressed(&mut poseidon_config_bytes)?; poseidon_config .capacity .serialize_uncompressed(&mut poseidon_config_bytes)?; hasher.update(poseidon_config_bytes); let public_params_hash = hasher.finalize(); Ok(C1::ScalarField::from_le_bytes_mod_order( &public_params_hash, )) }