2#include "barretenberg/commitment_schemes/claim.hpp"
3#include "barretenberg/commitment_schemes/commitment_key.hpp"
4#include "barretenberg/commitment_schemes/verification_key.hpp"
5#include "barretenberg/transcript/transcript.hpp"
47 using Fr =
typename Curve::ScalarField;
60 std::span<const Polynomial> witness_polynomials,
64 size_t max_poly_size{ 0 };
65 for (
const auto& poly : witness_polynomials) {
66 max_poly_size = std::max(max_poly_size, poly.size());
72 Fr current_nu = Fr::one();
73 for (
size_t j = 0; j < opening_pairs.size(); ++j) {
75 const auto& [challenge, evaluation] = opening_pairs[j];
78 tmp = witness_polynomials[j];
102 std::span<const Polynomial> witness_polynomials,
104 const Fr& nu_challenge,
105 const Fr& z_challenge)
107 const size_t num_opening_pairs = opening_pairs.size();
110 std::vector<Fr> inverse_vanishing_evals;
111 inverse_vanishing_evals.reserve(num_opening_pairs);
112 for (
const auto& pair : opening_pairs) {
113 inverse_vanishing_evals.emplace_back(z_challenge - pair.challenge);
115 Fr::batch_invert(inverse_vanishing_evals);
122 Fr current_nu = Fr::one();
124 for (
size_t j = 0; j < num_opening_pairs; ++j) {
126 const auto& [challenge, evaluation] = opening_pairs[j];
129 tmp = witness_polynomials[j];
130 tmp[0] -= evaluation;
131 Fr scaling_factor = current_nu * inverse_vanishing_evals[j];
134 G.add_scaled(tmp, -scaling_factor);
136 current_nu *= nu_challenge;
140 return { .opening_pair = { .challenge = z_challenge, .evaluation = Fr::zero() }, .witness = std::move(G) };
149 using Fr =
typename Curve::ScalarField;
150 using GroupElement =
typename Curve::Element;
151 using Commitment =
typename Curve::AffineElement;
169 const size_t num_claims = claims.size();
171 const Fr nu = transcript->get_challenge(
"Shplonk:nu");
173 auto Q_commitment = transcript->template receive_from_prover<Commitment>(
"Shplonk:Q");
175 const Fr z_challenge = transcript->get_challenge(
"Shplonk:z");
179 GroupElement G_commitment;
186 auto G_commitment_constant = Fr(0);
192 if constexpr (Curve::is_stdlib_type) {
193 auto builder = nu.get_context();
196 std::vector<Commitment> commitments;
197 std::vector<Fr> scalars;
201 commitments.emplace_back(Q_commitment);
202 scalars.emplace_back(Fr(builder, 1));
205 std::vector<Fr> inverse_vanishing_evals;
206 inverse_vanishing_evals.reserve(num_claims);
207 for (
const auto& claim : claims) {
209 inverse_vanishing_evals.emplace_back((z_challenge - claim.opening_pair.challenge).invert());
212 auto current_nu = Fr(1);
214 for (
size_t j = 0; j < num_claims; ++j) {
216 const auto& [opening_pair, commitment] = claims[j];
218 Fr scaling_factor = current_nu * inverse_vanishing_evals[j];
221 G_commitment_constant += scaling_factor * opening_pair.evaluation;
226 commitments.emplace_back(commitment);
227 scalars.emplace_back(-scaling_factor);
230 commitments.emplace_back(GroupElement::one(builder));
231 scalars.emplace_back(G_commitment_constant);
234 G_commitment = GroupElement::batch_mul(commitments, scalars);
239 G_commitment = Q_commitment;
242 std::vector<Fr> inverse_vanishing_evals;
243 inverse_vanishing_evals.reserve(num_claims);
244 for (
const auto& claim : claims) {
245 inverse_vanishing_evals.emplace_back(z_challenge - claim.opening_pair.challenge);
247 Fr::batch_invert(inverse_vanishing_evals);
249 auto current_nu = Fr(1);
251 for (
size_t j = 0; j < num_claims; ++j) {
253 const auto& [opening_pair, commitment] = claims[j];
255 Fr scaling_factor = current_nu * inverse_vanishing_evals[j];
258 G_commitment_constant += scaling_factor * opening_pair.evaluation;
261 G_commitment -= commitment * scaling_factor;
267 G_commitment += vk->srs->get_first_g1() * G_commitment_constant;
271 return { { z_challenge, Fr(0) }, G_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
void add_scaled(std::span< const Fr > other, Fr scaling_factor)
adds the polynomial q(X) 'other', multiplied by a scaling factor.
Definition: polynomial.cpp:367
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
Shplonk Prover.
Definition: shplonk.hpp:46
static ProverOutput< Curve > compute_partially_evaluated_batched_quotient(std::span< const OpeningPair< Curve > > opening_pairs, std::span< const Polynomial > witness_polynomials, Polynomial &&batched_quotient_Q, const Fr &nu_challenge, const Fr &z_challenge)
Compute partially evaluated batched quotient polynomial difference Q(X) - Q_z(X)
Definition: shplonk.hpp:100
static Polynomial compute_batched_quotient(std::span< const OpeningPair< Curve > > opening_pairs, std::span< const Polynomial > witness_polynomials, const Fr &nu)
Compute batched quotient polynomial Q(X) = ∑ⱼ ρʲ ⋅ ( fⱼ(X) − vⱼ) / ( X − xⱼ )
Definition: shplonk.hpp:59
Shplonk Verifier.
Definition: shplonk.hpp:148
static OpeningClaim< Curve > reduce_verification(std::shared_ptr< VK > vk, std::span< const OpeningClaim< Curve > > claims, auto &transcript)
Recomputes the new claim commitment [G] given the proof and the challenge r. No verification happens ...
Definition: shplonk.hpp:164
Reduces multiple claims about commitments, each opened at a single point into a single claim for a si...
Definition: shplonk.hpp:21
Prover output (claim=([G], r, 0), witness = G(X), proof = [Q]) that can be passed on to a univariate ...
Definition: shplonk.hpp:36