3#include "../gemini/gemini.hpp"
4#include "../kzg/kzg.hpp"
5#include "../pcs_test_utils.hpp"
6#include "../shplonk/shplonk.hpp"
13#include <gtest/gtest.h>
21 static constexpr size_t log_n = 9;
22 static constexpr size_t n = 1UL <<
log_n;
31 using Fr =
typename Flavor::Curve::ScalarField;
33 using Commitment =
typename Flavor::Curve::AffineElement;
45 std::vector<Fr>& mle_opening_point,
47 const Fr& honest_inner_product);
74template <
class Flavor>
81 const typename Flavor::Curve::ScalarField& honest_inner_product)
87 static constexpr size_t SUBGROUP_SIZE = Flavor::SUBGROUP_SIZE;
93 while (delta ==
Fr(0)) {
96 const Fr c = -delta / (g -
Fr(1));
98 const Fr forged_inner_product = honest_inner_product + delta_s;
101 prover_transcript->send_to_verifier(
"Libra:claimed_evaluation", forged_inner_product);
107 zk_sumcheck_data, mle_opening_point, honest_inner_product, prover_transcript,
ck);
119 for (
size_t i = 1; i < SUBGROUP_SIZE; ++i) {
120 H_domain[i] = H_domain[i - 1] * g;
122 std::vector<Fr> delta_A_lagrange(SUBGROUP_SIZE, c);
123 delta_A_lagrange[0] = delta;
128 std::vector<Fr> L_1_lag(SUBGROUP_SIZE,
Fr(0));
132 std::vector<Fr> L_H_lag(SUBGROUP_SIZE,
Fr(0));
133 L_H_lag[SUBGROUP_SIZE - 1] =
Fr(1);
138 std::vector<Fr> delta_A_shifted(SUBGROUP_SIZE);
139 for (
size_t i = 0; i < SUBGROUP_SIZE; ++i) {
140 delta_A_shifted[i] = delta_A.
at(i) * H_domain[i];
144 std::vector<Fr> delta_C(2 * SUBGROUP_SIZE,
Fr(0));
145 for (
size_t i = 0; i < SUBGROUP_SIZE; ++i) {
146 for (
size_t j = 0; j < SUBGROUP_SIZE; ++j) {
147 delta_C[i + j] += L_1.
at(i) * delta_A.
at(j);
150 for (
size_t i = 0; i < SUBGROUP_SIZE; ++i) {
151 for (
size_t j = 0; j < SUBGROUP_SIZE; ++j) {
152 delta_C[i + j] += L_H.
at(i) * delta_A.
at(j);
154 delta_C[i] -= L_H.
at(i) * delta_s;
156 for (
size_t i = 0; i < SUBGROUP_SIZE; ++i) {
157 const Fr u_i = delta_A_shifted[i] - delta_A.
at(i);
158 delta_C[i + 1] += u_i;
159 delta_C[i] -= g_inv * u_i;
163 std::vector<Fr> delta_Q_coeffs(SUBGROUP_SIZE,
Fr(0));
164 for (
size_t i = 2 * SUBGROUP_SIZE; i-- > SUBGROUP_SIZE;) {
165 delta_Q_coeffs[i - SUBGROUP_SIZE] = delta_C[i];
166 delta_C[i - SUBGROUP_SIZE] += delta_C[i];
169 for (
size_t i = 0; i < SUBGROUP_SIZE; ++i) {
170 BB_ASSERT_EQ(delta_C[i],
Fr(0),
"delta_C is not divisible by Z_H — perturbation is malformed.");
177 for (
size_t i = 0; i < SUBGROUP_SIZE; ++i) {
178 A_forged.
at(i) += delta_A.
at(i);
179 Q_forged.
at(i) += delta_Q.
at(i);
183 prover_transcript->send_to_verifier(
"Libra:grand_sum_commitment",
ck.commit(A_forged));
184 prover_transcript->send_to_verifier(
"Libra:quotient_commitment",
ck.commit(Q_forged));
195 const auto opening_claim = ShpleminiProver::prove(
196 this->n, mock_claims.
polynomial_batcher, mle_opening_point,
ck, prover_transcript, forged_witness);
199 return forged_inner_product;
213 static constexpr size_t n = 1UL <<
log_n;
219 using Curve =
typename TypeParam::Curve;
223 using CK =
typename TypeParam::CommitmentKey;
225 CK
ck = create_commitment_key<CK>(this->n);
234 auto mle_opening_point = this->random_evaluation_point(this->log_n);
237 this->num_polynomials,
246 auto update_batched_eval = [&](
Fr& batched_eval,
const std::vector<Fr>& evaluations,
Fr& rho_power) {
247 for (
auto& eval : evaluations) {
248 batched_eval += eval * rho_power;
254 Fr batched_evaluation(0);
255 update_batched_eval(batched_evaluation, mock_claims.
unshifted.
evals, rho_power);
259 auto compute_batched_commitment = [&](
const std::vector<Commitment>& commitments,
Fr& rho_power) {
260 GroupElement batched = GroupElement::zero();
261 for (
auto& comm : commitments) {
262 batched += comm * rho_power;
270 GroupElement batched_commitment_unshifted =
272 GroupElement batched_commitment_to_be_shifted =
276 GroupElement to_be_shifted_contribution = batched_commitment_to_be_shifted * gemini_eval_challenge.
invert();
278 GroupElement commitment_to_univariate_pos = batched_commitment_unshifted + to_be_shifted_contribution;
280 GroupElement commitment_to_univariate_neg = batched_commitment_unshifted - to_be_shifted_contribution;
283 commitment_to_univariate_pos * (shplonk_eval_challenge - gemini_eval_challenge).invert() +
284 commitment_to_univariate_neg *
285 (shplonk_batching_challenge * (shplonk_eval_challenge + gemini_eval_challenge).invert());
288 std::vector<Commitment> commitments;
289 std::vector<Fr> scalars;
290 Fr verifier_batched_evaluation{ 0 };
292 Fr inverted_vanishing_eval_pos = (shplonk_eval_challenge - gemini_eval_challenge).invert();
293 Fr inverted_vanishing_eval_neg = (shplonk_eval_challenge + gemini_eval_challenge).invert();
295 std::vector<Fr> inverted_vanishing_evals = { inverted_vanishing_eval_pos, inverted_vanishing_eval_neg };
298 inverted_vanishing_evals, shplonk_batching_challenge, gemini_eval_challenge);
301 commitments, scalars, verifier_batched_evaluation, rho);
304 GroupElement shplemini_result = GroupElement::batch_mul(commitments, scalars);
306 EXPECT_EQ(commitments.size(),
308 EXPECT_EQ(batched_evaluation, verifier_batched_evaluation);
313 using Curve = TypeParam::Curve;
321 using CK =
typename TypeParam::CommitmentKey;
323 CK
ck = create_commitment_key<CK>(this->n);
330 std::vector<Fr> shplonk_batching_challenge_powers =
331 compute_shplonk_batching_challenge_powers(shplonk_batching_challenge, this->log_n);
335 std::vector<Fr> mle_opening_point = this->random_evaluation_point(this->log_n);
338 this->num_polynomials,
351 auto fold_polynomials = GeminiProver::compute_fold_polynomials(this->log_n, mle_opening_point, batched);
353 std::vector<Commitment> prover_commitments;
354 for (
size_t l = 0; l < this->log_n - 1; ++l) {
355 auto commitment =
ck.commit(fold_polynomials[l]);
356 prover_commitments.emplace_back(commitment);
359 auto [A_0_pos, A_0_neg] =
362 const auto opening_claims = GeminiProver::construct_univariate_opening_claims(
365 std::vector<Fr> prover_evaluations;
366 for (
size_t l = 0; l < this->log_n; ++l) {
367 const auto& evaluation = opening_claims[l + 1].opening_pair.evaluation;
368 prover_evaluations.emplace_back(evaluation);
374 std::vector<Fr> expected_inverse_vanishing_evals;
375 expected_inverse_vanishing_evals.reserve(2 * this->log_n);
377 for (
size_t idx = 0; idx < this->log_n; idx++) {
378 expected_inverse_vanishing_evals.emplace_back((shplonk_eval_challenge - r_squares[idx]).invert());
379 expected_inverse_vanishing_evals.emplace_back((shplonk_eval_challenge + r_squares[idx]).invert());
382 Fr current_challenge{ shplonk_batching_challenge * shplonk_batching_challenge };
383 for (
size_t idx = 0; idx < prover_commitments.size(); ++idx) {
384 expected_result -= prover_commitments[idx] * current_challenge * expected_inverse_vanishing_evals[2 * idx + 2];
385 current_challenge *= shplonk_batching_challenge;
386 expected_result -= prover_commitments[idx] * current_challenge * expected_inverse_vanishing_evals[2 * idx + 3];
387 current_challenge *= shplonk_batching_challenge;
391 std::vector<Fr> inverse_vanishing_evals =
392 ShplonkVerifier::compute_inverted_gemini_denominators(shplonk_eval_challenge, r_squares);
394 Fr expected_constant_term_accumulator{ 0 };
397 expected_constant_term_accumulator, mle_opening_point, r_squares, prover_evaluations);
398 std::vector<Commitment> commitments;
399 std::vector<Fr> scalars;
401 ShpleminiVerifier::batch_gemini_claims_received_from_prover(prover_commitments,
403 gemini_fold_pos_evaluations,
404 inverse_vanishing_evals,
405 shplonk_batching_challenge_powers,
408 expected_constant_term_accumulator);
411 GroupElement shplemini_result = GroupElement::batch_mul(commitments, scalars);
424 using Curve = TypeParam::Curve;
426 constexpr bool HasZK =
true;
430 using CK =
typename TypeParam::CommitmentKey;
433 auto prover_transcript = TypeParam::Transcript::test_prover_init_empty();
437 CK
ck = create_commitment_key<CK>(
std::max<size_t>(this->n, 1ULL << (log_subgroup_size + 1)));
440 ZKData zk_sumcheck_data(this->log_n, prover_transcript,
ck);
443 std::vector<Fr> mle_opening_point = this->random_evaluation_point(this->log_n);
447 this->num_polynomials,
454 zk_sumcheck_data, mle_opening_point, this->log_n);
456 prover_transcript->send_to_verifier(
"Libra:claimed_evaluation", claimed_inner_product);
460 zk_sumcheck_data, mle_opening_point, claimed_inner_product, prover_transcript,
ck);
461 small_subgroup_ipa_prover.
prove();
464 const auto opening_claim = ShpleminiProver::prove(this->n,
477 std::array<Commitment, NUM_SMALL_IPA_COMMITMENTS> libra_commitments = {};
478 libra_commitments[0] =
479 verifier_transcript->template receive_from_prover<Commitment>(
"Libra:concatenation_commitment");
482 const Fr libra_total_sum = verifier_transcript->template receive_from_prover<Fr>(
"Libra:Sum");
483 const Fr libra_challenge = verifier_transcript->template get_challenge<Fr>(
"Libra:Challenge");
484 const Fr libra_evaluation = verifier_transcript->template receive_from_prover<Fr>(
"Libra:claimed_evaluation");
487 EXPECT_EQ(libra_total_sum, zk_sumcheck_data.libra_total_sum);
488 EXPECT_EQ(libra_challenge, zk_sumcheck_data.libra_challenge);
489 EXPECT_EQ(libra_evaluation, claimed_inner_product);
492 libra_commitments[1] = verifier_transcript->template receive_from_prover<Commitment>(
"Libra:grand_sum_commitment");
493 libra_commitments[2] = verifier_transcript->template receive_from_prover<Commitment>(
"Libra:quotient_commitment");
496 auto [batch_opening_claim, consistency_checked] =
497 ShpleminiVerifier::compute_batch_opening_claim(mock_claims.
claim_batcher,
499 this->vk().get_g1_identity(),
505 const auto pairing_points =
508 EXPECT_EQ(pairing_points.check(),
true);
509 EXPECT_EQ(consistency_checked,
true);
521 using Curve = TypeParam::Curve;
524 using CK =
typename TypeParam::CommitmentKey;
527 constexpr bool HasZK =
true;
530 CK
ck = create_commitment_key<CK>(4096);
533 std::vector<Fr> challenge = this->random_evaluation_point(this->log_n);
535 auto prover_transcript = TypeParam::Transcript::test_prover_init_empty();
543 mock_claims.template compute_sumcheck_opening_data<TypeParam>(
544 this->log_n, this->sumcheck_univariate_length, challenge,
ck);
547 const Fr claimed_inner_product =
550 prover_transcript->send_to_verifier(
"Libra:claimed_evaluation", claimed_inner_product);
554 zk_sumcheck_data, challenge, claimed_inner_product, prover_transcript,
ck);
555 small_subgroup_ipa_prover.
prove();
558 const auto opening_claim = ShpleminiProver::prove(this->n,
572 std::array<Commitment, NUM_SMALL_IPA_COMMITMENTS> libra_commitments = {};
573 libra_commitments[0] =
574 verifier_transcript->template receive_from_prover<Commitment>(
"Libra:concatenation_commitment");
577 const Fr libra_total_sum = verifier_transcript->template receive_from_prover<Fr>(
"Libra:Sum");
578 const Fr libra_challenge = verifier_transcript->template get_challenge<Fr>(
"Libra:Challenge");
579 const Fr libra_evaluation = verifier_transcript->template receive_from_prover<Fr>(
"Libra:claimed_evaluation");
584 EXPECT_EQ(libra_evaluation, claimed_inner_product);
587 libra_commitments[1] = verifier_transcript->template receive_from_prover<Commitment>(
"Libra:grand_sum_commitment");
588 libra_commitments[2] = verifier_transcript->template receive_from_prover<Commitment>(
"Libra:quotient_commitment");
591 auto batch_opening_claim = ShpleminiVerifier::compute_batch_opening_claim(mock_claims.
claim_batcher,
593 this->vk().get_g1_identity(),
600 .batch_opening_claim;
602 const auto pairing_points =
605 EXPECT_EQ(pairing_points.check(),
true);
620 using Curve =
typename TypeParam::Curve;
622 using CK =
typename TypeParam::CommitmentKey;
629 static constexpr size_t small_log_n = 3;
630 CK
ck = create_commitment_key<CK>(this->n);
633 auto u = this->random_evaluation_point(small_log_n);
644 const Fr tail = ((
Fr(1) - u[0]) * (
Fr(1) - u[1])).
invert();
645 poly.
at(4) = claimed_multilinear_eval * tail / u[2];
646 poly.
at(this->n - 8) = tail;
647 poly.
at(this->n - 4) = -tail * (
Fr(1) - u[2]) / u[2];
650 this->n, std::vector{
std::move(poly) }, std::vector<Fr>{ claimed_multilinear_eval },
ck);
655 const auto opening_claim =
656 ShpleminiProver::prove(this->n, mock_claims.polynomial_batcher, u,
ck, prover_transcript);
664 auto batch_opening_claim = ShpleminiVerifier::compute_batch_opening_claim(
665 mock_claims.claim_batcher, u,
this->vk().get_g1_identity(), verifier_transcript)
666 .batch_opening_claim;
669 const auto pairing_points =
671 EXPECT_EQ(pairing_points.check(),
true);
686 using Curve =
typename TypeParam::Curve;
688 using CK =
typename TypeParam::CommitmentKey;
694 static constexpr size_t big_n = 1UL << 12;
695 static constexpr size_t small_log_n = 3;
696 static constexpr size_t big_ck_size = 1 << 14;
697 CK
ck = create_commitment_key<CK>(big_ck_size);
703 auto u = this->random_evaluation_point(small_log_n);
709 big_n, std::vector{
std::move(poly) }, std::vector<Fr>{ claimed_multilinear_eval },
ck);
714 const auto opening_claim = ShpleminiProver::prove(big_n, mock_claims.polynomial_batcher, u,
ck, prover_transcript);
722 auto batch_opening_claim = ShpleminiVerifier::compute_batch_opening_claim(
723 mock_claims.claim_batcher, u,
this->vk().get_g1_identity(), verifier_transcript)
724 .batch_opening_claim;
727 const auto pairing_points =
729 EXPECT_EQ(pairing_points.check(),
false);
752 using Curve =
typename TypeParam::Curve;
756 using CK =
typename TypeParam::CommitmentKey;
760 CK
ck = create_commitment_key<CK>(this->n);
762 auto mle_opening_point = this->random_evaluation_point(this->log_n);
765 this->num_polynomials,
772 const auto opening_claim =
773 ShpleminiProver::prove(this->n, mock_claims.
polynomial_batcher, mle_opening_point,
ck, prover_transcript);
785 const Commitment g1_identity = this->
vk().get_g1_identity();
788 Fr lagrange0_at_u =
Fr(1);
789 for (
const auto& u_i : mle_opening_point) {
790 lagrange0_at_u *= (
Fr(1) - u_i);
792 const size_t unshifted_idx = this->num_polynomials - this->num_shiftable;
799 auto batch_opening_claim = ShpleminiVerifier::compute_batch_opening_claim(
800 mock_claims.
claim_batcher, mle_opening_point, g1_identity, verifier_transcript)
801 .batch_opening_claim;
803 const auto pairing_points =
805 EXPECT_EQ(pairing_points.check(),
false);
811 EXPECT_EQ(prover_transcript->template get_challenge<Fr>(
"transcript_sync_check"),
812 verifier_transcript->template get_challenge<Fr>(
"transcript_sync_check"));
823 using Curve =
typename TypeParam::Curve;
825 constexpr bool HasZK =
true;
829 using CK =
typename TypeParam::CommitmentKey;
832 auto prover_transcript = TypeParam::Transcript::test_prover_init_empty();
836 CK
ck = create_commitment_key<CK>(
std::max<size_t>(this->n, 1ULL << (log_subgroup_size + 1)));
839 ZKData zk_sumcheck_data(this->log_n, prover_transcript,
ck);
842 std::vector<Fr> mle_opening_point = this->random_evaluation_point(this->log_n);
846 this->num_polynomials,
853 zk_sumcheck_data, mle_opening_point, this->log_n);
857 prover_transcript->send_to_verifier(
"Libra:claimed_evaluation", corrupted_inner_product);
862 zk_sumcheck_data, mle_opening_point, corrupted_inner_product, prover_transcript,
ck);
863 small_subgroup_ipa_prover.
prove();
866 const auto opening_claim = ShpleminiProver::prove(this->n,
879 std::array<Commitment, NUM_SMALL_IPA_COMMITMENTS> libra_commitments = {};
880 libra_commitments[0] =
881 verifier_transcript->template receive_from_prover<Commitment>(
"Libra:concatenation_commitment");
884 [[maybe_unused]]
const Fr libra_total_sum = verifier_transcript->template receive_from_prover<Fr>(
"Libra:Sum");
885 [[maybe_unused]]
const Fr libra_challenge = verifier_transcript->template get_challenge<Fr>(
"Libra:Challenge");
887 const Fr libra_evaluation = verifier_transcript->template receive_from_prover<Fr>(
"Libra:claimed_evaluation");
890 libra_commitments[1] = verifier_transcript->template receive_from_prover<Commitment>(
"Libra:grand_sum_commitment");
891 libra_commitments[2] = verifier_transcript->template receive_from_prover<Commitment>(
"Libra:quotient_commitment");
894 auto shplemini_output = ShpleminiVerifier::compute_batch_opening_claim(mock_claims.
claim_batcher,
896 this->vk().get_g1_identity(),
903 EXPECT_FALSE(shplemini_output.consistency_checked);
913template <
typename TypeParam>
917 bool expected_consistency_checked)
922 using Curve =
typename TypeParam::Curve;
924 constexpr bool HasZK =
true;
928 using CK =
typename TypeParam::CommitmentKey;
930 auto prover_transcript = TypeParam::Transcript::test_prover_init_empty();
933 CK
ck = create_commitment_key<CK>(
std::max<size_t>(test->
n, 1ULL << (log_subgroup_size + 1)));
935 ZKData zk_sumcheck_data(test->
log_n, prover_transcript,
ck);
941 zk_sumcheck_data, mle_opening_point, test->
log_n);
943 prover_transcript->send_to_verifier(
"Libra:claimed_evaluation", claimed_inner_product);
946 zk_sumcheck_data, mle_opening_point, claimed_inner_product, prover_transcript,
ck);
947 small_subgroup_ipa_prover.
prove();
952 if (tamper_polynomial != TamperedPolynomial::None) {
953 witness_polynomials[
static_cast<size_t>(tamper_polynomial)].at(0) +=
Fr::random_element();
957 const auto opening_claim = ShpleminiProver::prove(
958 test->
n, mock_claims.
polynomial_batcher, mle_opening_point,
ck, prover_transcript, witness_polynomials);
964 std::array<Commitment, NUM_SMALL_IPA_COMMITMENTS> libra_commitments = {};
965 libra_commitments[0] =
966 verifier_transcript->template receive_from_prover<Commitment>(
"Libra:concatenation_commitment");
968 [[maybe_unused]]
const Fr libra_total_sum = verifier_transcript->template receive_from_prover<Fr>(
"Libra:Sum");
969 [[maybe_unused]]
const Fr libra_challenge = verifier_transcript->template get_challenge<Fr>(
"Libra:Challenge");
970 const Fr libra_evaluation = verifier_transcript->template receive_from_prover<Fr>(
"Libra:claimed_evaluation");
972 libra_commitments[1] = verifier_transcript->template receive_from_prover<Commitment>(
"Libra:grand_sum_commitment");
973 libra_commitments[2] = verifier_transcript->template receive_from_prover<Commitment>(
"Libra:quotient_commitment");
976 if (tamper_commitment != TamperedCommitment::None) {
977 auto idx =
static_cast<size_t>(tamper_commitment);
978 libra_commitments[idx] = libra_commitments[idx] + Commitment::one();
981 auto [batch_opening_claim, consistency_checked] =
982 ShpleminiVerifier::compute_batch_opening_claim(mock_claims.
claim_batcher,
984 test->
vk().get_g1_identity(),
990 EXPECT_EQ(consistency_checked, expected_consistency_checked);
993 const auto pairing_points =
995 EXPECT_FALSE(pairing_points.check());
1003 using TamperedPolynomial =
typename TestFixture::TamperedPolynomial;
1004 using TamperedCommitment =
typename TestFixture::TamperedCommitment;
1007 this, TamperedPolynomial::Quotient, TamperedCommitment::None,
false);
1015 using TamperedPolynomial =
typename TestFixture::TamperedPolynomial;
1016 using TamperedCommitment =
typename TestFixture::TamperedCommitment;
1019 this, TamperedPolynomial::None, TamperedCommitment::Quotient,
true);
1027 using TamperedPolynomial =
typename TestFixture::TamperedPolynomial;
1028 using TamperedCommitment =
typename TestFixture::TamperedCommitment;
1031 this, TamperedPolynomial::None, TamperedCommitment::GrandSum,
true);
1039 using TamperedPolynomial =
typename TestFixture::TamperedPolynomial;
1040 using TamperedCommitment =
typename TestFixture::TamperedCommitment;
1043 this, TamperedPolynomial::Concatenated, TamperedCommitment::None,
false);
1051 using TamperedPolynomial =
typename TestFixture::TamperedPolynomial;
1052 using TamperedCommitment =
typename TestFixture::TamperedCommitment;
1055 this, TamperedPolynomial::None, TamperedCommitment::Concatenated,
true);
1070 using Curve =
typename TypeParam::Curve;
1071 constexpr bool HasZK =
true;
1075 using CK =
typename TypeParam::CommitmentKey;
1077 static constexpr size_t SUBGROUP_SIZE = TypeParam::SUBGROUP_SIZE;
1078 auto prover_transcript = TypeParam::Transcript::test_prover_init_empty();
1080 static constexpr size_t log_subgroup_size =
static_cast<size_t>(
numeric::get_msb(SUBGROUP_SIZE));
1081 CK
ck = create_commitment_key<CK>(
std::max<size_t>(this->n, 1ULL << (log_subgroup_size + 1)));
1083 ZKData zk_sumcheck_data(this->log_n, prover_transcript,
ck);
1084 std::vector<Fr> mle_opening_point = this->random_evaluation_point(this->log_n);
1088 zk_sumcheck_data, mle_opening_point, this->log_n);
1090 const Fr forged_inner_product = this->run_forged_small_ipa_prover(
1091 prover_transcript,
ck, zk_sumcheck_data, mle_opening_point, mock_claims, honest_inner_product);
1096 std::array<Commitment, NUM_SMALL_IPA_COMMITMENTS> libra_commitments = {};
1097 libra_commitments[0] =
1098 verifier_transcript->template receive_from_prover<Commitment>(
"Libra:concatenation_commitment");
1099 [[maybe_unused]]
const Fr libra_total_sum = verifier_transcript->template receive_from_prover<Fr>(
"Libra:Sum");
1100 [[maybe_unused]]
const Fr libra_challenge = verifier_transcript->template get_challenge<Fr>(
"Libra:Challenge");
1101 const Fr libra_evaluation = verifier_transcript->template receive_from_prover<Fr>(
"Libra:claimed_evaluation");
1102 libra_commitments[1] = verifier_transcript->template receive_from_prover<Commitment>(
"Libra:grand_sum_commitment");
1103 libra_commitments[2] = verifier_transcript->template receive_from_prover<Commitment>(
"Libra:quotient_commitment");
1105 EXPECT_EQ(libra_evaluation, forged_inner_product);
1106 EXPECT_NE(libra_evaluation, honest_inner_product);
1108 auto [batch_opening_claim, consistency_checked] =
1109 ShpleminiVerifier::compute_batch_opening_claim(mock_claims.
claim_batcher,
1111 this->vk().get_g1_identity(),
1112 verifier_transcript,
1118 EXPECT_TRUE(consistency_checked);
1122 const auto pairing_points =
1124 EXPECT_FALSE(pairing_points.check());
#define BB_ASSERT_EQ(actual, expected,...)
#define BB_DISABLE_ASSERTS()
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...
CommitmentKey object over a pairing group 𝔾₁.
std::vector< Fr > random_evaluation_point(const size_t num_variables)
bb::CommitmentKey< Curve > CommitmentKey
Polynomial compute_batched(const Fr &challenge)
Compute batched polynomial A₀ = F + G/X as the linear combination of all polynomials to be opened,...
std::pair< Polynomial, Polynomial > compute_partially_evaluated_batch_polynomials(const Fr &r_challenge)
Compute partially evaluated batched polynomials A₀(X, r) = A₀₊ = F + G/r, A₀(X, -r) = A₀₋ = F - G/r.
static std::vector< Fr > compute_fold_pos_evaluations(const Fr &batched_evaluation, std::span< const Fr > evaluation_point, std::span< const Fr > challenge_powers, std::span< const Fr > fold_neg_evals)
Compute .
static PairingPointsType reduce_verify_batch_opening_claim(BatchOpeningClaim< Curve > batch_opening_claim, const std::shared_ptr< Transcript > &transcript, const size_t expected_final_msm_size=0)
Computes the input points for the pairing check needed to verify a KZG opening claim obtained from a ...
static void compute_opening_proof(const CK &ck, const ProverOpeningClaim< Curve > &opening_claim, const std::shared_ptr< Transcript > &prover_trancript)
Computes the KZG commitment to an opening proof polynomial at a single evaluation point.
static Polynomial random(size_t size, size_t start_index=0)
Fr & at(size_t index)
Our mutable accessor, unlike operator[]. We abuse precedent a bit to differentiate at() and operator[...
static constexpr size_t n
static constexpr size_t log_n
static constexpr size_t n
Fr run_forged_small_ipa_prover(const std::shared_ptr< typename Flavor::Transcript > &prover_transcript, CK &ck, ZKSumcheckData< Flavor > &zk_sumcheck_data, std::vector< Fr > &mle_opening_point, MockClaimGenerator< typename Flavor::Curve > &mock_claims, const Fr &honest_inner_product)
Simulated malicious prover for the Shplemini + SmallSubgroupIPA soundness regression.
typename Flavor::Curve::ScalarField Fr
static constexpr size_t num_polynomials
typename Flavor::CommitmentKey CK
typename Flavor::Curve::AffineElement Commitment
static constexpr size_t log_n
static constexpr size_t sumcheck_univariate_length
static constexpr size_t num_shiftable
typename Flavor::Curve::Element GroupElement
A Curve-agnostic ZK protocol to prove inner products of small vectors.
std::array< bb::Polynomial< FF >, NUM_SMALL_IPA_COMMITMENTS > get_witness_polynomials() const
void compute_grand_sum_polynomial()
Computes the grand sum polynomial .
void compute_grand_sum_identity_quotient()
Efficiently compute the quotient of the grand sum identity polynomial by .
static FF compute_claimed_inner_product(ZKSumcheckData< Flavor > &zk_sumcheck_data, const std::vector< FF > &multivariate_challenge, const size_t &log_circuit_size)
For test purposes: Compute the sum of the Libra constant term and Libra univariates evaluated at Sumc...
void compute_grand_sum_identity_polynomial()
Compute , where is the fixed generator of .
void prove()
Compute the derived witnesses and and commit to them.
typename Group::element Element
static constexpr size_t SUBGROUP_SIZE
static constexpr ScalarField subgroup_generator_inverse
typename Group::affine_element AffineElement
static constexpr ScalarField subgroup_generator
std::vector< Fr > powers_of_evaluation_challenge(const Fr &r, const size_t num_squares)
Compute squares of folding challenge r.
std::vector< Fr > powers_of_rho(const Fr &rho, const size_t num_powers)
Compute powers of challenge ρ
constexpr T get_msb(const T in)
Entry point for Barretenberg command-line interface.
constexpr size_t NUM_SMALL_IPA_COMMITMENTS
TYPED_TEST_SUITE(CommitmentKeyTest, Curves)
TYPED_TEST(CommitmentKeyTest, CommitToZeroPoly)
void run_libra_tampering_test(ShpleminiTest< TypeParam > *test, typename ShpleminiTest< TypeParam >::TamperedPolynomial tamper_polynomial, typename ShpleminiTest< TypeParam >::TamperedCommitment tamper_commitment, bool expected_consistency_checked)
Helper to run a Libra tampering test with configurable tampering options.
CommitmentKey< Curve > ck
::testing::Types< BN254Settings > TestSettings
VerifierCommitmentKey< Curve > vk
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
void update_batch_mul_inputs_and_batched_evaluation(std::vector< Commitment > &commitments, std::vector< Fr > &scalars, Fr &batched_evaluation, const Fr &rho)
Append the commitments and scalars from each batch of claims to the Shplemini vectors which subsequen...
void compute_scalars_for_each_batch(std::span< const Fr > inverted_vanishing_evals, const Fr &nu_challenge, const Fr &r_challenge)
Compute scalars used to batch each set of claims, excluding contribution from batching challenge \rho...
std::vector< Commitment > commitments
Constructs random polynomials, computes commitments and corresponding evaluations.
std::vector< bb::Polynomial< Fr > > round_univariates
std::vector< Commitment > sumcheck_commitments
ClaimBatcher claim_batcher
std::vector< std::array< Fr, 3 > > sumcheck_evaluations
PolynomialBatcher polynomial_batcher
This structure is created to contain various polynomials and constants required by ZK Sumcheck.
constexpr field invert() const noexcept
static field random_element(numeric::RNG *engine=nullptr) noexcept