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.

148 lines
3.7 KiB

  1. use ark_ec::AffineRepr;
  2. use ark_std::{
  3. rand::{Rng, RngCore},
  4. UniformRand,
  5. };
  6. use std::marker::PhantomData;
  7. use crate::transcript::Transcript;
  8. use crate::utils::naive_msm;
  9. pub struct Proof<C: AffineRepr> {
  10. R: C,
  11. t1: C::ScalarField,
  12. t2: C::ScalarField,
  13. }
  14. pub struct Params<C: AffineRepr> {
  15. g: C,
  16. h: C,
  17. }
  18. pub struct Pedersen<C: AffineRepr> {
  19. _phantom: PhantomData<C>,
  20. }
  21. impl<C: AffineRepr> Pedersen<C> {
  22. pub fn new_params<R: Rng>(rng: &mut R) -> Params<C> {
  23. let h_scalar = C::ScalarField::rand(rng);
  24. let g: C = C::generator();
  25. let params: Params<C> = Params::<C> {
  26. g,
  27. h: g.mul(h_scalar).into(),
  28. };
  29. params
  30. }
  31. pub fn commit_elem<R: RngCore>(
  32. rng: &mut R,
  33. params: &Params<C>,
  34. v: &C::ScalarField,
  35. ) -> Commitment<C> {
  36. let r = C::ScalarField::rand(rng);
  37. let cm: C = (params.g.mul(v) + params.h.mul(r)).into();
  38. Commitment::<C> { cm, r }
  39. }
  40. pub fn commit_vec<R: RngCore>(
  41. rng: &mut R,
  42. params: &Params<C>,
  43. v: &Vec<C::ScalarField>,
  44. ) -> CommitmentVec<C> {
  45. let r: Vec<C> = vec![C::rand(rng); v.len()]; // wip
  46. let cm = naive_msm(v, &r);
  47. CommitmentVec::<C> { cm, r }
  48. }
  49. pub fn prove(
  50. params: &Params<C>,
  51. transcript: &mut Transcript<C::ScalarField>,
  52. cm: C,
  53. v: C::ScalarField,
  54. r: C::ScalarField,
  55. ) -> Proof<C> {
  56. let s1 = transcript.get_challenge(b"s_1");
  57. let s2 = transcript.get_challenge(b"s_2");
  58. let R: C = (params.g.mul(s1) + params.h.mul(s2)).into();
  59. transcript.add(b"cm", &cm);
  60. transcript.add(b"R", &R);
  61. let c = transcript.get_challenge(b"c");
  62. let t1 = s1 + v * c;
  63. let t2 = s2 + r * c;
  64. Proof::<C> { R, t1, t2 }
  65. }
  66. pub fn verify(
  67. params: &Params<C>,
  68. transcript: &mut Transcript<C::ScalarField>,
  69. cm: C,
  70. proof: Proof<C>,
  71. ) -> bool {
  72. // s1, s2 just to match Prover's transcript
  73. transcript.get_challenge(b"s_1");
  74. transcript.get_challenge(b"s_2");
  75. transcript.add(b"cm", &cm);
  76. transcript.add(b"R", &proof.R);
  77. let c = transcript.get_challenge(b"c");
  78. let lhs = proof.R + cm.mul(c);
  79. let rhs = params.g.mul(proof.t1) + params.h.mul(proof.t2);
  80. if lhs != rhs {
  81. return false;
  82. }
  83. true
  84. }
  85. }
  86. pub struct CommitmentVec<C: AffineRepr> {
  87. // WIP
  88. pub cm: C,
  89. pub r: Vec<C>,
  90. }
  91. pub struct Commitment<C: AffineRepr> {
  92. pub cm: C,
  93. pub r: C::ScalarField,
  94. }
  95. impl<C: AffineRepr> Commitment<C> {
  96. pub fn prove(
  97. &self,
  98. params: &Params<C>,
  99. transcript: &mut Transcript<C::ScalarField>,
  100. v: C::ScalarField,
  101. ) -> Proof<C> {
  102. Pedersen::<C>::prove(params, transcript, self.cm, v, self.r)
  103. }
  104. }
  105. #[cfg(test)]
  106. mod tests {
  107. use super::*;
  108. use ark_bn254::{g1::G1Affine, Fr};
  109. use ark_ec::CurveGroup;
  110. use std::ops::Mul;
  111. #[test]
  112. fn test_pedersen() {
  113. let mut rng = ark_std::test_rng();
  114. // setup params
  115. let params = Pedersen::<G1Affine>::new_params(&mut rng);
  116. // init Prover's transcript
  117. let mut transcript_p: Transcript<Fr> = Transcript::<Fr>::new();
  118. // init Verifier's transcript
  119. let mut transcript_v: Transcript<Fr> = Transcript::<Fr>::new();
  120. let v = Fr::rand(&mut rng);
  121. let cm = Pedersen::commit_elem(&mut rng, &params, &v);
  122. let proof = cm.prove(&params, &mut transcript_p, v);
  123. // also can use:
  124. // let proof = Pedersen::prove(&params, &mut transcript_p, cm.cm, v, cm.r);
  125. let v = Pedersen::verify(&params, &mut transcript_v, cm.cm, proof);
  126. assert!(v);
  127. }
  128. }