56 using FF =
typename TypeParam::FF;
57 static constexpr size_t SUBGROUP_SIZE = TypeParam::SUBGROUP_SIZE;
59 using CK =
typename TypeParam::CommitmentKey;
62 static constexpr size_t log_subgroup_size =
static_cast<size_t>(
numeric::get_msb(SUBGROUP_SIZE));
63 CK
ck = create_commitment_key<CK>(
std::max<size_t>(this->circuit_size, 1ULL << (log_subgroup_size + 1)));
65 auto prover_transcript = TypeParam::Transcript::prover_init_empty();
67 ZKData zk_sumcheck_data(this->log_circuit_size, prover_transcript,
ck);
68 std::vector<FF> multivariate_challenge = this->generate_random_vector(this->log_circuit_size);
70 const FF claimed_inner_product = SmallSubgroupIPA::compute_claimed_inner_product(
71 zk_sumcheck_data, multivariate_challenge, this->log_circuit_size);
73 SmallSubgroupIPA small_subgroup_ipa_prover =
74 SmallSubgroupIPA(zk_sumcheck_data, multivariate_challenge, claimed_inner_product, prover_transcript,
ck);
76 small_subgroup_ipa_prover.prove();
78 const Polynomial batched_polynomial = small_subgroup_ipa_prover.get_batched_polynomial();
79 const Polynomial libra_concatenated_polynomial = small_subgroup_ipa_prover.get_witness_polynomials()[0];
80 const Polynomial batched_quotient = small_subgroup_ipa_prover.get_witness_polynomials()[3];
81 const Polynomial challenge_polynomial = small_subgroup_ipa_prover.get_challenge_polynomial();
86 FF inner_product =
FF(0);
87 const std::array<FF, SUBGROUP_SIZE> domain = zk_sumcheck_data.interpolation_domain;
88 for (
size_t idx = 0; idx < SUBGROUP_SIZE; idx++) {
90 challenge_polynomial.
evaluate(domain[idx]) * libra_concatenated_polynomial.
evaluate(domain[idx]);
92 EXPECT_TRUE(inner_product == claimed_inner_product);
95 bool ipa_claim_consistency =
true;
96 for (
size_t idx = 0; idx < SUBGROUP_SIZE; idx++) {
97 ipa_claim_consistency = (batched_polynomial.
evaluate(zk_sumcheck_data.interpolation_domain[idx]) ==
FF{ 0 }) &&
98 ipa_claim_consistency;
100 EXPECT_EQ(ipa_claim_consistency,
true);
103 std::vector<FF> Z_H(SUBGROUP_SIZE + 1);
105 Z_H[SUBGROUP_SIZE] =
FF(1);
108 for (
size_t i = 0; i < Z_H.size(); i++) {
109 for (
size_t j = 0; j < batched_quotient.
size(); j++) {
110 product.
at(i + j) += Z_H[i] * batched_quotient.
at(j);
113 bool quotient_is_correct =
true;
114 for (
const auto& [coeff_expected, coeff] :
zip_view(product.
coeffs(), batched_polynomial.
coeffs())) {
115 quotient_is_correct = (coeff_expected == coeff) && quotient_is_correct;
117 EXPECT_EQ(quotient_is_correct,
true);
125 using FF =
typename TypeParam::FF;
126 using Curve =
typename TypeParam::Curve;
130 static constexpr size_t SUBGROUP_SIZE = TypeParam::SUBGROUP_SIZE;
132 const FF subgroup_generator = subgroup_generator_inverse.
invert();
135 std::vector<FF> challenge_poly_lagrange = this->generate_random_vector(SUBGROUP_SIZE);
138 const FF vanishing_poly_eval = this->evaluation_challenge.pow(SUBGROUP_SIZE) - 1;
141 const auto [challenge_poly_eval, lagrange_first, lagrange_last] =
142 SmallSubgroupIPA::compute_batched_barycentric_evaluations(
143 challenge_poly_lagrange, this->evaluation_challenge, vanishing_poly_eval);
146 std::array<FF, SUBGROUP_SIZE> interpolation_domain;
147 interpolation_domain[0] =
FF(1);
148 for (
size_t idx = 1; idx < SUBGROUP_SIZE; idx++) {
149 interpolation_domain[idx] = interpolation_domain[idx - 1] * subgroup_generator;
152 Polynomial<FF>(interpolation_domain, challenge_poly_lagrange, SUBGROUP_SIZE);
155 const FF challenge_poly_expected_eval = challenge_poly_monomial.
evaluate(this->evaluation_challenge);
157 EXPECT_EQ(challenge_poly_eval, challenge_poly_expected_eval);
160 std::vector<FF> lagrange_poly(SUBGROUP_SIZE);
161 lagrange_poly.at(0) =
FF(1);
163 EXPECT_EQ(lagrange_first, lagrange_first_monomial.
evaluate(this->evaluation_challenge));
165 lagrange_poly.at(0) =
FF(0);
166 lagrange_poly.at(SUBGROUP_SIZE - 1) =
FF(1);
168 EXPECT_EQ(lagrange_last, lagrange_last_monomial.
evaluate(this->evaluation_challenge));
175 using FF =
typename TypeParam::FF;
176 using Curve =
typename TypeParam::Curve;
180 using CK =
typename TypeParam::CommitmentKey;
182 auto prover_transcript = TypeParam::Transcript::prover_init_empty();
186 CK
ck = create_commitment_key<CK>(
std::max<size_t>(this->circuit_size, 1ULL << (log_subgroup_size + 1)));
188 ZKData zk_sumcheck_data(this->log_circuit_size, prover_transcript,
ck);
190 std::vector<FF> multivariate_challenge = this->generate_random_vector(CONST_PROOF_SIZE_LOG_N);
192 const FF claimed_inner_product =
193 Prover::compute_claimed_inner_product(zk_sumcheck_data, multivariate_challenge, this->log_circuit_size);
195 Prover small_subgroup_ipa_prover =
196 Prover(zk_sumcheck_data, multivariate_challenge, claimed_inner_product, prover_transcript,
ck);
198 small_subgroup_ipa_prover.prove();
201 this->evaluate_small_ipa_witnesses(small_subgroup_ipa_prover.get_witness_polynomials());
203 bool consistency_checked = Verifier::check_libra_evaluations_consistency(
204 small_ipa_evaluations, this->evaluation_challenge, multivariate_challenge, claimed_inner_product);
206 EXPECT_TRUE(consistency_checked);
212 using FF =
typename TypeParam::FF;
213 using Curve =
typename TypeParam::Curve;
217 using CK =
typename TypeParam::CommitmentKey;
219 auto prover_transcript = TypeParam::Transcript::prover_init_empty();
223 CK
ck = create_commitment_key<CK>(
std::max<size_t>(this->circuit_size, 1ULL << (log_subgroup_size + 1)));
225 ZKData zk_sumcheck_data(this->log_circuit_size, prover_transcript,
ck);
227 std::vector<FF> multivariate_challenge = this->generate_random_vector(CONST_PROOF_SIZE_LOG_N);
229 const FF claimed_inner_product =
230 Prover::compute_claimed_inner_product(zk_sumcheck_data, multivariate_challenge, this->log_circuit_size);
232 Prover small_subgroup_ipa_prover =
233 Prover(zk_sumcheck_data, multivariate_challenge, claimed_inner_product, prover_transcript,
ck);
235 small_subgroup_ipa_prover.prove();
238 small_subgroup_ipa_prover.get_witness_polynomials();
244 this->evaluate_small_ipa_witnesses(witness_polynomials);
246 bool consistency_checked = Verifier::check_libra_evaluations_consistency(
247 small_ipa_evaluations, this->evaluation_challenge, multivariate_challenge, claimed_inner_product);
250 EXPECT_FALSE(consistency_checked);
261 using Curve =
typename TypeParam::Curve;
265 using CK =
typename TypeParam::CommitmentKey;
267 auto prover_transcript = TypeParam::Transcript::prover_init_empty();
269 const size_t num_wires = 5;
273 CK
ck = create_commitment_key<CK>(
std::max<size_t>(this->circuit_size, 1ULL << (log_subgroup_size + 1)));
278 for (
size_t idx = 0; idx < num_wires; idx++) {
288 Prover small_subgroup_ipa_prover(
289 translation_data, evaluation_challenge_x, batching_challenge_v, prover_transcript,
ck);
290 small_subgroup_ipa_prover.prove();
293 this->evaluate_small_ipa_witnesses(small_subgroup_ipa_prover.get_witness_polynomials());
295 bool consistency_checked =
296 Verifier::check_eccvm_evaluations_consistency(small_ipa_evaluations,
297 this->evaluation_challenge,
298 evaluation_challenge_x,
299 batching_challenge_v,
300 small_subgroup_ipa_prover.claimed_inner_product);
302 EXPECT_TRUE(consistency_checked);
313 using Curve =
typename TypeParam::Curve;
317 using CK =
typename TypeParam::CommitmentKey;
319 auto prover_transcript = TypeParam::Transcript::prover_init_empty();
321 const size_t num_wires = 5;
325 CK
ck = create_commitment_key<CK>(
std::max<size_t>(this->circuit_size, 1ULL << (log_subgroup_size + 1)));
330 for (
size_t idx = 0; idx < num_wires; idx++) {
340 Prover small_subgroup_ipa_prover(
341 translation_data, evaluation_challenge_x, batching_challenge_v, prover_transcript,
ck);
342 small_subgroup_ipa_prover.prove();
345 this->evaluate_small_ipa_witnesses(small_subgroup_ipa_prover.get_witness_polynomials());
347 bool consistency_checked =
348 Verifier::check_eccvm_evaluations_consistency(small_ipa_evaluations,
349 this->evaluation_challenge,
350 evaluation_challenge_x,
351 batching_challenge_v,
354 EXPECT_TRUE(!consistency_checked);