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>();
42 struct ResultOfProveVerify {
48 static ResultOfProveVerify run_native_prove_verify(
const Polynomial& poly,
const Fr x)
50 Commitment commitment =
ck.commit(poly);
57 PCS::compute_opening_proof(ck, { poly, opening_pair }, prover_transcript);
62 bool result = PCS::reduce_verify(vk, opening_claim, verifier_transcript);
63 return { result, prover_transcript, verifier_transcript };
77 auto x = this->random_element();
78 bool result = run_native_prove_verify(poly, x).result;
82TEST_F(IPATest, OpenManyZerosPolynomial)
88 for (
size_t i = 0; i < n / 2; ++i) {
89 poly_even.
at(2 * i) = this->random_element();
90 poly_odd.
at(2 * i + 1) = this->random_element();
92 auto x = this->random_element();
93 bool result_even = run_native_prove_verify(poly_even, x).result;
94 bool result_odd = run_native_prove_verify(poly_odd, x).result;
95 EXPECT_TRUE(result_even && result_odd);
104 bool result = run_native_prove_verify(poly, x).result;
113 auto x = this->random_element();
114 auto result_of_prove_verify = run_native_prove_verify(poly, x);
115 EXPECT_TRUE(result_of_prove_verify.result);
117 EXPECT_EQ(result_of_prove_verify.prover_transcript->get_manifest(),
118 result_of_prove_verify.verifier_transcript->get_manifest());
126 auto x = this->random_element();
127 auto initial_evaluation = poly.
evaluate(x);
128 auto change_in_linear_coefficient = initial_evaluation / x;
130 poly.
at(1) -= change_in_linear_coefficient;
133 bool result = run_native_prove_verify(poly, x).result;
140#if !defined(__wasm__)
146 auto [x, eval] = this->random_eval(poly);
147 auto commitment =
ck.commit(poly);
157 for (
size_t i = 0; i < num_challenges; i++) {
163 for (
size_t i = 0; i < num_challenges; i++) {
164 auto new_random_vector = random_vector;
166 transcript->initialize(new_random_vector);
167 EXPECT_ANY_THROW(PCS::compute_opening_proof<MockTranscript>(
ck, { poly, opening_pair }, transcript));
172 for (
size_t i = 0; i < num_challenges * 2; i++) {
173 lrs[i] = Curve::AffineElement::one();
177 for (
size_t i = 0; i < num_challenges; i++) {
178 auto new_random_vector = random_vector;
180 transcript->initialize(new_random_vector, lrs, {
uint256_t(n) });
181 EXPECT_ANY_THROW(PCS::reduce_verify(
vk, opening_claim, transcript));
190 for (
size_t i = 0; i < n / 2; i++) {
192 poly.
at(i + (n / 2)) = poly[i];
194 auto [x, eval] = this->random_eval(poly);
195 auto commitment =
ck.commit(poly);
201 const size_t num_challenges = log_n + 1;
205 for (
size_t i = 0; i < num_challenges; i++) {
212 transcript->initialize(random_vector);
215 PCS::compute_opening_proof<MockTranscript>(
ck, { poly, opening_pair }, transcript);
218 transcript->reset_indices();
221 EXPECT_TRUE(PCS::reduce_verify(
vk, opening_claim, transcript));
233 auto mle_opening_point = this->random_evaluation_point(log_n);
247 auto prover_opening_claims =
248 GeminiProver::prove(n, mock_claims.
polynomial_batcher, mle_opening_point,
ck, prover_transcript);
250 const auto opening_claim = ShplonkProver::prove(
ck, prover_opening_claims, prover_transcript);
251 PCS::compute_opening_proof(
ck, opening_claim, prover_transcript);
256 std::ranges::fill(padding_indicator_array,
Fr{ 1 });
258 const auto batch_opening_claim = ShpleminiVerifier::compute_batch_opening_claim(padding_indicator_array,
261 vk.get_g1_identity(),
263 .batch_opening_claim;
265 auto result = PCS::reduce_verify_batch_opening_claim(batch_opening_claim,
vk, verifier_transcript);
267 EXPECT_EQ(result,
true);
274 auto mle_opening_point = this->random_evaluation_point(log_n);
287 auto prover_opening_claims =
288 GeminiProver::prove(n, mock_claims.
polynomial_batcher, mle_opening_point,
ck, prover_transcript);
289 const auto opening_claim = ShplonkProver::prove(
ck, prover_opening_claims, prover_transcript);
290 PCS::compute_opening_proof(
ck, opening_claim, prover_transcript);
295 std::ranges::fill(padding_indicator_array,
Fr{ 1 });
297 const auto batch_opening_claim = ShpleminiVerifier::compute_batch_opening_claim(padding_indicator_array,
300 vk.get_g1_identity(),
302 .batch_opening_claim;
304 auto result = PCS::reduce_verify_batch_opening_claim(batch_opening_claim,
vk, verifier_transcript);
307 EXPECT_EQ(result,
true);
310TEST_F(IPATest, ShpleminiIPAShiftsRemoval)
314 auto mle_opening_point = this->random_evaluation_point(log_n);
328 auto prover_opening_claims =
329 GeminiProver::prove(n, mock_claims.
polynomial_batcher, mle_opening_point,
ck, prover_transcript);
331 const auto opening_claim = ShplonkProver::prove(
ck, prover_opening_claims, prover_transcript);
332 PCS::compute_opening_proof(
ck, opening_claim, prover_transcript);
336 const size_t to_be_shifted_commitments_start = 2;
339 const size_t shifted_commitments_start = 4;
341 const size_t num_shifted_commitments = 2;
350 std::ranges::fill(padding_indicator_array,
Fr{ 1 });
352 const auto batch_opening_claim = ShpleminiVerifier::compute_batch_opening_claim(padding_indicator_array,
355 vk.get_g1_identity(),
357 repeated_commitments)
358 .batch_opening_claim;
360 auto result = PCS::reduce_verify_batch_opening_claim(batch_opening_claim,
vk, verifier_transcript);
361 EXPECT_EQ(result,
true);
static std::shared_ptr< BaseTranscript > prover_init_empty()
For testing: initializes transcript with some arbitrary data so that a challenge can be generated aft...
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...
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, 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[...
Representation of the Grumpkin Verifier Commitment Key inside a bn254 circuit.
typename Group::element Element
typename Group::affine_element AffineElement
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, shifted and interleaved polynomials in Shplem...
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()