103 const FF alpha = transcript->template get_challenge<FF>(
"Sumcheck:alpha");
106 FF alpha_power_KH =
FF(1);
107 for (
size_t i = 0; i < MegaZKFlavorT::NUM_SUBRELATIONS; i++) {
108 alpha_power_KH *= alpha;
116 std::vector<FF> gate_challenges(JOINT_LOG_N);
117 for (
size_t i = 0; i < JOINT_LOG_N; i++) {
118 gate_challenges[i] = transcript->template get_challenge<FF>(
"Sumcheck:gate_challenge_" +
std::to_string(i));
122 libra_commitments = {};
123 libra_commitments[0] = transcript->template receive_from_prover<Commitment>(
"Libra:concatenation_commitment");
126 FF libra_total_sum = transcript->template receive_from_prover<FF>(
"Libra:Sum");
127 libra_challenge = transcript->template get_challenge<FF>(
"Libra:Challenge");
134 const size_t mega_zk_log_n = [&]() ->
size_t {
135 if constexpr (IsRecursive) {
136 return static_cast<size_t>(
static_cast<uint64_t
>(mega_zk_vk_and_hash->vk->log_circuit_size.get_value()));
138 return static_cast<size_t>(mega_zk_vk_and_hash->vk->log_circuit_size);
142 joint_challenge.clear();
143 joint_challenge.reserve(JOINT_LOG_N);
145 bool verified =
true;
148 for (
size_t round_idx = 0; round_idx < mega_zk_log_n; round_idx++) {
149 joint_round.
process_round(transcript, joint_challenge, gate_sep,
FF(1), round_idx);
153 TransFlavor::set_minicircuit_evaluations(
156 "Sumcheck:minicircuit_evaluations"));
164 auto transcript_evals =
165 transcript->template receive_from_prover<std::array<FF, MegaZKFlavorT::NUM_ALL_ENTITIES>>(
166 "Sumcheck:evaluations");
167 for (
auto [eval, te] :
zip_view(mega_zk_evals.get_all(), transcript_evals)) {
173 for (
size_t round_idx = mega_zk_log_n; round_idx < JOINT_LOG_N; round_idx++) {
174 joint_round.
process_round(transcript, joint_challenge, gate_sep,
FF(1), round_idx);
178 TransFlavor::set_minicircuit_evaluations(
181 "Sumcheck:minicircuit_evaluations"));
189 for (
size_t k = mega_zk_log_n; k < JOINT_LOG_N; k++) {
190 tau *= (
FF(1) - joint_challenge[k]);
192 for (
auto& eval : mega_zk_evals.get_all()) {
199 auto get_full_circuit_evals =
200 transcript->template receive_from_prover<std::array<FF, TransFlavor::NUM_FULL_CIRCUIT_EVALUATIONS>>(
201 "Sumcheck:evaluations_translator");
202 TransFlavor::complete_full_circuit_evaluations(
207 if constexpr (IsRecursive) {
208 const auto challenge_tag = joint_challenge.back().get_origin_tag();
209 for (
auto& eval : mega_zk_evals.get_all()) {
210 eval.set_origin_tag(challenge_tag);
212 for (
auto& eval : trans_evals.get_all()) {
213 eval.set_origin_tag(challenge_tag);
226 mega_zk_evals, mega_zk_relation_parameters, final_gate_sep, mega_zk_alphas);
230 if constexpr (IsRecursive) {
231 auto mega_zk_padding =
232 stdlib::compute_padding_indicator_array<Curve, JOINT_LOG_N>(mega_zk_vk_and_hash->vk->log_circuit_size);
238 frv_mega_zk *= rdp_d;
243 trans_evals, translator_relation_parameters, final_gate_sep, translator_alphas);
246 FF frv_joint = frv_mega_zk + alpha_power_KH * frv_translator;
249 libra_evaluation = transcript->template receive_from_prover<FF>(
"Libra:claimed_evaluation");
252 libra_commitments[1] = transcript->template receive_from_prover<Commitment>(
"Libra:grand_sum_commitment");
253 libra_commitments[2] = transcript->template receive_from_prover<Commitment>(
"Libra:quotient_commitment");
255 if constexpr (IsRecursive) {
256 const auto challenge_tag = joint_challenge.back().get_origin_tag();
257 libra_evaluation.set_origin_tag(challenge_tag);
260 frv_joint += libra_evaluation * libra_challenge;
264 return final_check && verified;
278 using ClaimBatch =
typename ClaimBatcher::Batch;
283 if constexpr (IsRecursive) {
284 return Commitment::one(
builder);
286 return Commitment::one();
292 RefVector<FF> joint_unshifted_evals = mega_zk_evals.get_unshifted();
294 RefVector<FF> joint_shifted_evals = mega_zk_evals.get_shifted();
298 trans_evals.get_groups_to_be_concatenated_shifted(),
std::span<const FF>(joint_challenge));
300 auto trans_unshifted_comms = trans_commitments.get_pcs_unshifted();
301 auto trans_unshifted_evals = trans_evals.get_pcs_unshifted();
302 auto trans_shifted_comms = trans_commitments.get_pcs_to_be_shifted();
303 auto trans_pcs_shifted_evals = trans_evals.get_pcs_shifted();
306 for (
auto& comm : trans_unshifted_comms) {
309 for (
auto& eval : trans_unshifted_evals) {
312 for (
auto& comm : trans_shifted_comms) {
315 for (
auto& eval : trans_pcs_shifted_evals) {
318 for (
auto& eval : concat_shift_evals) {
322 ClaimBatcher joint_claim_batcher{ .unshifted = ClaimBatch{ joint_unshifted_comms, joint_unshifted_evals },
323 .shifted = ClaimBatch{ joint_shifted_comms, joint_shifted_evals } };
326 std::vector<FF> joint_padding(JOINT_LOG_N,
FF(1));
328 auto [opening_claim, consistency_checked] = MegaZKShplemini::compute_batch_opening_claim(joint_padding,
333 REPEATED_COMMITMENTS,
337 auto pairing_points = MegaZKFlavorT::PCS::reduce_verify_batch_opening_claim(
std::move(opening_claim), transcript);
339 return { pairing_points, sumcheck_verified && consistency_checked };
344 const Proof& joint_proof,
345 const TransBF& evaluation_input_x,
346 const TransBF& batching_challenge_v,
347 const TransBF& accumulated_result,
348 const std::array<Commitment, TranslatorFlavor::NUM_OP_QUEUE_WIRES>& op_queue_wire_commitments)
352 mega_zk_verifier_instance->witness_commitments };
353 mega_zk_commitments.gemini_masking_poly = mega_zk_verifier_instance->gemini_masking_commitment;
355 auto trans_commitments = verify_translator_oink(
356 joint_proof, evaluation_input_x, batching_challenge_v, accumulated_result, op_queue_wire_commitments);
357 bool sumcheck_verified = verify_joint_sumcheck();
358 return verify_joint_pcs(sumcheck_verified, mega_zk_commitments, trans_commitments);
void process_round(const std::shared_ptr< Transcript > &transcript, std::vector< FF > &multivariate_challenge, bb::GateSeparatorPolynomial< FF > &gate_separators, const FF &padding_indicator, size_t round_idx)
Process a single sumcheck round: receive univariate from transcript, verify sum, generate challenge.