28 univariate_opening_claims.clear();
31 transcript->load_proof(proof);
34 transcript->add_to_hash_buffer(
"vk_hash", vk_hash);
35 vinfo(
"ECCVM vk hash: ", vk_hash);
41 commitments.gemini_masking_poly = transcript->template receive_from_prover<Commitment>(
"Gemini:masking_poly_comm");
42 for (
auto [comm,
label] :
zip_view(commitments.get_wires(), commitment_labels.get_wires())) {
43 comm = transcript->template receive_from_prover<Commitment>(
label);
49 auto beta_sqr = beta * beta;
50 auto beta_quartic = beta_sqr * beta_sqr;
51 relation_parameters.
gamma = gamma;
52 relation_parameters.
beta = beta;
53 relation_parameters.
beta_sqr = beta_sqr;
54 relation_parameters.
beta_cube = beta_sqr * beta;
56 auto first_term_tag = beta_quartic;
58 (gamma + beta_sqr + beta_sqr + first_term_tag) *
59 (gamma + beta_sqr + beta_sqr + beta_sqr + first_term_tag);
63 commitments.lookup_inverses =
64 transcript->template receive_from_prover<Commitment>(commitment_labels.lookup_inverses);
65 commitments.z_perm = transcript->template receive_from_prover<Commitment>(commitment_labels.z_perm);
69 const FF alpha = transcript->template get_challenge<FF>(
"Sumcheck:alpha");
74 std::vector<FF> gate_challenges =
75 transcript->template get_dyadic_powers_of_challenge<FF>(
"Sumcheck:gate_challenge", CONST_ECCVM_LOG_N);
78 std::array<Commitment, NUM_SMALL_IPA_COMMITMENTS> libra_commitments = {};
80 libra_commitments[0] = transcript->template receive_from_prover<Commitment>(
"Libra:concatenation_commitment");
81 auto sumcheck_output = sumcheck.
verify(relation_parameters, gate_challenges);
83 libra_commitments[1] = transcript->template receive_from_prover<Commitment>(
"Libra:grand_sum_commitment");
84 libra_commitments[2] = transcript->template receive_from_prover<Commitment>(
"Libra:quotient_commitment");
86 const bool consistency_checked = append_libra_opening_claims(
87 libra_commitments, sumcheck_output.challenge, sumcheck_output.claimed_libra_evaluation);
89 std::vector<Commitment> translation_commitments = { commitments.transcript_op,
90 commitments.transcript_Px,
91 commitments.transcript_Py,
92 commitments.transcript_z1,
93 commitments.transcript_z2 };
97 append_translation_opening_claims(translation_commitments);
98 append_sumcheck_round_opening_claims(sumcheck_output.round_univariate_commitments,
99 sumcheck_output.round_univariate_evaluations,
100 sumcheck_output.challenge);
101 append_pow_masking_opening_claim();
105 compute_triple_ipa_claim(commitments, sumcheck_output, univariate_opening_claim) };
107 bool sumcheck_verified = sumcheck_output.verified;
108 vinfo(
"ECCVM Verifier: sumcheck verified: ", sumcheck_verified);
109 vinfo(
"ECCVM Verifier: consistency checked: ", consistency_checked);
110 vinfo(
"ECCVM Verifier: translation masking consistency checked: ", translation_masking_consistency_checked);
112 compute_accumulated_result();
113 result.reduction_succeeded = sumcheck_verified && consistency_checked && translation_masking_consistency_checked;
119 const std::array<Commitment, NUM_SMALL_IPA_COMMITMENTS>& libra_commitments,
120 const std::vector<FF>& multilinear_challenge,
121 const FF& claimed_libra_evaluation)
123 const FF libra_evaluation_challenge =
124 transcript->template get_challenge<FF>(
"Libra:small_ipa_evaluation_challenge");
125 const auto libra_opening_claims = make_small_ipa_verifier_opening_claims<Curve>(
126 libra_commitments, libra_evaluation_challenge,
"Libra:", transcript);
130 libra_evaluations[idx] = libra_opening_claims[idx].opening_pair.evaluation;
133 univariate_opening_claims.insert(
134 univariate_opening_claims.end(), libra_opening_claims.begin(), libra_opening_claims.end());
137 libra_evaluations, libra_evaluation_challenge, multilinear_challenge, claimed_libra_evaluation);
161 transcript->template receive_from_prover<Commitment>(
"Translation:concatenated_masking_term_commitment");
164 evaluation_challenge_x = transcript->template get_challenge<FF>(
"Translation:evaluation_challenge_x");
167 for (
auto [eval,
label] :
zip_view(translation_evaluations.get_all(), translation_evaluations.labels)) {
168 eval = transcript->template receive_from_prover<FF>(
label);
172 batching_challenge_v = transcript->template get_challenge<FF>(
"Translation:batching_challenge_v");
175 translation_masking_term_eval = transcript->template receive_from_prover<FF>(
"Translation:masking_term_eval");
179 transcript->template receive_from_prover<Commitment>(
"Translation:grand_sum_commitment");
181 transcript->template receive_from_prover<Commitment>(
"Translation:quotient_commitment");
185 const FF small_ipa_evaluation_challenge =
186 transcript->template get_challenge<FF>(
"Translation:small_ipa_evaluation_challenge");
190 const auto small_ipa_claims = make_small_ipa_verifier_opening_claims<Curve>(
191 small_ipa_commitments.
as_array(), small_ipa_evaluation_challenge,
"Translation:", transcript);
194 std::ranges::copy(small_ipa_claims, translation_claims.begin());
197 small_ipa_evaluations[idx] = small_ipa_claims[idx].opening_pair.evaluation;
202 translation_masking_consistency_checked =
203 SmallIPA::check_eccvm_evaluations_consistency(small_ipa_evaluations,
204 small_ipa_evaluation_challenge,
205 evaluation_challenge_x,
206 batching_challenge_v,
207 translation_masking_term_eval);
210 const std::vector<FF> batching_challenges =
batching_scalars(batching_challenge_v, NUM_TRANSLATION_EVALUATIONS);
211 std::vector<FF> translation_evaluation_values;
212 translation_evaluation_values.reserve(NUM_TRANSLATION_EVALUATIONS);
213 for (
const auto& eval : translation_evaluations.get_all()) {
214 translation_evaluation_values.emplace_back(eval);
216 const FF batched_translation_evaluation = batch_evaluations<Curve>(
223 batched_commitment };
224 univariate_opening_claims.insert(
225 univariate_opening_claims.end(), translation_claims.begin(), translation_claims.end());
271 FF v = batching_challenge_v;
272 FF v_squared = v * v;
273 FF v_cubed = v_squared * v;
274 FF v_fourth = v_cubed * v;
278 if constexpr (IsRecursive) {
279 translation_masking_term_eval.set_origin_tag(batching_challenge_v.get_origin_tag());
282 FF batched_eval_minus_masking = translation_evaluations.op + v * translation_evaluations.Px +
283 v_squared * translation_evaluations.Py + v_cubed * translation_evaluations.z1 +
284 v_fourth * translation_evaluations.z2 - translation_masking_term_eval;
287 FF x_power = evaluation_challenge_x;
289 x_power *= evaluation_challenge_x;
291 accumulated_result = batched_eval_minus_masking / x_power;
296 const std::vector<Commitment>& sumcheck_round_commitments,
297 const std::vector<std::array<FF, 3>>& sumcheck_round_evaluations,
298 const std::vector<FF>& multilinear_challenge)
300 static constexpr size_t NUM_COMMITTED_SUMCHECK_CLAIMS_PER_ROUND = 3;
301 univariate_opening_claims.reserve(univariate_opening_claims.size() +
302 multilinear_challenge.size() * NUM_COMMITTED_SUMCHECK_CLAIMS_PER_ROUND);
304 for (
size_t idx = 0; idx < multilinear_challenge.size(); ++idx) {
307 multilinear_challenge[idx] };
308 for (
size_t eval_idx = 0; eval_idx < NUM_COMMITTED_SUMCHECK_CLAIMS_PER_ROUND; ++eval_idx) {
309 univariate_opening_claims.push_back(
310 { { evaluation_points[eval_idx], sumcheck_round_evaluations[idx][eval_idx] },
311 sumcheck_round_commitments[idx] });
static bool check_libra_evaluations_consistency(const std::array< FF, NUM_SMALL_IPA_OPENING_CLAIMS > &libra_evaluations, const FF &gemini_evaluation_challenge, const std::vector< FF > &multilinear_challenge, const FF &inner_product_eval_claim)
A method required by ZKSumcheck. The challenge polynomial is concatenated from the powers of the sumc...
static TripleIpaClaimData create(const CommitmentRange &unshifted_commitments, const EvaluationRange &unshifted_evaluations, const ShiftedCommitmentRange &shifted_source_commitments, const ShiftedSourceEvaluationRange &shifted_source_evaluations, const ShiftedEvaluationRange &shifted_evaluations, std::span< const Fr > multilinear_challenge, const Fr &rho, const OpeningClaim< Curve > &univariate)
Build the claim data shared by the ECCVM prover and verifier.