1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
use zkstd::common::{Group, Pairing, PairingRange};

/// witness for Kate polynomial commitment
#[allow(dead_code)]
#[derive(Debug)]
pub struct Witness<P: Pairing> {
    // Original commitment, C = p(s)
    pub c_eval: P::G1Affine,
    // Quotient commitment, C = q(s)
    pub q_eval: P::G1Affine,
    // (s - a)_g2
    pub(crate) denominator: P::G2PairngRepr,
    // H
    pub(crate) h: P::G2PairngRepr,
}

impl<P: Pairing> Witness<P> {
    pub fn verify(self) -> bool {
        let pairing =
            P::multi_miller_loop(&[(self.c_eval, self.h), (self.q_eval, self.denominator)])
                .final_exp();

        pairing == <<P as Pairing>::PairingRange as PairingRange>::Gt::ADDITIVE_IDENTITY
    }
}