You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

198 lines
6.5 KiB

  1. use ark_crypto_primitives::sponge::{poseidon::PoseidonConfig, Absorb};
  2. use ark_ec::{CurveGroup, Group};
  3. use ark_ff::fields::PrimeField;
  4. use ark_poly::{
  5. evaluations::multivariate::multilinear::{MultilinearExtension, SparseMultilinearExtension},
  6. multivariate::{SparsePolynomial, SparseTerm, Term},
  7. univariate::DensePolynomial,
  8. DenseMVPolynomial, DenseUVPolynomial, Polynomial,
  9. };
  10. use ark_std::log2;
  11. use std::marker::PhantomData;
  12. use crate::hypernova::ccs::CCS;
  13. use crate::hypernova::sumcheck::{Point, SumCheck};
  14. use crate::pedersen::Commitment;
  15. use crate::transcript::Transcript;
  16. use ark_std::{One, Zero};
  17. // Committed CCS instance
  18. pub struct CCCS<C: CurveGroup> {
  19. C: Commitment<C>,
  20. x: Vec<C::ScalarField>,
  21. }
  22. // Linearized Committed CCS instance
  23. pub struct LCCCS<C: CurveGroup> {
  24. C: Commitment<C>,
  25. u: C::ScalarField,
  26. x: Vec<C::ScalarField>,
  27. r: Vec<C::ScalarField>,
  28. v: Vec<C::ScalarField>,
  29. }
  30. // NIMFS: Non Interactive Multifolding Scheme
  31. pub struct NIMFS<C: CurveGroup> {
  32. _c: PhantomData<C>,
  33. }
  34. impl<C: CurveGroup> NIMFS<C>
  35. where
  36. <C as Group>::ScalarField: Absorb,
  37. <C as CurveGroup>::BaseField: Absorb,
  38. {
  39. // proof method folds and returns the proof of the multifolding
  40. pub fn proof(
  41. tr: &mut Transcript<C::ScalarField, C>,
  42. poseidon_config: &PoseidonConfig<C::ScalarField>,
  43. ccs: CCS<C::ScalarField>,
  44. lcccs: LCCCS<C>,
  45. cccs: CCCS<C>,
  46. z1: Vec<C::ScalarField>,
  47. z2: Vec<C::ScalarField>,
  48. ) -> LCCCS<C> {
  49. let s = log2(ccs.m) as usize; // s
  50. let s_ = log2(ccs.n) as usize; // s'
  51. let gamma = tr.get_challenge();
  52. let beta = tr.get_challenge_vec(s);
  53. // get MLE of M_i
  54. let mut MLEs: Vec<SparseMultilinearExtension<C::ScalarField>> = Vec::new();
  55. let n_vars = (s + s_) as usize;
  56. for i in 0..ccs.M.len() {
  57. let M_i_MLE = matrix_to_mle(n_vars, ccs.m, ccs.n, &ccs.M[i]);
  58. MLEs.push(M_i_MLE);
  59. }
  60. // get MLE of z1 & z2
  61. let z1_MLE = vector_to_mle(s_, ccs.n, z1);
  62. let z2_MLE = vector_to_mle(s_, ccs.n, z2);
  63. // compute Lj = eq(r_x,x) * \sum Mj * z1
  64. let mut Lj_evals: Vec<(usize, C::ScalarField)> = Vec::new();
  65. for i in 0..s_ {}
  66. // compute Q = eq(beta, x) * ( \sum c_i * \prod( \sum Mj * z1 ) )
  67. // compute g
  68. // let g: SparsePolynomial<C::ScalarField, SparseTerm>;
  69. // let proof = SC::<C>::prove(&poseidon_config, g);
  70. // fold C, u, x, v, w
  71. unimplemented!();
  72. }
  73. }
  74. fn matrix_to_mle<F: PrimeField>(
  75. n_vars: usize, // log2(m) + log2(n)
  76. m: usize,
  77. n: usize,
  78. M: &Vec<Vec<F>>,
  79. ) -> SparseMultilinearExtension<F> {
  80. let mut M_evals: Vec<(usize, F)> = Vec::new();
  81. for i in 0..m {
  82. for j in 0..n {
  83. if !M[i][j].is_zero() {
  84. M_evals.push((i * n + j, M[i][j]));
  85. }
  86. }
  87. }
  88. SparseMultilinearExtension::<F>::from_evaluations(n_vars, M_evals.iter())
  89. }
  90. fn vector_to_mle<F: PrimeField>(s: usize, n: usize, z: Vec<F>) -> SparseMultilinearExtension<F> {
  91. let mut z_evals: Vec<(usize, F)> = Vec::new();
  92. for i in 0..n {
  93. if !z[i].is_zero() {
  94. z_evals.push((i, z[i]));
  95. }
  96. }
  97. SparseMultilinearExtension::<F>::from_evaluations(s, z_evals.iter())
  98. }
  99. type SC<C: CurveGroup> = SumCheck<
  100. C::ScalarField,
  101. C,
  102. DensePolynomial<C::ScalarField>,
  103. SparsePolynomial<C::ScalarField, SparseTerm>,
  104. >;
  105. #[cfg(test)]
  106. mod tests {
  107. use super::*;
  108. use crate::transcript::poseidon_test_config;
  109. use ark_mnt4_298::{Fr, G1Projective};
  110. use ark_std::One;
  111. use ark_std::UniformRand;
  112. use crate::nifs::gen_test_values;
  113. type P = Point<Fr>;
  114. #[test]
  115. fn test_cccs_mles() {
  116. let (r1cs, ws, _) = gen_test_values(2);
  117. let z1: Vec<Fr> = ws[0].clone();
  118. println!("z1 {:?}", z1);
  119. let ccs = r1cs.to_ccs();
  120. let s = log2(ccs.m) as usize; // s
  121. let s_ = log2(ccs.n) as usize; // s'
  122. let pow_s_ = (2 as usize).pow(s_ as u32);
  123. let mut M_MLEs: Vec<SparseMultilinearExtension<Fr>> = Vec::new();
  124. let n_vars = (s + s_) as usize;
  125. for i in 0..ccs.M.len() {
  126. let M_i_MLE = matrix_to_mle(n_vars, ccs.m, ccs.n, &ccs.M[i]);
  127. println!("i:{}, M_i_mle: {:?}", i, M_i_MLE);
  128. M_MLEs.push(M_i_MLE);
  129. }
  130. let z1_MLE = vector_to_mle(s_, ccs.n, z1);
  131. println!("z1_MLE: {:?}", z1_MLE);
  132. let beta = Point::<Fr>::point_normal(s, 2); // imagine that this comes from random
  133. println!("beta: {:?}", beta);
  134. // check Committed CCS relation
  135. let mut r: Fr = Fr::zero();
  136. for i in 0..ccs.q {
  137. let mut prod_res = Fr::one();
  138. // for j in 0..ccs.S.len() {
  139. for j in ccs.S[i].clone() {
  140. let mut Mj_z_eval = Fr::zero();
  141. // for k in 0..s_ {
  142. // over the boolean hypercube un s' vars, but only the combinations that lead to
  143. // some non-zero z()
  144. for k in 0..ccs.n {
  145. // over the whole boolean hypercube on s' vars
  146. // for k in 0..pow_s_ {
  147. let point_in_s_ = Point::<Fr>::point_normal(s_, k);
  148. // println!("point_in_s {:?}", point_in_s_);
  149. let z_eval = z1_MLE.evaluate(&point_in_s_).unwrap();
  150. // println!(" ===================================z_eval {:?}", z_eval);
  151. // let point_in_s_plus_s_ = Point::<Fr>::point_complete(beta.clone(), s + s_, k);
  152. let mut point_in_s_plus_s_ = Point::<Fr>::point_normal(s_, i);
  153. point_in_s_plus_s_.append(&mut beta.clone());
  154. // println!("point_in_s_plus_s_ {:?}", point_in_s_plus_s_);
  155. // println!("j: {}, Mj {:?}", j, M_MLEs[j]);
  156. let Mj_eval = M_MLEs[j].evaluate(&point_in_s_plus_s_).unwrap();
  157. if Mj_eval * z_eval != Fr::zero() {
  158. println!(" j: {}, Mj_eval {:?}", j, Mj_eval);
  159. println!(" z_eval {:?}", z_eval);
  160. println!(" =(Mj*z)_eval {:?}", Mj_eval * z_eval);
  161. }
  162. Mj_z_eval += Mj_eval * z_eval;
  163. }
  164. println!("j: {}, {:?}\n", j, Mj_z_eval);
  165. prod_res += Mj_z_eval;
  166. }
  167. println!("i:{}, c: {:?}, {:?}\n", i, ccs.c[i], prod_res);
  168. r += ccs.c[i] * prod_res;
  169. }
  170. println!("r {:?}", r);
  171. assert!(r.is_zero());
  172. }
  173. }