27 using ClaimBatch = ClaimBatcher::Batch;
32 static constexpr size_t log_n = 7;
36 static constexpr size_t n = 1UL << log_n;
40 ck = create_commitment_key<CK>(n);
41 vk = create_verifier_commitment_key<VK>();
44 struct ResultOfProveVerify {
50 static ResultOfProveVerify run_native_prove_verify(
const Polynomial& poly,
const Fr x)
52 Commitment commitment =
ck.commit(poly);
59 PCS::compute_opening_proof(ck, { poly, opening_pair }, prover_transcript);
63 verifier_transcript->load_proof(prover_transcript->export_proof());
65 bool result = PCS::reduce_verify(vk, opening_claim, verifier_transcript);
66 return { result, prover_transcript, verifier_transcript };
77TEST_F(IPATest, CommitOnManyZeroCoeffPolyWorks)
79 constexpr size_t n = 16;
81 for (
size_t i = 0; i < n - 1; i++) {
84 p.
at(3) = this->random_element();
85 GroupElement commitment =
ck.commit(p);
86 auto srs_elements =
ck.srs->get_monomial_points();
87 GroupElement expected = srs_elements[0] * p[0];
88 for (
size_t i = 1; i < n; i += 1) {
89 expected += srs_elements[i] * p[i];
91 EXPECT_EQ(expected.normalize(), commitment.normalize());
97 Commitment commitment =
ck.commit(poly);
98 EXPECT_TRUE(commitment.is_point_at_infinity());
100 auto x = this->random_element();
107 auto poly = Polynomial::random(n);
108 const GroupElement commitment =
ck.commit(poly);
109 auto srs_elements =
ck.srs->get_monomial_points();
110 GroupElement expected = srs_elements[0] * poly[0];
111 for (
size_t i = 1; i < n; ++i) {
112 expected += srs_elements[i] * poly[i];
114 EXPECT_EQ(expected.normalize(), commitment.normalize());
123 auto x = this->random_element();
124 bool result = run_native_prove_verify(poly, x).result;
134 for (
size_t i = 0; i < n / 2; ++i) {
135 poly_even.
at(2 * i) = this->random_element();
136 poly_odd.
at(2 * i + 1) = this->random_element();
138 auto x = this->random_element();
139 bool result_even = run_native_prove_verify(poly_even, x).result;
140 bool result_odd = run_native_prove_verify(poly_odd, x).result;
141 EXPECT_TRUE(result_even && result_odd);
148 auto poly = Polynomial::random(n);
150 bool result = run_native_prove_verify(poly, x).result;
158 auto poly = Polynomial::random(n);
159 auto x = this->random_element();
160 auto result_of_prove_verify = run_native_prove_verify(poly, x);
161 EXPECT_TRUE(result_of_prove_verify.result);
163 EXPECT_EQ(result_of_prove_verify.prover_transcript->get_manifest(),
164 result_of_prove_verify.verifier_transcript->get_manifest());
171 auto poly = Polynomial::random(n);
172 auto x = this->random_element();
173 auto initial_evaluation = poly.
evaluate(x);
174 auto change_in_linear_coefficient = initial_evaluation / x;
176 poly.
at(1) -= change_in_linear_coefficient;
179 bool result = run_native_prove_verify(poly, x).result;
186#if !defined(__wasm__)
191 auto poly = Polynomial::random(n);
192 auto [x, eval] = this->random_eval(poly);
193 auto commitment =
ck.commit(poly);
203 for (
size_t i = 0; i < num_challenges; i++) {
209 for (
size_t i = 0; i < num_challenges; i++) {
210 auto new_random_vector = random_vector;
212 transcript->initialize(new_random_vector);
213 EXPECT_ANY_THROW(PCS::compute_opening_proof<MockTranscript>(
ck, { poly, opening_pair }, transcript));
218 for (
size_t i = 0; i < num_challenges * 2; i++) {
219 lrs[i] = Curve::AffineElement::one();
223 for (
size_t i = 0; i < num_challenges; i++) {
224 auto new_random_vector = random_vector;
226 transcript->initialize(new_random_vector, lrs, {
uint256_t(n) });
227 EXPECT_ANY_THROW(PCS::reduce_verify(
vk, opening_claim, transcript));
236 for (
size_t i = 0; i < n / 2; i++) {
238 poly.
at(i + (n / 2)) = poly[i];
240 auto [x, eval] = this->random_eval(poly);
241 auto commitment =
ck.commit(poly);
247 const size_t num_challenges = log_n + 1;
251 for (
size_t i = 0; i < num_challenges; i++) {
258 transcript->initialize(random_vector);
261 PCS::compute_opening_proof<MockTranscript>(
ck, { poly, opening_pair }, transcript);
264 transcript->reset_indices();
267 EXPECT_TRUE(PCS::reduce_verify(
vk, opening_claim, transcript));
275TEST_F(IPATest, GeminiShplonkIPAWithoutShift)
279 auto mle_opening_point = this->random_evaluation_point(log_n);
294 auto prover_opening_claims =
295 GeminiProver::prove(n, mock_claims.
polynomial_batcher, mle_opening_point,
ck, prover_transcript);
297 const auto opening_claim = ShplonkProver::prove(
ck, prover_opening_claims, prover_transcript);
298 PCS::compute_opening_proof(
ck, opening_claim, prover_transcript);
302 auto gemini_verifier_claim =
303 GeminiVerifier::reduce_verification(mle_opening_point, mock_claims.
claim_batcher, verifier_transcript);
305 const auto shplonk_verifier_claim =
306 ShplonkVerifier::reduce_verification(
vk.
get_g1_identity(), gemini_verifier_claim, verifier_transcript);
307 auto result = PCS::reduce_verify(
vk, shplonk_verifier_claim, verifier_transcript);
309 EXPECT_EQ(result,
true);
316 auto mle_opening_point = this->random_evaluation_point(log_n);
330 auto prover_opening_claims =
331 GeminiProver::prove(n, mock_claims.
polynomial_batcher, mle_opening_point,
ck, prover_transcript);
332 const auto opening_claim = ShplonkProver::prove(
ck, prover_opening_claims, prover_transcript);
333 PCS::compute_opening_proof(
ck, opening_claim, prover_transcript);
338 std::ranges::fill(padding_indicator_array,
Fr{ 1 });
340 const auto batch_opening_claim = ShpleminiVerifier::compute_batch_opening_claim(padding_indicator_array,
344 verifier_transcript);
346 auto result = PCS::reduce_verify_batch_opening_claim(batch_opening_claim,
vk, verifier_transcript);
349 EXPECT_EQ(result,
true);
352TEST_F(IPATest, ShpleminiIPAShiftsRemoval)
356 auto mle_opening_point = this->random_evaluation_point(log_n);
371 auto prover_opening_claims =
372 GeminiProver::prove(n, mock_claims.
polynomial_batcher, mle_opening_point,
ck, prover_transcript);
374 const auto opening_claim = ShplonkProver::prove(
ck, prover_opening_claims, prover_transcript);
375 PCS::compute_opening_proof(
ck, opening_claim, prover_transcript);
379 const size_t to_be_shifted_commitments_start = 2;
382 const size_t shifted_commitments_start = 4;
384 const size_t num_shifted_commitments = 2;
393 std::ranges::fill(padding_indicator_array,
Fr{ 1 });
395 const auto batch_opening_claim = ShpleminiVerifier::compute_batch_opening_claim(padding_indicator_array,
400 repeated_commitments);
402 auto result = PCS::reduce_verify_batch_opening_claim(batch_opening_claim,
vk, verifier_transcript);
403 EXPECT_EQ(result,
true);
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 𝔾₁.
static void SetUpTestSuite()
IPA (inner product argument) commitment scheme class.
Unverified claim (C,r,v) for some witness polynomial p(X) such that.
Opening pair (r,v) for some witness polynomial p(X) such that p(r) = v.
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 & at(size_t index)
Our mutable accessor, unlike operator[]. We abuse precedent a bit to differentiate at() and operator[...
An efficient verifier for the evaluation proofs of multilinear polynomials and their shifts.
Representation of the Grumpkin Verifier Commitment Key inside a bn254 circuit.
Commitment get_g1_identity() const
typename Group::element Element
typename Group::affine_element AffineElement
TEST_F(IPATest, CommitOnManyZeroCoeffPolyWorks)
constexpr T get_msb(const T in)
Entry point for Barretenberg command-line interface.
TEST_F(IPATest, ChallengesAreZero)
CommitmentKey< Curve > ck
VerifierCommitmentKey< Curve > vk
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Logic to support batching opening claims for unshifted and shifted polynomials in Shplemini.
Constructs random polynomials, computes commitments and corresponding evaluations.
ClaimBatcher claim_batcher
PolynomialBatcher polynomial_batcher
static constexpr field one()
static field random_element(numeric::RNG *engine=nullptr) noexcept
static constexpr field zero()