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);
268 const auto batch_opening_claim =
269 ShpleminiVerifier::compute_batch_opening_claim(
270 mock_claims.
claim_batcher, mle_opening_point,
vk.get_g1_identity(), verifier_transcript)
271 .batch_opening_claim;
273 auto result = PCS::reduce_verify_batch_opening_claim(batch_opening_claim,
vk, verifier_transcript);
275 EXPECT_EQ(result,
true);
282 auto mle_opening_point = this->random_evaluation_point(log_n);
295 auto prover_opening_claims =
296 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 const auto batch_opening_claim =
303 ShpleminiVerifier::compute_batch_opening_claim(
304 mock_claims.
claim_batcher, mle_opening_point,
vk.get_g1_identity(), verifier_transcript)
305 .batch_opening_claim;
307 auto result = PCS::reduce_verify_batch_opening_claim(batch_opening_claim,
vk, verifier_transcript);
310 EXPECT_EQ(result,
true);
313TEST_F(IPATest, ShpleminiIPAShiftsRemoval)
317 auto mle_opening_point = this->random_evaluation_point(log_n);
331 auto prover_opening_claims =
332 GeminiProver::prove(n, mock_claims.
polynomial_batcher, mle_opening_point,
ck, prover_transcript);
334 const auto opening_claim = ShplonkProver::prove(
ck, prover_opening_claims, prover_transcript);
335 PCS::compute_opening_proof(
ck, opening_claim, prover_transcript);
339 const size_t to_be_shifted_commitments_start = 2;
342 const size_t shifted_commitments_start = 4;
344 const size_t num_shifted_commitments = 2;
352 const auto batch_opening_claim = ShpleminiVerifier::compute_batch_opening_claim(mock_claims.
claim_batcher,
354 vk.get_g1_identity(),
356 repeated_commitments)
357 .batch_opening_claim;
359 auto result = PCS::reduce_verify_batch_opening_claim(batch_opening_claim,
vk, verifier_transcript);
360 EXPECT_EQ(result,
true);
365TEST_F(IPATest, BatchVerifyTwoValidProofs)
367 auto [claim1, proof1] = generate_random_proof();
368 auto [claim2, proof2] = generate_random_proof();
374 EXPECT_TRUE(PCS::batch_reduce_verify(
vk, claims, transcripts));
380 auto [claim, proof_data] = generate_random_proof();
388 auto [claim1, proof1] = generate_random_proof();
389 auto [claim2, proof2] = generate_random_proof();
392 claim2.opening_pair.evaluation +=
Fr::one();
398 EXPECT_FALSE(PCS::batch_reduce_verify(
vk, claims, transcripts));
401TEST_F(IPATest, BatchVerifyRejectsClaimTranscriptMismatch)
406 auto [claim1, proof1] = generate_random_proof();
407 auto [claim2, proof2] = generate_random_proof();
412 EXPECT_TRUE(PCS::batch_reduce_verify(
416 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()