barretenberg
Loading...
Searching...
No Matches
kzg.hpp
1#pragma once
2
3#include "../claim.hpp"
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"
8
9#include <memory>
10#include <utility>
11
12namespace proof_system::honk::pcs::kzg {
13
14template <typename Curve> class KZG {
17 using Fr = typename Curve::ScalarField;
18 using Commitment = typename Curve::AffineElement;
19 using GroupElement = typename Curve::Element;
21
30 public:
31 static void compute_opening_proof(std::shared_ptr<CK> ck,
32 const OpeningPair<Curve>& opening_pair,
34 const std::shared_ptr<BaseTranscript>& prover_trancript)
35 {
36 Polynomial quotient = polynomial;
37 quotient[0] -= opening_pair.evaluation;
38 // Computes the coefficients for the quotient polynomial q(X) = (p(X) - v) / (X - r) through an FFT
39 quotient.factor_roots(opening_pair.challenge);
40 auto quotient_commitment = ck->commit(quotient);
41 // TODO(#479): for now we compute the KZG commitment directly to unify the KZG and IPA interfaces but in the
42 // future we might need to adjust this to use the incoming alternative to work queue (i.e. variation of
43 // pthreads) or even the work queue itself
44 prover_trancript->send_to_verifier("KZG:W", quotient_commitment);
45 };
46
56 static bool verify(const std::shared_ptr<VK>& vk,
57 const OpeningClaim<Curve>& claim,
58 const std::shared_ptr<BaseTranscript>& verifier_transcript)
59 {
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;
64
65 return vk->pairing_check(lhs, rhs);
66 };
67
78 static std::array<GroupElement, 2> compute_pairing_points(const OpeningClaim<Curve>& claim,
79 const auto& verifier_transcript)
80 {
81 auto quotient_commitment = verifier_transcript->template receive_from_prover<Commitment>("KZG:W");
82
83 GroupElement P_0;
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,
88 quotient_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);
92
93 } else {
94 P_0 = claim.commitment;
95 P_0 += quotient_commitment * claim.opening_pair.challenge;
96 P_0 -= GroupElement::one() * claim.opening_pair.evaluation;
97 }
98
99 auto P_1 = -quotient_commitment;
100
101 return { P_0, P_1 };
102 };
103};
104} // namespace proof_system::honk::pcs::kzg
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
Definition: kzg.hpp:14
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