proof_of_sql/base/commitment/
commitment_evaluation_proof.rs1use super::Commitment;
2use crate::base::{proof::Transcript, scalar::Scalar};
3#[cfg(feature = "blitzar")]
4use crate::base::{scalar::MontScalar, slice_ops};
5#[cfg(feature = "blitzar")]
6use blitzar::proof::{InnerProductProof, ProofError};
7#[cfg(feature = "blitzar")]
8use curve25519_dalek::RistrettoPoint;
9use serde::{Deserialize, Serialize};
10
11pub trait CommitmentEvaluationProof {
13 type Scalar: Scalar + Serialize + for<'a> Deserialize<'a>;
15 type Commitment: for<'a> Commitment<Scalar = Self::Scalar, PublicSetup<'a> = Self::ProverPublicSetup<'a>>
17 + Serialize
18 + for<'a> Deserialize<'a>;
19 type Error;
21 type ProverPublicSetup<'a>: Copy;
24 type VerifierPublicSetup<'a>: Copy;
27 fn new(
33 transcript: &mut impl Transcript,
34 a: &[Self::Scalar],
35 b_point: &[Self::Scalar],
36 generators_offset: u64,
37 setup: &Self::ProverPublicSetup<'_>,
38 ) -> Self;
39 #[allow(clippy::too_many_arguments)]
45 fn verify_proof(
46 &self,
47 transcript: &mut impl Transcript,
48 a_commit: &Self::Commitment,
49 product: &Self::Scalar,
50 b_point: &[Self::Scalar],
51 generators_offset: u64,
52 table_length: usize,
53 setup: &Self::VerifierPublicSetup<'_>,
54 ) -> Result<(), Self::Error> {
55 self.verify_batched_proof(
56 transcript,
57 core::slice::from_ref(a_commit),
58 &[Self::Scalar::ONE],
59 core::slice::from_ref(product),
60 b_point,
61 generators_offset,
62 table_length,
63 setup,
64 )
65 }
66 #[allow(clippy::too_many_arguments)]
68 fn verify_batched_proof(
69 &self,
70 transcript: &mut impl Transcript,
71 commit_batch: &[Self::Commitment],
72 batching_factors: &[Self::Scalar],
73 evaluations: &[Self::Scalar],
74 b_point: &[Self::Scalar],
75 generators_offset: u64,
76 table_length: usize,
77 setup: &Self::VerifierPublicSetup<'_>,
78 ) -> Result<(), Self::Error>;
79}
80
81#[cfg(feature = "blitzar")]
82impl CommitmentEvaluationProof for InnerProductProof {
83 type Scalar = MontScalar<ark_curve25519::FrConfig>;
84 type Commitment = RistrettoPoint;
85 type Error = ProofError;
86 type ProverPublicSetup<'a> = ();
87 type VerifierPublicSetup<'a> = ();
88 fn new(
89 transcript: &mut impl Transcript,
90 a: &[Self::Scalar],
91 b_point: &[Self::Scalar],
92 generators_offset: u64,
93 _setup: &Self::ProverPublicSetup<'_>,
94 ) -> Self {
95 assert!(!a.is_empty());
96 let b = &mut vec![MontScalar::default(); a.len()];
97 if b_point.is_empty() {
98 assert_eq!(b.len(), 1);
99 b[0] = Self::Scalar::ONE;
100 } else {
101 crate::base::polynomial::compute_evaluation_vector(b, b_point);
102 }
103 transcript.wrap_transcript(|transcript| {
106 Self::create(
107 transcript,
108 &slice_ops::slice_cast(a),
109 &slice_ops::slice_cast(b),
110 generators_offset,
111 )
112 })
113 }
114
115 fn verify_batched_proof(
116 &self,
117 transcript: &mut impl Transcript,
118 commit_batch: &[Self::Commitment],
119 batching_factors: &[Self::Scalar],
120 evaluations: &[Self::Scalar],
121 b_point: &[Self::Scalar],
122 generators_offset: u64,
123 table_length: usize,
124 _setup: &Self::VerifierPublicSetup<'_>,
125 ) -> Result<(), Self::Error> {
126 assert!(table_length > 0);
127 let b = &mut vec![MontScalar::default(); table_length];
128 if b_point.is_empty() {
129 assert_eq!(b.len(), 1);
130 b[0] = Self::Scalar::ONE;
131 } else {
132 crate::base::polynomial::compute_evaluation_vector(b, b_point);
133 }
134 let product: Self::Scalar = evaluations
135 .iter()
136 .zip(batching_factors)
137 .map(|(&e, &f)| e * f)
138 .sum();
139 transcript.wrap_transcript(|transcript| {
142 self.verify(
143 transcript,
144 &commit_batch
145 .iter()
146 .zip(batching_factors.iter())
147 .map(|(c, m)| *m * c)
148 .fold(RistrettoPoint::default(), |mut a, c| {
149 a += c;
150 a
151 }),
152 &product.into(),
153 &slice_ops::slice_cast(b),
154 generators_offset,
155 )
156 })
157 }
158}