27 using ClaimBatch = ClaimBatcher::Batch;
33 static constexpr size_t log_n = 7;
37 static constexpr size_t n = 1UL << log_n;
41 ck = create_commitment_key<CK>(n);
42 vk = create_verifier_commitment_key<VK>();
50TEST_F(IPATest, CommitOnManyZeroCoeffPolyWorks)
52 constexpr size_t n = 4;
54 for (
size_t i = 0; i < n - 1; i++) {
58 GroupElement commitment =
ck.commit(p);
59 auto srs_elements =
ck.srs->get_monomial_points();
60 GroupElement expected = srs_elements[0] * p[0];
64 for (
size_t i = 1; i < n; i += 1) {
65 expected += srs_elements[i] * p[i];
67 EXPECT_EQ(expected.normalize(), commitment.normalize());
76 Commitment commitment =
ck.commit(poly);
77 EXPECT_TRUE(commitment.is_point_at_infinity());
79 auto [x, eval] = this->random_eval(poly);
86 PCS::compute_opening_proof(
ck, { poly, opening_pair }, prover_transcript);
90 verifier_transcript->load_proof(prover_transcript->export_proof());
92 bool result = PCS::reduce_verify(
vk, opening_claim, verifier_transcript);
101 auto poly = Polynomial::random(n);
103 const Fr eval = poly.evaluate(x);
104 const Commitment commitment =
ck.commit(poly);
110 PCS::compute_opening_proof(
ck, { poly, opening_pair }, prover_transcript);
114 verifier_transcript->load_proof(prover_transcript->export_proof());
116 bool result = PCS::reduce_verify(
vk, opening_claim, verifier_transcript);
121#if !defined(__wasm__)
126 auto poly = Polynomial::random(n);
127 auto [x, eval] = this->random_eval(poly);
128 auto commitment =
ck.commit(poly);
138 for (
size_t i = 0; i < num_challenges; i++) {
144 for (
size_t i = 0; i < num_challenges; i++) {
145 auto new_random_vector = random_vector;
147 transcript->initialize(new_random_vector);
148 EXPECT_ANY_THROW(PCS::compute_opening_proof_internal(
ck, { poly, opening_pair }, transcript));
153 for (
size_t i = 0; i < num_challenges * 2; i++) {
154 lrs[i] = Curve::AffineElement::one();
158 for (
size_t i = 0; i < num_challenges; i++) {
159 auto new_random_vector = random_vector;
161 transcript->initialize(new_random_vector, lrs, {
uint256_t(n) });
162 EXPECT_ANY_THROW(PCS::reduce_verify_internal_native(
vk, opening_claim, transcript));
171 for (
size_t i = 0; i < n / 2; i++) {
173 poly.at(i + (n / 2)) = poly[i];
175 auto [x, eval] = this->random_eval(poly);
176 auto commitment =
ck.commit(poly);
183 const size_t num_challenges = log_n + 1;
187 for (
size_t i = 0; i < num_challenges; i++) {
194 transcript->initialize(random_vector);
197 PCS::compute_opening_proof_internal(
ck, { poly, opening_pair }, transcript);
200 transcript->reset_indices();
203 EXPECT_TRUE(PCS::reduce_verify_internal_native(
vk, opening_claim, transcript));
210 auto poly = Polynomial::random(n);
211 const GroupElement commitment =
ck.commit(poly);
212 auto srs_elements =
ck.srs->get_monomial_points();
213 GroupElement expected = srs_elements[0] * poly[0];
217 for (
size_t i = 1; i < n; i += 1) {
218 expected += srs_elements[i] * poly[i];
220 EXPECT_EQ(expected.normalize(), commitment.normalize());
226 auto poly = Polynomial::random(n);
227 auto [x, eval] = this->random_eval(poly);
228 auto commitment =
ck.commit(poly);
234 PCS::compute_opening_proof(
ck, { poly, opening_pair }, prover_transcript);
238 verifier_transcript->load_proof(prover_transcript->export_proof());
240 auto result = PCS::reduce_verify(
vk, opening_claim, verifier_transcript);
243 EXPECT_EQ(prover_transcript->get_manifest(), verifier_transcript->get_manifest());
246TEST_F(IPATest, GeminiShplonkIPAWithShift)
250 auto mle_opening_point = this->random_evaluation_point(log_n);
265 auto prover_opening_claims =
266 GeminiProver::prove(n, mock_claims.
polynomial_batcher, mle_opening_point,
ck, prover_transcript);
268 const auto opening_claim = ShplonkProver::prove(
ck, prover_opening_claims, prover_transcript);
269 PCS::compute_opening_proof(
ck, opening_claim, prover_transcript);
273 auto gemini_verifier_claim =
274 GeminiVerifier::reduce_verification(mle_opening_point, mock_claims.
claim_batcher, verifier_transcript);
276 const auto shplonk_verifier_claim =
277 ShplonkVerifier::reduce_verification(
vk.
get_g1_identity(), gemini_verifier_claim, verifier_transcript);
278 auto result = PCS::reduce_verify(
vk, shplonk_verifier_claim, verifier_transcript);
280 EXPECT_EQ(result,
true);
286 auto mle_opening_point = this->random_evaluation_point(log_n);
300 auto prover_opening_claims =
301 GeminiProver::prove(n, mock_claims.
polynomial_batcher, mle_opening_point,
ck, prover_transcript);
302 const auto opening_claim = ShplonkProver::prove(
ck, prover_opening_claims, prover_transcript);
303 PCS::compute_opening_proof(
ck, opening_claim, prover_transcript);
308 std::ranges::fill(padding_indicator_array,
Fr{ 1 });
310 const auto batch_opening_claim = ShpleminiVerifier::compute_batch_opening_claim(padding_indicator_array,
314 verifier_transcript);
316 auto result = PCS::reduce_verify_batch_opening_claim(batch_opening_claim,
vk, verifier_transcript);
319 EXPECT_EQ(result,
true);
325TEST_F(IPATest, ShpleminiIPAShiftsRemoval)
329 auto mle_opening_point = this->random_evaluation_point(log_n);
344 auto prover_opening_claims =
345 GeminiProver::prove(n, mock_claims.
polynomial_batcher, mle_opening_point,
ck, prover_transcript);
347 const auto opening_claim = ShplonkProver::prove(
ck, prover_opening_claims, prover_transcript);
348 PCS::compute_opening_proof(
ck, opening_claim, prover_transcript);
352 const size_t to_be_shifted_commitments_start = 2;
355 const size_t shifted_commitments_start = 4;
357 const size_t num_shifted_commitments = 2;
366 std::ranges::fill(padding_indicator_array,
Fr{ 1 });
368 const auto batch_opening_claim = ShpleminiVerifier::compute_batch_opening_claim(padding_indicator_array,
373 repeated_commitments);
375 auto result = PCS::reduce_verify_batch_opening_claim(batch_opening_claim,
vk, verifier_transcript);
376 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 & 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()