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}