4#include "../commitment_key.test.hpp"
17 static constexpr size_t log_n = 4;
18 static constexpr size_t n = 1UL <<
log_n;
29 static constexpr size_t big_n = 1UL << 12;
40 ck = create_commitment_key<CK>(
n);
41 vk = create_verifier_commitment_key<VK>();
57 poly_size, mock_claims.
polynomial_batcher, multilinear_evaluation_point, comkey, prover_transcript);
65 const size_t total_num_claims = 2 * multilinear_challenge_size;
66 prover_claims_with_pos_evals.reserve(total_num_claims);
68 for (
auto& claim : prover_output) {
69 if (claim.gemini_fold) {
70 if (claim.gemini_fold) {
72 const Fr evaluation_challenge = -claim.opening_pair.challenge;
74 const Fr pos_evaluation = claim.polynomial.evaluate(evaluation_challenge);
77 .opening_pair = { .challenge = evaluation_challenge,
78 .evaluation = pos_evaluation } };
79 prover_claims_with_pos_evals.emplace_back(pos_fold_claim);
82 prover_claims_with_pos_evals.emplace_back(claim);
95 multilinear_evaluation_point, mock_claims.
claim_batcher, verifier_transcript);
98 if (this->is_reject_case) {
99 bool mismatch =
false;
100 for (
auto [prover_claim, verifier_claim] :
zip_view(prover_claims_with_pos_evals, verifier_claims)) {
101 if (prover_claim.opening_pair != verifier_claim.opening_pair) {
106 EXPECT_TRUE(mismatch) <<
"Expected a mismatch in opening pairs, but all matched.";
108 for (
auto [prover_claim, verifier_claim] :
zip_view(prover_claims_with_pos_evals, verifier_claims)) {
110 ASSERT_EQ(prover_claim.opening_pair, verifier_claim.opening_pair);
149 prover_claims_with_pos_evals.reserve(total_num_claims);
151 for (
auto& claim : prover_output) {
152 if (claim.gemini_fold) {
153 if (claim.gemini_fold) {
155 const Fr evaluation_challenge = -claim.opening_pair.challenge;
157 const Fr pos_evaluation = claim.polynomial.evaluate(evaluation_challenge);
161 .opening_pair = { .challenge = evaluation_challenge,
162 .evaluation = pos_evaluation } };
163 prover_claims_with_pos_evals.emplace_back(pos_fold_claim);
166 prover_claims_with_pos_evals.emplace_back(claim);
180 for (
auto [prover_claim, verifier_claim] :
zip_view(prover_claims_with_pos_evals, verifier_claims)) {
182 ASSERT_EQ(prover_claim.opening_pair, verifier_claim.opening_pair);
189using ParamsTypes = ::testing::Types<curve::BN254, curve::Grumpkin>;
194 auto u = this->random_evaluation_point(this->log_n);
196 this->n, 1, 0, 0, u, this->
ck);
198 this->execute_gemini_and_verify_claims(u, mock_claims);
203 auto u = this->random_evaluation_point(this->log_n);
206 this->n, 1, 1, 0, u, this->
ck);
208 this->execute_gemini_and_verify_claims(u, mock_claims);
214 auto u = this->random_evaluation_point(this->log_n);
217 this->n, 2, 0, 0, u, this->
ck);
219 this->execute_gemini_and_verify_claims(u, mock_claims);
225 auto u = this->random_evaluation_point(this->log_n);
228 this->n, 2, 1, 0, u, this->
ck);
230 this->execute_gemini_and_verify_claims(u, mock_claims);
235 auto u = this->random_evaluation_point(this->log_n);
246 this->execute_gemini_and_verify_claims(u, mock_claims);
251 TestFixture::open_extension_by_zero();
260 using ClaimBatch = ClaimBatcher::Batch;
262 using Commitment = TypeParam::AffineElement;
263 using Fr = TypeParam::ScalarField;
264 const size_t log_n = 3;
268 const Fr rho = prover_transcript->template get_challenge<Fr>(
"rho");
270 fold_polynomials.reserve(log_n);
276 auto u = this->random_evaluation_point(log_n);
282 std::vector<Fr> fold_evals;
283 fold_evals.reserve(log_n);
291 claimed_multilinear_eval * u[1].
sqr() * ((
Fr(1) - u[2]) * u[1].sqr() - u[2] * (
Fr(1) - u[1]).sqr()).invert();
293 fold_2.
at(1) = -(
Fr(1) - u[1]).sqr() * fold_2.
at(0) * (u[1].sqr()).invert();
296 fold_1.
at(0) =
Fr(0);
298 fold_1.
at(2) = -(
Fr(1) - u[1]) * fold_1.
at(1) * u[1].
invert();
299 fold_1.
at(3) =
Fr(0);
301 prover_transcript->send_to_verifier(
"Gemini:FOLD_1", this->
ck.commit(fold_1));
302 prover_transcript->send_to_verifier(
"Gemini:FOLD_2", this->
ck.commit(fold_2));
305 const Fr gemini_r = prover_transcript->template get_challenge<Fr>(
"Gemini:r");
308 fold_evals.emplace_back(fold_0.
evaluate(-gemini_r));
314 fold_evals.emplace_back(fold_1.
evaluate(-r_squares[1]));
315 fold_evals.emplace_back(fold_2.
evaluate(-r_squares[2]));
316 prover_transcript->send_to_verifier(
"Gemini:a_1", fold_evals[0]);
317 prover_transcript->send_to_verifier(
"Gemini:a_2", fold_evals[1]);
318 prover_transcript->send_to_verifier(
"Gemini:a_3", fold_evals[2]);
324 prover_opening_claims.reserve(2 * log_n);
326 prover_opening_claims.emplace_back(Claim{ fold_0, { gemini_r,
Fr{ 0 } } });
327 prover_opening_claims.emplace_back(Claim{ fold_0, { -gemini_r,
Fr{ 0 } } });
328 prover_opening_claims.emplace_back(Claim{ fold_1, { r_squares[1], fold_1.
evaluate(r_squares[1]) } });
329 prover_opening_claims.emplace_back(Claim{ fold_1, { -r_squares[1], fold_evals[1] } });
330 prover_opening_claims.emplace_back(Claim{ fold_2, { r_squares[2], fold_2.
evaluate(r_squares[2]) } });
331 prover_opening_claims.emplace_back(Claim{ fold_2, { -r_squares[2], fold_evals[2] } });
334 this->verify_batch_opening_pair(prover_opening_claims);
338 std::vector<Commitment> unshifted_commitments = { this->
ck.commit(fold_0) };
339 std::vector<Fr> unshifted_evals = { claimed_multilinear_eval * rho.
pow(0) };
341 ClaimBatcher claim_batcher{ .unshifted =
348 std::vector<size_t> matching_claim_indices{ 0, 1, 3, 4, 5 };
351 std::vector<size_t> mismatching_claim_indices = { 2 };
352 for (
auto idx : matching_claim_indices) {
353 EXPECT_TRUE(prover_opening_claims[idx].opening_pair == verifier_claims[idx].opening_pair);
358 for (
auto idx : mismatching_claim_indices) {
359 EXPECT_FALSE(prover_opening_claims[idx].opening_pair == verifier_claims[idx].opening_pair);
368 using Fr =
typename TypeParam::ScalarField;
370 this->is_big_ck =
true;
373 auto u = this->random_evaluation_point(this->small_log_n);
383 const Fr tail = ((
Fr(1) - u[0]) * (
Fr(1) - u[1])).
invert();
384 poly.
at(4) = claimed_multilinear_eval * tail / u[2];
385 poly.
at(4088) = tail;
386 poly.
at(4092) = -tail * (
Fr(1) - u[2]) / u[2];
389 this->big_n, std::vector{
std::move(poly) }, std::vector<Fr>{ claimed_multilinear_eval }, this->big_ck);
391 this->execute_gemini_and_verify_claims(u, mock_claims);
399 using Fr =
typename TypeParam::ScalarField;
402 this->is_big_ck =
true;
403 this->is_reject_case =
true;
406 Polynomial poly = Polynomial::random(this->big_n);
409 auto u = this->random_evaluation_point(this->small_log_n);
415 this->big_n, std::vector{
std::move(poly) }, std::vector<Fr>{ claimed_multilinear_eval }, this->big_ck);
417 this->execute_gemini_and_verify_claims(u, mock_claims);
typename Curve::AffineElement Commitment
static void SetUpTestSuite()
void execute_gemini_and_verify_claims(std::vector< Fr > &multilinear_evaluation_point, MockClaimGenerator< Curve > mock_claims)
void open_extension_by_zero()
static constexpr size_t log_n
static constexpr size_t n
static constexpr size_t small_log_n
static constexpr size_t big_n
static constexpr size_t big_ck_size
static constexpr size_t virtual_log_n
typename Curve::ScalarField Fr
static std::shared_ptr< BaseTranscript > verifier_init_empty(const std::shared_ptr< BaseTranscript > &transcript)
For testing: initializes transcript based on proof data then receives junk data produced by BaseTrans...
static std::shared_ptr< BaseTranscript > prover_init_empty()
For testing: initializes transcript with some arbitrary data so that a challenge can be generated aft...
CommitmentKey object over a pairing group 𝔾₁.
Commitment commit(PolynomialSpan< const Fr > polynomial) const
Uses the ProverSRS to create a commitment to p(X)
void verify_batch_opening_pair(std::vector< ProverOpeningClaim< Curve > > opening_claims)
Ensures that a set of opening pairs is correct by checking that evaluations are correct by recomputin...
std::vector< Fr > random_evaluation_point(const size_t num_variables)
void verify_opening_claim(const OpeningClaim< Curve > &claim, const Polynomial &witness, CommitmentKey< Curve > ck=CommitmentKey< Curve >())
Class responsible for computation of the batched multilinear polynomials required by the Gemini proto...
void set_unshifted(RefVector< Polynomial > polynomials)
static std::vector< Claim > prove(const Fr circuit_size, PolynomialBatcher &polynomial_batcher, std::span< Fr > multilinear_challenge, const CommitmentKey< Curve > &commitment_key, const std::shared_ptr< Transcript > &transcript, bool has_zk=false)
static std::vector< OpeningClaim< Curve > > reduce_verification(std::span< Fr > multilinear_challenge, ClaimBatcher &claim_batcher, auto &transcript)
Returns univariate opening claims for the Fold polynomials to be checked later.
Structured polynomial class that represents the coefficients 'a' of a_0 + a_1 x .....
Fr evaluate(const Fr &z, size_t target_size) const
Fr evaluate_mle(std::span< const Fr > evaluation_points, bool shift=false) const
evaluate multi-linear extension p(X_0,…,X_{n-1}) = \sum_i a_i*L_i(X_0,…,X_{n-1}) at u = (u_0,...
Fr & at(size_t index)
Our mutable accessor, unlike operator[]. We abuse precedent a bit to differentiate at() and operator[...
Polynomial p and an opening pair (r,v) such that p(r) = v.
A template class for a reference vector. Behaves as if std::vector<T&> was possible.
typename Group::affine_element AffineElement
::testing::Types< curve::BN254, curve::Grumpkin > ParamsTypes
TYPED_TEST(GeminiTest, Single)
TYPED_TEST_SUITE(GeminiTest, ParamsTypes)
std::vector< Fr > powers_of_evaluation_challenge(const Fr r, const size_t num_squares)
Compute squares of folding challenge r.
Entry point for Barretenberg command-line interface.
CommitmentKey< Curve > ck
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Logic to support batching opening claims for unshifted and shifted polynomials in Shplemini.
std::optional< Batch > unshifted
Constructs random polynomials, computes commitments and corresponding evaluations.
ClaimBatcher claim_batcher
PolynomialBatcher polynomial_batcher
BB_INLINE constexpr field pow(const uint256_t &exponent) const noexcept
constexpr field invert() const noexcept
static field random_element(numeric::RNG *engine=nullptr) noexcept
BB_INLINE constexpr field sqr() const noexcept