4#include "barretenberg/commitment_schemes/commitment_key.hpp"
5#include "barretenberg/commitment_schemes/verification_key.hpp"
6#include "barretenberg/polynomials/polynomial.hpp"
7#include "barretenberg/transcript/transcript.hpp"
12namespace proof_system::honk::pcs::kzg {
14template <
typename Curve>
class KZG {
17 using Fr =
typename Curve::ScalarField;
18 using Commitment =
typename Curve::AffineElement;
19 using GroupElement =
typename Curve::Element;
34 const std::shared_ptr<BaseTranscript>& prover_trancript)
37 quotient[0] -= opening_pair.evaluation;
40 auto quotient_commitment = ck->commit(quotient);
44 prover_trancript->send_to_verifier(
"KZG:W", quotient_commitment);
56 static bool verify(
const std::shared_ptr<VK>& vk,
58 const std::shared_ptr<BaseTranscript>& verifier_transcript)
60 auto quotient_commitment = verifier_transcript->template receive_from_prover<Commitment>(
"KZG:W");
61 auto lhs = claim.commitment - (GroupElement::one() * claim.opening_pair.evaluation) +
62 (quotient_commitment * claim.opening_pair.challenge);
63 auto rhs = -quotient_commitment;
65 return vk->pairing_check(lhs, rhs);
79 const auto& verifier_transcript)
81 auto quotient_commitment = verifier_transcript->template receive_from_prover<Commitment>(
"KZG:W");
84 if constexpr (Curve::is_stdlib_type) {
85 auto builder = verifier_transcript->builder;
86 auto one = Fr(builder, 1);
87 std::vector<GroupElement> commitments = { claim.commitment,
89 GroupElement::one(builder) };
90 std::vector<Fr> scalars = { one, claim.opening_pair.challenge, -claim.opening_pair.evaluation };
91 P_0 = GroupElement::batch_mul(commitments, scalars);
94 P_0 = claim.commitment;
95 P_0 += quotient_commitment * claim.opening_pair.challenge;
96 P_0 -= GroupElement::one() * claim.opening_pair.evaluation;
99 auto P_1 = -quotient_commitment;
Definition: polynomial.hpp:12
void factor_roots(std::span< const Fr > roots)
Divides p(X) by (X-r₁)⋯(X−rₘ) in-place. Assumes that p(rⱼ)=0 for all j.
Definition: polynomial.hpp:214
CommitmentKey object over a pairing group 𝔾₁.
Definition: commitment_key.hpp:35
Unverified claim (C,r,v) for some witness polynomial p(X) such that.
Definition: claim.hpp:43
Opening pair (r,v) for some witness polynomial p(X) such that p(r) = v.
Definition: claim.hpp:12
Definition: verification_key.hpp:25
static bool verify(const std::shared_ptr< VK > &vk, const OpeningClaim< Curve > &claim, const std::shared_ptr< BaseTranscript > &verifier_transcript)
Computes the KZG verification for an opening claim of a single polynomial commitment.
Definition: kzg.hpp:56
static std::array< GroupElement, 2 > compute_pairing_points(const OpeningClaim< Curve > &claim, const auto &verifier_transcript)
Computes the input points for the pairing check needed to verify a KZG opening claim of a single poly...
Definition: kzg.hpp:78
static void compute_opening_proof(std::shared_ptr< CK > ck, const OpeningPair< Curve > &opening_pair, const Polynomial &polynomial, const std::shared_ptr< BaseTranscript > &prover_trancript)
Computes the KZG commitment to an opening proof polynomial at a single evaluation point.
Definition: kzg.hpp:31