21 for (
size_t idx = 0; idx < NUM_UNSHIFTED_ENTITIES; idx++) {
22 labels_unshifted_entities[idx] =
"unshifted_challenge_" +
std::to_string(idx);
24 for (
size_t idx = 0; idx < NUM_SHIFTED_ENTITIES; idx++) {
25 labels_shifted_witnesses[idx] =
"shifted_challenge_" +
std::to_string(idx);
27 auto unshifted_challenges = transcript->template get_challenges<FF>(labels_unshifted_entities);
28 auto shifted_challenges = transcript->template get_challenges<FF>(labels_shifted_witnesses);
31 FF batched_unshifted_evaluation(0);
32 FF batched_shifted_evaluation(0);
35 batched_unshifted_evaluation += eval * challenge;
38 batched_shifted_evaluation += eval * challenge;
42 VerifierCommitments verifier_commitments(instance->get_vk(), instance->witness_commitments);
47 std::vector<Commitment> points;
48 std::vector<FF> scalars;
49 for (
auto [commitment, scalar] :
zip_view(verifier_commitments.
get_unshifted(), unshifted_challenges)) {
50 points.emplace_back(commitment);
51 scalars.emplace_back(scalar);
53 batched_unshifted_commitment = batch_mul(points, scalars);
58 points.emplace_back(commitment);
59 scalars.emplace_back(scalar);
61 batched_shifted_commitment = batch_mul(points, scalars);
65 .shifted_evaluation = batched_shifted_evaluation,
66 .non_shifted_evaluation = batched_unshifted_evaluation,
67 .non_shifted_commitment = batched_unshifted_commitment,
68 .shifted_commitment = batched_shifted_commitment,
79 vinfo(
"HypernovaFoldingVerifier: verifying Oink proof...");
82 transcript->load_proof(proof);
86 instance->target_sum = FF::from_witness_index(instance->builder, instance->builder->zero_idx());
90 instance->gate_challenges = transcript->template get_powers_of_challenge<FF>(
94 vinfo(
"HypernovaFoldingVerifier: verifying Sumcheck to turn instance into an accumulator...");
98 sumcheck.
verify(instance->relation_parameters, instance->gate_challenges, padding_indicator_array);
103 "HypernovaFoldingVerifier: Failed to recursively verify Sumcheck to turn instance into an accumulator.");
105 auto accumulator = sumcheck_output_to_accumulator(sumcheck_output, instance);
107 vinfo(
"HypernovaFoldingVerifier: Successfully turned instance into accumulator.");
109 return { sumcheck_output.
verified, accumulator };
119 vinfo(
"HypernovaFoldingVerifier: verifying folding proof...");
121 auto [sumcheck_result, incoming_accumulator] = instance_to_accumulator(instance, proof);
124 auto [sumcheck_batching_result, new_accumulator] = batching_verifier.verify_proof();
127 "HypernovaFoldingVerifier: Failed to recursively verify Sumcheck to batch two accumulators.");
129 vinfo(
"HypernovaFoldingVerifier: successfully verified folding proof.");
131 return { sumcheck_result, sumcheck_batching_result, new_accumulator };
SumcheckOutput< Flavor > verify(const bb::RelationParameters< FF > &relation_parameters, std::vector< FF > &gate_challenges, const std::vector< FF > &padding_indicator_array)
Extract round univariate, check sum, generate challenge, compute next target sum.....