arnaucube
arnaucube/sonobePublic Self-hosted repository
sonobe/folding-schemes/src/utils/mod.rs
folding-schemes/src/utils/mod.rsRaw
  1use ark_crypto_primitives::sponge::poseidon::PoseidonConfig;
  2use ark_ec::{AffineRepr, CurveGroup};
  3use ark_ff::PrimeField;
  4use ark_serialize::CanonicalSerialize;
  5use ark_std::Zero;
  6use sha3::{Digest, Sha3_256};
  7
  8use crate::arith::Arith;
  9use crate::commitment::CommitmentScheme;
 10use crate::Error;
 11
 12pub mod gadgets;
 13pub mod hypercube;
 14pub mod lagrange_poly;
 15pub mod mle;
 16pub mod vec;
 17
 18// expose espresso local modules
 19pub mod espresso;
 20pub use crate::utils::espresso::multilinear_polynomial;
 21pub use crate::utils::espresso::sum_check;
 22pub use crate::utils::espresso::virtual_polynomial;
 23
 24/// For a given x, returns [1, x^1, x^2, ..., x^n-1];
 25pub fn powers_of<F: PrimeField>(x: F, n: usize) -> Vec<F> {
 26    let mut c: Vec<F> = vec![F::zero(); n];
 27    c[0] = F::one();
 28    for i in 1..n {
 29        c[i] = c[i - 1] * x;
 30    }
 31    c
 32}
 33
 34/// returns the coordinates of a commitment point. This is compatible with the arkworks
 35/// GC.to_constraint_field()[..2]
 36pub fn get_cm_coordinates<C: CurveGroup>(cm: &C) -> Vec<C::BaseField> {
 37    let zero = (&C::BaseField::zero(), &C::BaseField::zero());
 38    let cm = cm.into_affine();
 39    let (cm_x, cm_y) = cm.xy().unwrap_or(zero);
 40    vec![*cm_x, *cm_y]
 41}
 42
 43/// returns the hash of the given public parameters of the Folding Scheme
 44pub fn pp_hash<C1, C2, CS1, CS2>(
 45    arith: &impl Arith<C1::ScalarField>,
 46    cf_arith: &impl Arith<C2::ScalarField>,
 47    cs_vp: &CS1::VerifierParams,
 48    cf_cs_vp: &CS2::VerifierParams,
 49    poseidon_config: &PoseidonConfig<C1::ScalarField>,
 50) -> Result<C1::ScalarField, Error>
 51where
 52    C1: CurveGroup,
 53    C2: CurveGroup,
 54    CS1: CommitmentScheme<C1>,
 55    CS2: CommitmentScheme<C2>,
 56{
 57    let mut hasher = Sha3_256::new();
 58
 59    // Fr & Fq modulus bit size
 60    hasher.update(C1::ScalarField::MODULUS_BIT_SIZE.to_le_bytes());
 61    hasher.update(C2::ScalarField::MODULUS_BIT_SIZE.to_le_bytes());
 62    // AugmentedFCircuit Arith params
 63    hasher.update(arith.params_to_bytes());
 64    // CycleFold Circuit Arith params
 65    hasher.update(cf_arith.params_to_bytes());
 66    // cs_vp & cf_cs_vp (commitments setup)
 67    let mut cs_vp_bytes = Vec::new();
 68    cs_vp.serialize_uncompressed(&mut cs_vp_bytes)?;
 69    hasher.update(cs_vp_bytes);
 70    let mut cf_cs_vp_bytes = Vec::new();
 71    cf_cs_vp.serialize_uncompressed(&mut cf_cs_vp_bytes)?;
 72    hasher.update(cf_cs_vp_bytes);
 73    // poseidon params
 74    let mut poseidon_config_bytes = Vec::new();
 75    poseidon_config
 76        .full_rounds
 77        .serialize_uncompressed(&mut poseidon_config_bytes)?;
 78    poseidon_config
 79        .partial_rounds
 80        .serialize_uncompressed(&mut poseidon_config_bytes)?;
 81    poseidon_config
 82        .alpha
 83        .serialize_uncompressed(&mut poseidon_config_bytes)?;
 84    poseidon_config
 85        .ark
 86        .serialize_uncompressed(&mut poseidon_config_bytes)?;
 87    poseidon_config
 88        .mds
 89        .serialize_uncompressed(&mut poseidon_config_bytes)?;
 90    poseidon_config
 91        .rate
 92        .serialize_uncompressed(&mut poseidon_config_bytes)?;
 93    poseidon_config
 94        .capacity
 95        .serialize_uncompressed(&mut poseidon_config_bytes)?;
 96    hasher.update(poseidon_config_bytes);
 97
 98    let public_params_hash = hasher.finalize();
 99    Ok(C1::ScalarField::from_le_bytes_mod_order(
100        &public_params_hash,
101    ))
102}