26 using ClaimBatch =
typename ClaimBatcher::Batch;
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 relation_parameters.
gamma = gamma;
51 relation_parameters.
beta = beta;
52 relation_parameters.
beta_sqr = beta * beta;
53 relation_parameters.
beta_cube = beta_sqr * beta;
55 gamma * (gamma + beta_sqr) * (gamma + beta_sqr + beta_sqr) * (gamma + beta_sqr + beta_sqr + beta_sqr);
59 commitments.lookup_inverses =
60 transcript->template receive_from_prover<Commitment>(commitment_labels.lookup_inverses);
61 commitments.z_perm = transcript->template receive_from_prover<Commitment>(commitment_labels.z_perm);
65 const FF alpha = transcript->template get_challenge<FF>(
"Sumcheck:alpha");
70 std::vector<FF> gate_challenges(CONST_ECCVM_LOG_N);
71 for (
size_t idx = 0; idx < gate_challenges.size(); idx++) {
72 gate_challenges[idx] = transcript->template get_challenge<FF>(
"Sumcheck:gate_challenge_" +
std::to_string(idx));
78 libra_commitments[0] = transcript->template receive_from_prover<Commitment>(
"Libra:concatenation_commitment");
79 std::vector<FF> padding_indicator_array(CONST_ECCVM_LOG_N,
FF(1));
81 auto sumcheck_output = sumcheck.
verify(relation_parameters, gate_challenges, padding_indicator_array);
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");
88 consistency_checked =
true;
89 ClaimBatcher claim_batcher{
90 .unshifted = ClaimBatch{ commitments.get_unshifted(), sumcheck_output.claimed_evaluations.get_unshifted() },
91 .shifted = ClaimBatch{ commitments.get_to_be_shifted(), sumcheck_output.claimed_evaluations.get_shifted() }
95 Shplemini::compute_batch_opening_claim(padding_indicator_array,
97 sumcheck_output.challenge,
98 key->pcs_verification_key.get_g1_identity(),
102 &consistency_checked,
104 sumcheck_output.claimed_libra_evaluation,
105 sumcheck_output.round_univariate_commitments,
106 sumcheck_output.round_univariate_evaluations);
110 PCS::reduce_batch_opening_claim(sumcheck_batch_opening_claims);
115 std::vector<Commitment> translation_commitments = { commitments.transcript_op,
116 commitments.transcript_Px,
117 commitments.transcript_Py,
118 commitments.transcript_z1,
119 commitments.transcript_z2 };
120 compute_translation_opening_claims(translation_commitments);
122 opening_claims.back() = multivariate_to_univariate_opening_claim;
126 Shplonk::reduce_verification(
key->pcs_verification_key.get_g1_identity(), opening_claims, transcript);
128 sumcheck_verified = sumcheck_output.verified;
129 vinfo(
"eccvm sumcheck verified?: ", sumcheck_verified);
130 vinfo(
"eccvm consistency check verified?: ", consistency_checked);
131 vinfo(
"translation masking consistency checked?: ", translation_masking_consistency_checked);
133 compute_accumulated_result();
135 return batch_opening_claim;
156 const auto labels = SmallIPA::evaluation_labels(
"Translation:");
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 SmallIPA::evaluation_points(small_ipa_evaluation_challenge);
193 for (
size_t idx = 0; idx < NUM_SMALL_IPA_EVALUATIONS; idx++) {
194 small_ipa_evaluations[idx] = transcript->template receive_from_prover<FF>(labels[idx]);
195 opening_claims[idx] = { { evaluation_points[idx], small_ipa_evaluations[idx] },
196 small_ipa_commitments.
get_all()[idx] };
201 if constexpr (IsRecursive) {
202 for (
auto& eval : small_ipa_evaluations) {
203 eval.clear_round_provenance();
209 translation_masking_consistency_checked =
210 SmallIPA::check_eccvm_evaluations_consistency(small_ipa_evaluations,
211 small_ipa_evaluation_challenge,
212 evaluation_challenge_x,
213 batching_challenge_v,
214 translation_masking_term_eval);
217 FF batched_translation_evaluation = translation_evaluations.get_all()[0];
218 FF batching_scalar = batching_challenge_v;
221 std::vector<FF> batching_challenges = {
FF::one() };
222 for (
size_t idx = 1; idx < NUM_TRANSLATION_EVALUATIONS; ++idx) {
223 batched_translation_evaluation += batching_scalar * translation_evaluations.get_all()[idx];
224 batching_challenges.push_back(batching_scalar);
225 batching_scalar *= batching_challenge_v;
227 if constexpr (IsRecursive) {
228 batched_commitment = Commitment::batch_mul(translation_commitments, batching_challenges);
230 batched_commitment = batch_mul_native<Curve>(translation_commitments, batching_challenges);
234 opening_claims[NUM_SMALL_IPA_EVALUATIONS] = { { evaluation_challenge_x, batched_translation_evaluation },
235 batched_commitment };
239 shift_translation_masking_term_eval(evaluation_challenge_x, translation_masking_term_eval);
SumcheckOutput< Flavor > verify(const bb::RelationParameters< FF > &relation_parameters, const std::vector< FF > &gate_challenges, const std::vector< FF > &padding_indicator_array)
The Sumcheck verification method. First it extracts round univariate, checks sum (the sumcheck univar...