Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
hypernova_verifier.cpp
Go to the documentation of this file.
1// === AUDIT STATUS ===
2// internal: { status: Complete, auditors: [Sergei], commit: }
3// external_1: { status: not started, auditors: [], commit: }
4// external_2: { status: not started, auditors: [], commit: }
5// =====================
6
9
10namespace bb {
11
12template <typename Flavor_>
13template <size_t N>
15 const RefArray<Commitment, N>& _points, const std::vector<FF>& scalars)
16{
17 std::vector<Commitment> points(N);
18 for (size_t idx = 0; idx < N; ++idx) {
19 points[idx] = _points[idx];
20 }
21 return Commitment::batch_mul(points, scalars);
22}
23
24template <typename Flavor>
28{
29 BB_BENCH_NAME("HypernovaFoldingVerifier::sumcheck_output_to_accumulator");
30
31 // Generate challenges to batch shifted and unshifted polynomials/commitments/evaluation
32 auto [unshifted_challenges, shifted_challenges] =
33 get_hypernova_batching_challenges<FF>(transcript, NUM_UNSHIFTED_ENTITIES, NUM_SHIFTED_ENTITIES);
34
35 // Batch evaluations
36 FF batched_unshifted_evaluation(0);
37 FF batched_shifted_evaluation(0);
38
39 for (auto [eval, challenge] : zip_view(sumcheck_output.claimed_evaluations.get_unshifted(), unshifted_challenges)) {
40 batched_unshifted_evaluation += eval * challenge;
41 }
42 for (auto [eval, challenge] : zip_view(sumcheck_output.claimed_evaluations.get_shifted(), shifted_challenges)) {
43 batched_shifted_evaluation += eval * challenge;
44 }
45
46 // Batch commitments
47 VerifierCommitments verifier_commitments(instance->get_vk(), instance->witness_commitments);
48
49 Commitment batched_unshifted_commitment = batch_mul(verifier_commitments.get_unshifted(), unshifted_challenges);
50 Commitment batched_shifted_commitment = batch_mul(verifier_commitments.get_to_be_shifted(), shifted_challenges);
51
52 return Accumulator{ .challenge = sumcheck_output.challenge,
53 .non_shifted_evaluation = batched_unshifted_evaluation,
54 .shifted_evaluation = batched_shifted_evaluation,
55 .non_shifted_commitment = batched_unshifted_commitment,
56 .shifted_commitment = batched_shifted_commitment };
57};
58
59template <typename Flavor>
62{
63 BB_BENCH_NAME("HypernovaFoldingVerifier::sumcheck_on_incoming_instance");
64
65 vinfo("HypernovaFoldingVerifier: verifying Oink proof...");
66 // Complete the incoming verifier instance
67 OinkVerifier verifier{ instance, transcript };
68 transcript->load_proof(proof);
69 verifier.verify();
70
71 instance->gate_challenges = transcript->template get_dyadic_powers_of_challenge<FF>(
72 "HypernovaFoldingProver:gate_challenge", Flavor::VIRTUAL_LOG_N);
73
74 // Sumcheck verification
75 vinfo("HypernovaFoldingVerifier: verifying Sumcheck to turn instance into an accumulator...");
76
77 std::vector<FF> padding_indicator_array(Flavor::VIRTUAL_LOG_N, 1);
78 SumcheckVerifier sumcheck(transcript, instance->alpha, Flavor::VIRTUAL_LOG_N);
79 SumcheckOutput<Flavor> sumcheck_output =
80 sumcheck.verify(instance->relation_parameters, instance->gate_challenges, padding_indicator_array);
81
82 return sumcheck_output;
83};
84
85template <typename Flavor>
88 const Proof& proof)
89{
90 BB_BENCH_NAME("HypernovaFoldingVerifier::instance_to_accumulator");
91
92 auto sumcheck_output = sumcheck_on_incoming_instance(instance, proof);
93
94 auto accumulator = sumcheck_output_to_accumulator(sumcheck_output, instance);
95
96 if (sumcheck_output.verified) {
97 vinfo("HypernovaFoldingVerifier: Successfully turned instance into accumulator.");
98 } else {
99 vinfo("HypernovaFoldingVerifier: Failed to recursively verify Sumcheck to turn instance into an accumulator. "
100 "Ignore if generating the VKs");
101 }
102
103 return { sumcheck_output.verified, accumulator };
104};
105
106template <typename Flavor>
110{
111 BB_BENCH_NAME("HypernovaFoldingVerifier::verify_folding_proof");
112
113 vinfo("HypernovaFoldingVerifier: verifying folding proof...");
114
115 auto sumcheck_output = sumcheck_on_incoming_instance(instance, proof);
116
117 // Generate challenges to batch shifted and unshifted polynomials/commitments/evaluation
118 const auto [unshifted_challenges, shifted_challenges] =
119 get_hypernova_batching_challenges<FF>(transcript, NUM_UNSHIFTED_ENTITIES, NUM_SHIFTED_ENTITIES);
120
121 VerifierCommitments verifier_commitments(instance->get_vk(), instance->witness_commitments);
122
123 MultilinearBatchingVerifier batching_verifier(transcript);
124 auto [sumcheck_batching_result, new_accumulator] =
125 batching_verifier.verify_proof(sumcheck_output, verifier_commitments, unshifted_challenges, shifted_challenges);
126
127 if (sumcheck_output.verified && sumcheck_batching_result) {
128 vinfo("HypernovaFoldingVerifier: successfully verified folding proof.");
129 } else if (!sumcheck_output.verified) {
130 vinfo("HypernovaFoldingVerifier: Failed to recursively verify Sumcheck to turn instance into an accumulator. "
131 "Ignore if generating the VKs");
132 } else {
133 vinfo("HypernovaFoldingVerifier: Failed to recursively verify Sumcheck to batch two accumulators. Ignore if "
134 "generating the VKs");
135 }
136
137 return { sumcheck_output.verified, sumcheck_batching_result, new_accumulator };
138};
139
142} // namespace bb
std::shared_ptr< Napi::ThreadSafeFunction > instance
#define BB_BENCH_NAME(name)
Definition bb_bench.hpp:219
HyperNova folding verifier (native + recursive). Verifies folding proofs and maintains accumulators.
SumcheckOutput< Flavor > sumcheck_on_incoming_instance(const std::shared_ptr< VerifierInstance > &instance, const Proof &proof)
Perform sumcheck on the incoming instance.
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.
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 class for all the presumcheck rounds, which are shared between the folding verifier and ultr...
void verify()
Oink Verifier function that runs all the rounds of the verifier.
A template class for a reference array. Behaves as if std::array<T&, N> was possible.
Definition ref_array.hpp:22
Implementation of the sumcheck Verifier for statements of the form for multilinear polynomials .
Definition sumcheck.hpp:719
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...
Definition sumcheck.hpp:777
#define vinfo(...)
Definition log.hpp:94
Entry point for Barretenberg command-line interface.
Definition api.hpp:5
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
Verifier's claim for multilinear batching - contains commitments and evaluation claims.
Contains the evaluations of multilinear polynomials at the challenge point . These are computed by S...
ClaimedEvaluations claimed_evaluations
std::vector< FF > challenge