69 using FF =
typename TypeParam::FF;
70 static constexpr size_t SUBGROUP_SIZE = TypeParam::SUBGROUP_SIZE;
72 using CK =
typename TypeParam::CommitmentKey;
75 static constexpr size_t log_subgroup_size =
static_cast<size_t>(
numeric::get_msb(SUBGROUP_SIZE));
76 CK
ck = create_commitment_key<CK>(
std::max<size_t>(this->circuit_size, 1ULL << (log_subgroup_size + 1)));
78 auto prover_transcript = TypeParam::Transcript::test_prover_init_empty();
80 ZKData zk_sumcheck_data(this->log_circuit_size, prover_transcript,
ck);
81 std::vector<FF> multivariate_challenge = this->generate_random_vector(this->log_circuit_size);
83 const FF claimed_inner_product = SmallSubgroupIPA::compute_claimed_inner_product(
84 zk_sumcheck_data, multivariate_challenge, this->log_circuit_size);
86 SmallSubgroupIPA small_subgroup_ipa_prover =
87 SmallSubgroupIPA(zk_sumcheck_data, multivariate_challenge, claimed_inner_product, prover_transcript,
ck);
89 small_subgroup_ipa_prover.prove();
91 const Polynomial batched_polynomial = small_subgroup_ipa_prover.get_batched_polynomial();
92 const auto witness_polynomials = small_subgroup_ipa_prover.get_witness_polynomials();
93 const Polynomial libra_concatenated_polynomial = witness_polynomials[0];
94 const Polynomial batched_quotient = witness_polynomials[2];
95 const Polynomial challenge_polynomial = small_subgroup_ipa_prover.get_challenge_polynomial();
100 FF inner_product =
FF(0);
101 const std::array<FF, SUBGROUP_SIZE> domain = zk_sumcheck_data.interpolation_domain;
102 for (
size_t idx = 0; idx < SUBGROUP_SIZE; idx++) {
104 challenge_polynomial.
evaluate(domain[idx]) * libra_concatenated_polynomial.
evaluate(domain[idx]);
106 EXPECT_TRUE(inner_product == claimed_inner_product);
109 bool ipa_claim_consistency =
true;
110 for (
size_t idx = 0; idx < SUBGROUP_SIZE; idx++) {
111 ipa_claim_consistency = (batched_polynomial.
evaluate(zk_sumcheck_data.interpolation_domain[idx]) ==
FF{ 0 }) &&
112 ipa_claim_consistency;
114 EXPECT_EQ(ipa_claim_consistency,
true);
117 std::vector<FF> Z_H(SUBGROUP_SIZE + 1);
119 Z_H[SUBGROUP_SIZE] =
FF(1);
122 for (
size_t i = 0; i < Z_H.size(); i++) {
123 for (
size_t j = 0; j < batched_quotient.
size(); j++) {
124 product.
at(i + j) += Z_H[i] * batched_quotient.
at(j);
127 bool quotient_is_correct =
true;
128 for (
const auto& [coeff_expected, coeff] :
zip_view(product.
coeffs(), batched_polynomial.
coeffs())) {
129 quotient_is_correct = (coeff_expected == coeff) && quotient_is_correct;
131 EXPECT_EQ(quotient_is_correct,
true);
139 using FF =
typename TypeParam::FF;
140 using Curve =
typename TypeParam::Curve;
144 static constexpr size_t SUBGROUP_SIZE = TypeParam::SUBGROUP_SIZE;
146 const FF subgroup_generator = subgroup_generator_inverse.
invert();
149 std::vector<FF> challenge_poly_lagrange = this->generate_random_vector(SUBGROUP_SIZE);
152 const FF vanishing_poly_eval = this->evaluation_challenge.
pow(SUBGROUP_SIZE) - 1;
155 const auto [challenge_poly_eval, lagrange_first, lagrange_last] =
156 SmallSubgroupIPA::compute_batched_barycentric_evaluations(
157 challenge_poly_lagrange, this->evaluation_challenge, vanishing_poly_eval);
160 std::array<FF, SUBGROUP_SIZE> interpolation_domain;
161 interpolation_domain[0] =
FF(1);
162 for (
size_t idx = 1; idx < SUBGROUP_SIZE; idx++) {
163 interpolation_domain[idx] = interpolation_domain[idx - 1] * subgroup_generator;
166 Polynomial<FF>(interpolation_domain, challenge_poly_lagrange, SUBGROUP_SIZE);
169 const FF challenge_poly_expected_eval = challenge_poly_monomial.
evaluate(this->evaluation_challenge);
171 EXPECT_EQ(challenge_poly_eval, challenge_poly_expected_eval);
174 std::vector<FF> lagrange_poly(SUBGROUP_SIZE);
175 lagrange_poly.at(0) =
FF(1);
177 EXPECT_EQ(lagrange_first, lagrange_first_monomial.
evaluate(
this->evaluation_challenge));
179 lagrange_poly.at(0) =
FF(0);
180 lagrange_poly.at(SUBGROUP_SIZE - 1) =
FF(1);
182 EXPECT_EQ(lagrange_last, lagrange_last_monomial.
evaluate(
this->evaluation_challenge));
189 using FF =
typename TypeParam::FF;
190 using Curve =
typename TypeParam::Curve;
194 using CK =
typename TypeParam::CommitmentKey;
196 auto prover_transcript = TypeParam::Transcript::test_prover_init_empty();
200 CK
ck = create_commitment_key<CK>(
std::max<size_t>(this->circuit_size, 1ULL << (log_subgroup_size + 1)));
202 ZKData zk_sumcheck_data(this->log_circuit_size, prover_transcript,
ck);
204 std::vector<FF> multivariate_challenge = this->generate_random_vector(this->num_sumcheck_challenges);
206 const FF claimed_inner_product =
207 Prover::compute_claimed_inner_product(zk_sumcheck_data, multivariate_challenge, this->log_circuit_size);
209 Prover small_subgroup_ipa_prover =
210 Prover(zk_sumcheck_data, multivariate_challenge, claimed_inner_product, prover_transcript,
ck);
212 small_subgroup_ipa_prover.prove();
215 this->evaluate_small_ipa_witnesses(small_subgroup_ipa_prover.get_witness_polynomials());
217 bool consistency_checked = Verifier::check_libra_evaluations_consistency(
218 small_ipa_evaluations, this->evaluation_challenge, multivariate_challenge, claimed_inner_product);
220 EXPECT_TRUE(consistency_checked);
226 using FF =
typename TypeParam::FF;
227 using Curve =
typename TypeParam::Curve;
231 using CK =
typename TypeParam::CommitmentKey;
233 auto prover_transcript = TypeParam::Transcript::test_prover_init_empty();
237 CK
ck = create_commitment_key<CK>(
std::max<size_t>(this->circuit_size, 1ULL << (log_subgroup_size + 1)));
239 ZKData zk_sumcheck_data(this->log_circuit_size, prover_transcript,
ck);
241 std::vector<FF> multivariate_challenge = this->generate_random_vector(this->num_sumcheck_challenges);
243 const FF claimed_inner_product =
244 Prover::compute_claimed_inner_product(zk_sumcheck_data, multivariate_challenge, this->log_circuit_size);
246 Prover small_subgroup_ipa_prover =
247 Prover(zk_sumcheck_data, multivariate_challenge, claimed_inner_product, prover_transcript,
ck);
249 small_subgroup_ipa_prover.prove();
252 small_subgroup_ipa_prover.get_witness_polynomials();
258 this->evaluate_small_ipa_witnesses(witness_polynomials);
260 bool consistency_checked = Verifier::check_libra_evaluations_consistency(
261 small_ipa_evaluations, this->evaluation_challenge, multivariate_challenge, claimed_inner_product);
264 EXPECT_FALSE(consistency_checked);
275 using Curve =
typename TypeParam::Curve;
279 using CK =
typename TypeParam::CommitmentKey;
281 auto prover_transcript = TypeParam::Transcript::test_prover_init_empty();
283 const size_t num_wires = 5;
287 CK
ck = create_commitment_key<CK>(
std::max<size_t>(this->circuit_size, 1ULL << (log_subgroup_size + 1)));
292 for (
size_t idx = 0; idx < num_wires; idx++) {
302 Prover small_subgroup_ipa_prover(
303 translation_data, evaluation_challenge_x, batching_challenge_v, prover_transcript,
ck);
304 small_subgroup_ipa_prover.prove();
307 this->evaluate_small_ipa_witnesses(small_subgroup_ipa_prover.get_witness_polynomials());
309 bool consistency_checked =
310 Verifier::check_eccvm_evaluations_consistency(small_ipa_evaluations,
311 this->evaluation_challenge,
312 evaluation_challenge_x,
313 batching_challenge_v,
314 small_subgroup_ipa_prover.claimed_inner_product);
316 EXPECT_TRUE(consistency_checked);
327 using Curve =
typename TypeParam::Curve;
331 using CK =
typename TypeParam::CommitmentKey;
333 auto prover_transcript = TypeParam::Transcript::test_prover_init_empty();
335 const size_t num_wires = 5;
339 CK
ck = create_commitment_key<CK>(
std::max<size_t>(this->circuit_size, 1ULL << (log_subgroup_size + 1)));
344 for (
size_t idx = 0; idx < num_wires; idx++) {
354 Prover small_subgroup_ipa_prover(
355 translation_data, evaluation_challenge_x, batching_challenge_v, prover_transcript,
ck);
356 small_subgroup_ipa_prover.prove();
359 this->evaluate_small_ipa_witnesses(small_subgroup_ipa_prover.get_witness_polynomials());
361 bool consistency_checked =
362 Verifier::check_eccvm_evaluations_consistency(small_ipa_evaluations,
363 this->evaluation_challenge,
364 evaluation_challenge_x,
365 batching_challenge_v,
368 EXPECT_TRUE(!consistency_checked);
377 using FF =
typename TypeParam::FF;
378 using Curve =
typename TypeParam::Curve;
381 static constexpr size_t SUBGROUP_SIZE = TypeParam::SUBGROUP_SIZE;
389 const FF vanishing_poly_eval = subgroup_element.
pow(SUBGROUP_SIZE) -
FF(1);
390 EXPECT_EQ(vanishing_poly_eval,
FF(0));
397 std::vector<FF> multivariate_challenge = this->generate_random_vector(this->num_sumcheck_challenges);
401 EXPECT_THROW(Verifier::check_libra_evaluations_consistency(
402 dummy_evaluations, subgroup_element, multivariate_challenge, dummy_inner_product),