13template <
typename Flavor_>
18 std::vector<Commitment> points(N);
19 for (
size_t idx = 0; idx < N; ++idx) {
20 points[idx] = _points[idx];
22 return Commitment::batch_mul(points, scalars);
25template <
typename Flavor>
30 BB_BENCH_NAME(
"HypernovaFoldingVerifier::sumcheck_output_to_accumulator");
33 auto [unshifted_challenges, shifted_challenges] =
34 get_hypernova_batching_challenges<FF>(transcript, NUM_UNSHIFTED_ENTITIES, NUM_SHIFTED_ENTITIES);
37 FF batched_unshifted_evaluation(0);
38 FF batched_shifted_evaluation(0);
41 batched_unshifted_evaluation += eval * challenge;
44 batched_shifted_evaluation += eval * challenge;
50 Commitment batched_unshifted_commitment = batch_mul(verifier_commitments.get_unshifted(), unshifted_challenges);
54 .non_shifted_evaluation = batched_unshifted_evaluation,
55 .shifted_evaluation = batched_shifted_evaluation,
56 .non_shifted_commitment = batched_unshifted_commitment,
57 .shifted_commitment = batched_shifted_commitment };
60template <
typename Flavor>
64 size_t num_public_inputs)
66 BB_BENCH_NAME(
"HypernovaFoldingVerifier::sumcheck_on_incoming_instance");
68 vinfo(
"HypernovaFoldingVerifier: verifying Oink proof...");
70 transcript->load_proof(proof);
75 instance->gate_challenges = transcript->template get_dyadic_powers_of_challenge<FF>(
76 "HypernovaFoldingProver:gate_challenge", Flavor::VIRTUAL_LOG_N);
79 vinfo(
"HypernovaFoldingVerifier: verifying Sumcheck to turn instance into an accumulator...");
81 std::vector<FF> padding_indicator_array(Flavor::VIRTUAL_LOG_N, 1);
86 return sumcheck_output;
89template <
typename Flavor>
94 BB_BENCH_NAME(
"HypernovaFoldingVerifier::instance_to_accumulator");
97 const size_t num_public_inputs =
100 auto sumcheck_output = sumcheck_on_incoming_instance(
instance, proof, num_public_inputs);
102 auto accumulator = sumcheck_output_to_accumulator(sumcheck_output,
instance);
104 if (sumcheck_output.verified) {
105 vinfo(
"HypernovaFoldingVerifier: Successfully turned instance into accumulator.");
107 vinfo(
"HypernovaFoldingVerifier: Failed to recursively verify Sumcheck to turn instance into an accumulator. "
108 "Ignore if generating the VKs");
111 return { sumcheck_output.verified, accumulator };
114template <
typename Flavor>
119 BB_BENCH_NAME(
"HypernovaFoldingVerifier::verify_folding_proof");
121 vinfo(
"HypernovaFoldingVerifier: verifying folding proof...");
124 const size_t num_public_inputs =
126 proof.size(), Flavor::VIRTUAL_LOG_N);
128 auto sumcheck_output = sumcheck_on_incoming_instance(
instance, proof, num_public_inputs);
131 const auto [unshifted_challenges, shifted_challenges] =
132 get_hypernova_batching_challenges<FF>(transcript, NUM_UNSHIFTED_ENTITIES, NUM_SHIFTED_ENTITIES);
137 auto [sumcheck_batching_result, new_accumulator] =
138 batching_verifier.
verify_proof(sumcheck_output, verifier_commitments, unshifted_challenges, shifted_challenges);
140 if (sumcheck_output.verified && sumcheck_batching_result) {
141 vinfo(
"HypernovaFoldingVerifier: successfully verified folding proof.");
142 }
else if (!sumcheck_output.verified) {
143 vinfo(
"HypernovaFoldingVerifier: Failed to recursively verify Sumcheck to turn instance into an accumulator. "
144 "Ignore if generating the VKs");
146 vinfo(
"HypernovaFoldingVerifier: Failed to recursively verify Sumcheck to batch two accumulators. Ignore if "
147 "generating the VKs");
150 return { sumcheck_output.verified, sumcheck_batching_result, new_accumulator };
std::shared_ptr< Napi::ThreadSafeFunction > instance
#define BB_BENCH_NAME(name)
HyperNova folding verifier (native + recursive). Verifies folding proofs and maintains accumulators.
Flavor::Commitment Commitment
std::conditional_t< IsRecursiveFlavor< Flavor >, stdlib::Proof< MegaCircuitBuilder >, HonkProof > Proof
std::pair< bool, Accumulator > instance_to_accumulator(const std::shared_ptr< VerifierInstance > &instance, const Proof &proof)
Turn an instance into an accumulator by executing sumcheck.
Commitment batch_mul(const RefArray< Commitment, N > &_points, const std::vector< FF > &scalars)
Utility to perform batch mul of commitments.
Accumulator sumcheck_output_to_accumulator(MegaSumcheckOutput &sumcheck_output, const std::shared_ptr< VerifierInstance > &instance)
Convert the output of the sumcheck run on the incoming instance into an accumulator.
SumcheckOutput< Flavor > sumcheck_on_incoming_instance(const std::shared_ptr< VerifierInstance > &instance, const Proof &proof, size_t num_public_inputs)
Perform sumcheck on the incoming instance.
Multilinear batching verifier. Verifies claim reduction via sumcheck.
std::pair< bool, VerifierClaim > verify_proof(SumcheckOutput< InstanceFlavor > &instance_sumcheck, InstanceCommitments &verifier_commitments, const std::vector< InstanceFF > &unshifted_challenges, const std::vector< InstanceFF > &shifted_challenges)
Verifier counterpart to OinkProver: receives witness commitments, computes relation parameters,...
void verify(bool emit_alpha=true)
Receive witness commitments, compute relation parameters, and prepare for Sumcheck.
A template class for a reference array. Behaves as if std::array<T&, N> was possible.
Implementation of the sumcheck Verifier for statements of the form for multilinear polynomials .
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...
Entry point for Barretenberg command-line interface.
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Verifier's claim for multilinear batching - contains commitments and evaluation claims.
std::vector< FF > challenge
static constexpr size_t derive_num_public_inputs(size_t proof_size, size_t log_n)
static constexpr size_t derive_num_public_inputs(size_t proof_size, size_t log_n)
Contains the evaluations of multilinear polynomials at the challenge point . These are computed by S...
ClaimedEvaluations claimed_evaluations
std::vector< FF > challenge