dot_product.rs 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. #![allow(non_snake_case)]
  2. use curve25519_dalek::ristretto::RistrettoPoint as G;
  3. use group::Group;
  4. use sigma_compiler::*;
  5. fn dot_product_test_vecsize(vecsize: usize) -> sigma_proofs::errors::Result<()> {
  6. sigma_compiler! { proof,
  7. (vec x, pub vec a),
  8. (C, D, E, F, vec A, B),
  9. C = sum(x*A),
  10. D = sum(a*A),
  11. E = sum(a*x*A),
  12. F = sum(a*x)*B,
  13. F = sum(a*x*B),
  14. }
  15. type Scalar = <G as Group>::Scalar;
  16. let mut rng = rand::thread_rng();
  17. let A: Vec<G> = (0..vecsize).map(|_| G::random(&mut rng)).collect();
  18. let B = G::generator();
  19. let x: Vec<Scalar> = (0..vecsize).map(|_| Scalar::random(&mut rng)).collect();
  20. let a: Vec<Scalar> = (0..vecsize).map(|_| Scalar::random(&mut rng)).collect();
  21. let C: G = (0..vecsize).map(|i| x[i] * A[i]).sum();
  22. let D: G = (0..vecsize).map(|i| a[i] * A[i]).sum();
  23. let E: G = (0..vecsize).map(|i| a[i] * x[i] * A[i]).sum();
  24. let F: G = (0..vecsize).map(|i| a[i] * x[i] * B).sum();
  25. let instance = proof::Instance {
  26. C,
  27. D,
  28. E,
  29. F,
  30. A,
  31. B,
  32. a,
  33. };
  34. let witness = proof::Witness { x };
  35. let proof = proof::prove(&instance, &witness, b"dot_product_test", &mut rng)?;
  36. proof::verify(&instance, &proof, b"dot_product_test")
  37. }
  38. #[test]
  39. fn dot_product_test() {
  40. dot_product_test_vecsize(0).unwrap();
  41. dot_product_test_vecsize(1).unwrap();
  42. dot_product_test_vecsize(2).unwrap();
  43. dot_product_test_vecsize(20).unwrap();
  44. }