25 using ClaimBatch = ClaimBatcher::Batch;
30 static constexpr size_t log_n = 7;
34 static constexpr size_t n = 1UL << log_n;
38 ck = create_commitment_key<CK>(n);
39 vk = create_verifier_commitment_key<VK>();
49 Commitment commitment =
ck.commit(poly);
52 PCS::compute_opening_proof(ck, { poly, { x, eval } }, prover_transcript);
53 return { { { x, eval }, commitment }, prover_transcript->export_proof() };
58 struct ResultOfProveVerify {
64 static ResultOfProveVerify run_native_prove_verify(
const Polynomial& poly,
const Fr x)
66 Commitment commitment =
ck.commit(poly);
70 PCS::compute_opening_proof(ck, { poly, { x, eval } }, prover_transcript);
75 bool result = PCS::reduce_verify(vk, { { x, eval }, commitment }, verifier_transcript);
76 return { result, prover_transcript, verifier_transcript };
90 auto x = this->random_element();
91 bool result = run_native_prove_verify(poly, x).result;
95TEST_F(IPATest, OpenManyZerosPolynomial)
101 for (
size_t i = 0; i < n / 2; ++i) {
102 poly_even.
at(2 * i) = this->random_element();
103 poly_odd.
at(2 * i + 1) = this->random_element();
105 auto x = this->random_element();
106 bool result_even = run_native_prove_verify(poly_even, x).result;
107 bool result_odd = run_native_prove_verify(poly_odd, x).result;
108 EXPECT_TRUE(result_even && result_odd);
117 bool result = run_native_prove_verify(poly, x).result;
126 auto x = this->random_element();
127 auto result_of_prove_verify = run_native_prove_verify(poly, x);
128 EXPECT_TRUE(result_of_prove_verify.result);
130 EXPECT_EQ(result_of_prove_verify.prover_transcript->get_manifest(),
131 result_of_prove_verify.verifier_transcript->get_manifest());
139 auto x = this->random_element();
140 auto initial_evaluation = poly.
evaluate(x);
141 auto change_in_linear_coefficient = initial_evaluation / x;
143 poly.
at(1) -= change_in_linear_coefficient;
146 bool result = run_native_prove_verify(poly, x).result;
153#if !defined(__wasm__)
159 auto [x, eval] = this->random_eval(poly);
160 auto commitment =
ck.commit(poly);
170 for (
size_t i = 0; i < num_challenges; i++) {
176 for (
size_t i = 0; i < num_challenges; i++) {
177 auto new_random_vector = random_vector;
179 transcript->initialize(new_random_vector);
180 EXPECT_ANY_THROW(PCS::compute_opening_proof<MockTranscript>(
ck, { poly, opening_pair }, transcript));
185 for (
size_t i = 0; i < num_challenges * 2; i++) {
186 lrs[i] = Curve::AffineElement::one();
190 for (
size_t i = 0; i < num_challenges; i++) {
191 auto new_random_vector = random_vector;
193 transcript->initialize(new_random_vector, lrs, {
uint256_t(n) });
194 EXPECT_ANY_THROW(PCS::reduce_verify(
vk, opening_claim, transcript));
203 for (
size_t i = 0; i < n / 2; i++) {
205 poly.
at(i + (n / 2)) = poly[i];
207 auto [x, eval] = this->random_eval(poly);
208 auto commitment =
ck.commit(poly);
214 const size_t num_challenges = log_n + 1;
218 for (
size_t i = 0; i < num_challenges; i++) {
225 transcript->initialize(random_vector);
228 PCS::compute_opening_proof<MockTranscript>(
ck, { poly, opening_pair }, transcript);
231 transcript->reset_indices();
234 EXPECT_TRUE(PCS::reduce_verify(
vk, opening_claim, transcript));
246 auto mle_opening_point = this->random_evaluation_point(log_n);
260 auto prover_opening_claims =
261 GeminiProver::prove(n, mock_claims.
polynomial_batcher, mle_opening_point,
ck, prover_transcript);
263 const auto opening_claim = ShplonkProver::prove(
ck, prover_opening_claims, prover_transcript);
264 PCS::compute_opening_proof(
ck, opening_claim, prover_transcript);
269 std::ranges::fill(padding_indicator_array,
Fr{ 1 });
271 const auto batch_opening_claim = ShpleminiVerifier::compute_batch_opening_claim(padding_indicator_array,
274 vk.get_g1_identity(),
276 .batch_opening_claim;
278 auto result = PCS::reduce_verify_batch_opening_claim(batch_opening_claim,
vk, verifier_transcript);
280 EXPECT_EQ(result,
true);
287 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,
313 vk.get_g1_identity(),
315 .batch_opening_claim;
317 auto result = PCS::reduce_verify_batch_opening_claim(batch_opening_claim,
vk, verifier_transcript);
320 EXPECT_EQ(result,
true);
323TEST_F(IPATest, ShpleminiIPAShiftsRemoval)
327 auto mle_opening_point = this->random_evaluation_point(log_n);
341 auto prover_opening_claims =
342 GeminiProver::prove(n, mock_claims.
polynomial_batcher, mle_opening_point,
ck, prover_transcript);
344 const auto opening_claim = ShplonkProver::prove(
ck, prover_opening_claims, prover_transcript);
345 PCS::compute_opening_proof(
ck, opening_claim, prover_transcript);
349 const size_t to_be_shifted_commitments_start = 2;
352 const size_t shifted_commitments_start = 4;
354 const size_t num_shifted_commitments = 2;
363 std::ranges::fill(padding_indicator_array,
Fr{ 1 });
365 const auto batch_opening_claim = ShpleminiVerifier::compute_batch_opening_claim(padding_indicator_array,
368 vk.get_g1_identity(),
370 repeated_commitments)
371 .batch_opening_claim;
373 auto result = PCS::reduce_verify_batch_opening_claim(batch_opening_claim,
vk, verifier_transcript);
374 EXPECT_EQ(result,
true);
379TEST_F(IPATest, BatchVerifyTwoValidProofs)
381 auto [claim1, proof1] = generate_random_proof();
382 auto [claim2, proof2] = generate_random_proof();
388 EXPECT_TRUE(PCS::batch_reduce_verify(
vk, claims, transcripts));
394 auto [claim, proof_data] = generate_random_proof();
402 auto [claim1, proof1] = generate_random_proof();
403 auto [claim2, proof2] = generate_random_proof();
406 claim2.opening_pair.evaluation +=
Fr::one();
412 EXPECT_FALSE(PCS::batch_reduce_verify(
vk, claims, transcripts));
415TEST_F(IPATest, BatchVerifyRejectsClaimTranscriptMismatch)
420 auto [claim1, proof1] = generate_random_proof();
421 auto [claim2, proof2] = generate_random_proof();
426 EXPECT_TRUE(PCS::batch_reduce_verify(
430 EXPECT_FALSE(PCS::batch_reduce_verify(
static std::shared_ptr< BaseTranscript > test_prover_init_empty()
For testing: initializes transcript with some arbitrary data so that a challenge can be generated aft...
static std::shared_ptr< BaseTranscript > test_verifier_init_empty(const std::shared_ptr< BaseTranscript > &transcript)
For testing: initializes transcript based on proof data then receives junk data produced by BaseTrans...
std::vector< DataType > Proof
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 .....
static Polynomial random(size_t size, size_t start_index=0)
Fr evaluate(const Fr &z) const
Fr & at(size_t index)
Our mutable accessor, unlike operator[]. We abuse precedent a bit to differentiate at() and operator[...
Representation of the Grumpkin Verifier Commitment Key inside a bn254 circuit.
typename Group::element Element
typename Group::affine_element AffineElement
void generate_proof(uint256_t inputs[])
TEST_F(IPATest, OpenZeroPolynomial)
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()