diff --git a/nomos-da/kzgrs/src/kzg.rs b/nomos-da/kzgrs/src/kzg.rs index 901b77ca..05ada05f 100644 --- a/nomos-da/kzgrs/src/kzg.rs +++ b/nomos-da/kzgrs/src/kzg.rs @@ -1,8 +1,12 @@ use crate::common::KzgRsError; use ark_bls12_381::{Bls12_381, Fr}; use ark_poly::univariate::DensePolynomial; -use ark_poly_commit::kzg10::{Commitment, Powers, KZG10}; +use ark_poly::{DenseUVPolynomial, EvaluationDomain, GeneralEvaluationDomain, Polynomial}; +use ark_poly_commit::kzg10::{Commitment, Powers, Proof, KZG10}; +use num_traits::One; +/// Commit to a polynomial where each of the evaluations are over `w(i)` for the degree +/// of the polynomial being omega (`w`) the root of unity (2^x). pub fn commit_polynomial( polynomial: &DensePolynomial, roots_of_unity: &Powers, @@ -12,6 +16,26 @@ pub fn commit_polynomial( .map(|(commitment, _)| commitment) } +/// Compute a witness polynomial in that satisfies `witness(x) = (f(x)-v)/(x-u)` +fn generate_element_proof( + element_index: usize, + polynomial: &DensePolynomial, + roots_of_unity: &Powers, + domain: &GeneralEvaluationDomain, +) -> Result, KzgRsError> { + let u = domain.element(element_index); + let v = polynomial.evaluate(&u); + let f_x_v = polynomial + &DensePolynomial::::from_coefficients_vec(vec![-v]); + let x_u = DensePolynomial::::from_coefficients_vec(vec![-u, Fr::one()]); + let witness_polynomial: DensePolynomial<_> = &f_x_v / &x_u; + let proof = commit_polynomial(&witness_polynomial, roots_of_unity)?; + let proof = Proof { + w: proof.0, + random_v: None, + }; + Ok(proof) +} + #[cfg(test)] mod test { use crate::kzg::commit_polynomial;