4#include "../commitment_key.test.hpp"
17 static constexpr size_t log_n = 4;
18 static constexpr size_t n = 1UL <<
log_n;
30 ck = create_commitment_key<CK>(
n);
31 vk = create_verifier_commitment_key<VK>();
51 const size_t total_num_claims = 2 *
log_n;
52 prover_claims_with_pos_evals.reserve(total_num_claims);
54 for (
auto& claim : prover_output) {
55 if (claim.gemini_fold) {
56 if (claim.gemini_fold) {
58 const Fr evaluation_challenge = -claim.opening_pair.challenge;
60 const Fr pos_evaluation = claim.polynomial.evaluate(evaluation_challenge);
63 .opening_pair = { .challenge = evaluation_challenge,
64 .evaluation = pos_evaluation } };
65 prover_claims_with_pos_evals.emplace_back(pos_fold_claim);
68 prover_claims_with_pos_evals.emplace_back(claim);
81 multilinear_evaluation_point, mock_claims.
claim_batcher, verifier_transcript);
84 for (
auto [prover_claim, verifier_claim] :
zip_view(prover_claims_with_pos_evals, verifier_claims)) {
86 ASSERT_EQ(prover_claim.opening_pair, verifier_claim.opening_pair);
124 prover_claims_with_pos_evals.reserve(total_num_claims);
126 for (
auto& claim : prover_output) {
127 if (claim.gemini_fold) {
128 if (claim.gemini_fold) {
130 const Fr evaluation_challenge = -claim.opening_pair.challenge;
132 const Fr pos_evaluation = claim.polynomial.evaluate(evaluation_challenge);
136 .opening_pair = { .challenge = evaluation_challenge,
137 .evaluation = pos_evaluation } };
138 prover_claims_with_pos_evals.emplace_back(pos_fold_claim);
141 prover_claims_with_pos_evals.emplace_back(claim);
155 for (
auto [prover_claim, verifier_claim] :
zip_view(prover_claims_with_pos_evals, verifier_claims)) {
157 ASSERT_EQ(prover_claim.opening_pair, verifier_claim.opening_pair);
164using ParamsTypes = ::testing::Types<curve::BN254, curve::Grumpkin>;
169 auto u = this->random_evaluation_point(this->log_n);
171 this->n, 1, 0, 0, u, this->
ck);
173 this->execute_gemini_and_verify_claims(u, mock_claims);
178 auto u = this->random_evaluation_point(this->log_n);
181 this->n, 1, 1, 0, u, this->
ck);
183 this->execute_gemini_and_verify_claims(u, mock_claims);
189 auto u = this->random_evaluation_point(this->log_n);
192 this->n, 2, 0, 0, u, this->
ck);
194 this->execute_gemini_and_verify_claims(u, mock_claims);
200 auto u = this->random_evaluation_point(this->log_n);
203 this->n, 2, 1, 0, u, this->
ck);
205 this->execute_gemini_and_verify_claims(u, mock_claims);
210 auto u = this->random_evaluation_point(this->log_n);
221 this->execute_gemini_and_verify_claims(u, mock_claims);
226 TestFixture::open_extension_by_zero();
235 using ClaimBatch = ClaimBatcher::Batch;
237 using Commitment = TypeParam::AffineElement;
238 using Fr = TypeParam::ScalarField;
239 const size_t log_n = 3;
243 const Fr rho = prover_transcript->template get_challenge<Fr>(
"rho");
245 fold_polynomials.reserve(log_n);
251 auto u = this->random_evaluation_point(log_n);
257 std::vector<Fr> fold_evals;
258 fold_evals.reserve(log_n);
266 claimed_multilinear_eval * u[1].
sqr() * ((
Fr(1) - u[2]) * u[1].sqr() - u[2] * (
Fr(1) - u[1]).sqr()).invert();
268 fold_2.
at(1) = -(
Fr(1) - u[1]).sqr() * fold_2.
at(0) * (u[1].sqr()).invert();
271 fold_1.
at(0) =
Fr(0);
273 fold_1.
at(2) = -(
Fr(1) - u[1]) * fold_1.
at(1) * u[1].
invert();
274 fold_1.
at(3) =
Fr(0);
276 prover_transcript->send_to_verifier(
"Gemini:FOLD_1", this->
ck.commit(fold_1));
277 prover_transcript->send_to_verifier(
"Gemini:FOLD_2", this->
ck.commit(fold_2));
280 const Fr gemini_r = prover_transcript->template get_challenge<Fr>(
"Gemini:r");
283 fold_evals.emplace_back(fold_0.
evaluate(-gemini_r));
289 fold_evals.emplace_back(fold_1.
evaluate(-r_squares[1]));
290 fold_evals.emplace_back(fold_2.
evaluate(-r_squares[2]));
291 prover_transcript->send_to_verifier(
"Gemini:a_1", fold_evals[0]);
292 prover_transcript->send_to_verifier(
"Gemini:a_2", fold_evals[1]);
293 prover_transcript->send_to_verifier(
"Gemini:a_3", fold_evals[2]);
299 prover_opening_claims.reserve(2 * log_n);
301 prover_opening_claims.emplace_back(Claim{ fold_0, { gemini_r,
Fr{ 0 } } });
302 prover_opening_claims.emplace_back(Claim{ fold_0, { -gemini_r,
Fr{ 0 } } });
303 prover_opening_claims.emplace_back(Claim{ fold_1, { r_squares[1], fold_1.
evaluate(r_squares[1]) } });
304 prover_opening_claims.emplace_back(Claim{ fold_1, { -r_squares[1], fold_evals[1] } });
305 prover_opening_claims.emplace_back(Claim{ fold_2, { r_squares[2], fold_2.
evaluate(r_squares[2]) } });
306 prover_opening_claims.emplace_back(Claim{ fold_2, { -r_squares[2], fold_evals[2] } });
309 this->verify_batch_opening_pair(prover_opening_claims);
313 std::vector<Commitment> unshifted_commitments = { this->
ck.commit(fold_0) };
314 std::vector<Fr> unshifted_evals = { claimed_multilinear_eval * rho.
pow(0) };
316 ClaimBatcher claim_batcher{ .unshifted =
323 std::vector<size_t> matching_claim_indices{ 0, 1, 3, 4, 5 };
326 std::vector<size_t> mismatching_claim_indices = { 2 };
327 for (
auto idx : matching_claim_indices) {
328 EXPECT_TRUE(prover_opening_claims[idx].opening_pair == verifier_claims[idx].opening_pair);
333 for (
auto idx : mismatching_claim_indices) {
334 EXPECT_FALSE(prover_opening_claims[idx].opening_pair == verifier_claims[idx].opening_pair);
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 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