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.

69 lines
1.7 KiB

  1. use ark_ff::fields::PrimeField;
  2. use crate::nifs::R1CS;
  3. use crate::utils::{hadamard_product, matrix_vector_product, vec_add, vector_elem_product};
  4. pub struct CCS<F: PrimeField> {
  5. pub m: usize,
  6. pub n: usize,
  7. pub t: usize,
  8. pub q: usize,
  9. pub d: usize,
  10. pub S: Vec<Vec<usize>>,
  11. pub c: Vec<F>,
  12. pub M: Vec<Vec<Vec<F>>>,
  13. }
  14. impl<F: PrimeField> R1CS<F> {
  15. pub fn to_ccs(self) -> CCS<F> {
  16. CCS::<F> {
  17. m: self.A.len(),
  18. n: self.A[0].len(),
  19. t: 3,
  20. q: 2,
  21. d: 2,
  22. S: vec![vec![0, 1], vec![2]],
  23. c: vec![F::one(), F::one().neg()],
  24. M: vec![self.A, self.B, self.C],
  25. }
  26. }
  27. }
  28. impl<F: PrimeField> CCS<F> {
  29. pub fn check_relation(self, z: Vec<F>) -> bool {
  30. let mut r: Vec<F> = vec![F::zero(); self.m];
  31. for i in 0..self.q {
  32. let mut hadamard_output = vec![F::one(); self.m];
  33. for j in self.S[i].clone() {
  34. hadamard_output =
  35. hadamard_product(hadamard_output, matrix_vector_product(&self.M[j], &z));
  36. }
  37. r = vec_add(&r, &vector_elem_product(&hadamard_output, &self.c[i]));
  38. }
  39. let zero: Vec<F> = vec![F::zero(); self.m];
  40. r == zero
  41. }
  42. }
  43. #[cfg(test)]
  44. mod tests {
  45. use super::*;
  46. use crate::transcript::poseidon_test_config;
  47. use ark_mnt4_298::{Fr, G1Projective};
  48. use ark_std::One;
  49. use ark_std::UniformRand;
  50. use crate::nifs::gen_test_values;
  51. #[test]
  52. fn test_r1cs_to_ccs() {
  53. let (r1cs, ws, _) = gen_test_values(2);
  54. let w: Vec<Fr> = ws[0].clone();
  55. let ccs = r1cs.to_ccs();
  56. assert!(ccs.check_relation(w));
  57. }
  58. }