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
17
18namespace bb {
19
20template <bool IsRecursive_>
21template <size_t N>
23 std::span<Commitment, N> _points, std::vector<FF>& scalars)
24{
25 std::vector<Commitment> points(N);
26 for (size_t idx = 0; idx < N; ++idx) {
27 points[idx] = _points[idx];
28 }
29 return Commitment::batch_mul(points, scalars);
30}
31
32template <bool IsRecursive_>
33template <typename InstanceFlavor>
35 const std::shared_ptr<VerifierInstance<InstanceFlavor>>& instance, const Proof& proof)
36{
37 static_assert(IsRecursiveFlavor<InstanceFlavor> == IsRecursive,
38 "InstanceFlavor recursive-ness must match the verifier's recursive-ness");
39 BB_BENCH_NAME("HypernovaFoldingVerifier::accumulate_instance");
40
42 proof.size(), InstanceFlavor::VIRTUAL_LOG_N);
43
44 auto sumcheck_output = sumcheck_on_incoming_instance<InstanceFlavor>(instance, proof, num_public_inputs);
45 cached_claims.emplace_back(sumcheck_output_to_accumulator<InstanceFlavor>(sumcheck_output, instance));
46
47 if (sumcheck_output.verified) {
48 vinfo("HypernovaFoldingVerifier: turned instance into accumulator.");
49 } else {
50 vinfo("HypernovaFoldingVerifier: instance-to-accumulator sumcheck failed. Ignore if generating VKs");
51 }
52 return sumcheck_output.verified;
53}
54
55template <bool IsRecursive_>
56template <typename InstanceFlavor>
58 const std::shared_ptr<VerifierInstance<InstanceFlavor>>& instance, const Proof& proof, size_t num_public_inputs)
59{
60 BB_BENCH_NAME("HypernovaFoldingVerifier::sumcheck_on_incoming_instance");
61 transcript->load_proof(proof);
62
63 OinkVerifier<InstanceFlavor> verifier{ instance, transcript, num_public_inputs };
64 verifier.verify();
65
66 instance->gate_challenges = transcript->template get_dyadic_powers_of_challenge<FF>(
67 "HypernovaFoldingProver:gate_challenge", InstanceFlavor::VIRTUAL_LOG_N);
68
69 SumcheckVerifier<InstanceFlavor> sumcheck(transcript, instance->alpha, InstanceFlavor::VIRTUAL_LOG_N);
70 return sumcheck.verify(instance->relation_parameters, instance->gate_challenges);
71}
72
73template <bool IsRecursive_>
74template <typename InstanceFlavor>
76 IsRecursive_>::sumcheck_output_to_accumulator(SumcheckOutput<InstanceFlavor>& sumcheck_output,
77 const std::shared_ptr<VerifierInstance<InstanceFlavor>>& instance)
78{
79 BB_BENCH_NAME("HypernovaFoldingVerifier::sumcheck_output_to_accumulator");
80
81 auto [unshifted_challenges, shifted_challenges] = get_hypernova_batching_challenges<FF>(
82 transcript, InstanceFlavor::NUM_UNSHIFTED_ENTITIES, InstanceFlavor::NUM_SHIFTED_ENTITIES);
83
84 FF batched_unshifted_evaluation(0);
85 FF batched_shifted_evaluation(0);
86 for (auto [eval, challenge] : zip_view(sumcheck_output.claimed_evaluations.get_unshifted(), unshifted_challenges)) {
87 batched_unshifted_evaluation += eval * challenge;
88 }
89 for (auto [eval, challenge] : zip_view(sumcheck_output.claimed_evaluations.get_shifted(), shifted_challenges)) {
90 batched_shifted_evaluation += eval * challenge;
91 }
92
94 VerifierCommitmentsConstructor<InstanceFlavor>::construct(instance->get_vk(), instance->witness_commitments);
95
96 Commitment batched_unshifted_commitment = batch_mul(verifier_commitments.get_unshifted(), unshifted_challenges);
97 Commitment batched_shifted_commitment = batch_mul(verifier_commitments.get_to_be_shifted(), shifted_challenges);
98
99 return Accumulator{ .challenge = sumcheck_output.challenge,
100 .non_shifted_evaluation = batched_unshifted_evaluation,
101 .shifted_evaluation = batched_shifted_evaluation,
102 .non_shifted_commitment = batched_unshifted_commitment,
103 .shifted_commitment = batched_shifted_commitment };
104}
105
106template <bool IsRecursive_>
108 IsRecursive_>::finalize(const Proof& batching_proof, std::optional<Accumulator> previous_accumulator)
109{
110 BB_BENCH_NAME("HypernovaFoldingVerifier::finalize");
111
113 claims.reserve((previous_accumulator.has_value() ? 1 : 0) + cached_claims.size());
114 if (previous_accumulator.has_value()) {
115 claims.emplace_back(std::move(*previous_accumulator));
116 }
117 for (auto& claim : cached_claims) {
118 claims.emplace_back(std::move(claim));
119 }
120 cached_claims.clear();
121 BB_ASSERT(!claims.empty(), "HypernovaFoldingVerifier::finalize: nothing to fold");
122
123 if (claims.size() == 1) {
124 // No batching: the single claim is already the accumulator.
125 return { true, std::move(claims[0]) };
126 }
127 transcript->load_proof(batching_proof);
128 BatchingVerifier batching_verifier(transcript);
129 return batching_verifier.verify_proof(claims);
130}
131
133template class HypernovaFoldingVerifier<true>;
134
136 const std::shared_ptr<VerifierInstance_<MegaKernelFlavor>>&, const HonkProof&);
138 const std::shared_ptr<VerifierInstance_<MegaAppFlavor>>&, const HonkProof&);
143
144} // namespace bb
constexpr size_t N
#define BB_ASSERT(expression,...)
Definition assert.hpp:70
#define BB_BENCH_NAME(name)
Definition bb_bench.hpp:264
Stateful HyperNova folding verifier (native + recursive). Verifies a series of instances against a st...
Commitment batch_mul(std::span< Commitment, N > _points, std::vector< FF > &scalars)
Utility to perform batch mul of commitments.
std::conditional_t< IsRecursive, stdlib::Proof< MegaCircuitBuilder >, HonkProof > Proof
bool accumulate_instance(const std::shared_ptr< VerifierInstance< InstanceFlavor > > &instance, const Proof &proof)
Verify the instance-to-accumulator sumcheck of one incoming proof and cache the resulting claim.
SumcheckOutput< InstanceFlavor > sumcheck_on_incoming_instance(const std::shared_ptr< VerifierInstance< InstanceFlavor > > &instance, const Proof &proof, size_t num_public_inputs)
Perform Oink + Sumcheck on the incoming instance, generating the challenges at which the polynomial c...
typename BaseFlavor::Commitment Commitment
Public entrypoint for multilinear batching verification.
std::pair< bool, VerifierClaim > verify_proof(const std::vector< VerifierClaim > &claims)
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.
Implementation of the sumcheck Verifier for statements of the form for multilinear polynomials .
Definition sumcheck.hpp:802
SumcheckOutput< Flavor > verify(const bb::RelationParameters< FF > &relation_parameters, const std::vector< FF > &gate_challenges)
The Sumcheck verification method. First it extracts round univariate, checks sum (the sumcheck univar...
Definition sumcheck.hpp:859
typename VerifierCommitmentEntities< Flavor, Commitment >::Type Commitments
static Commitments construct(const std::shared_ptr< VerificationKey > &verification_key)
The VerifierInstance encapsulates all the necessary information for a Honk Verifier to verify a proof...
A simple wrapper around a vector of stdlib field elements representing a proof.
Definition proof.hpp:20
#define vinfo(...)
Definition log.hpp:94
Entry point for Barretenberg command-line interface.
Definition api.hpp:5
std::vector< fr > HonkProof
Definition proof.hpp:15
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
Verifier's claim for multilinear batching - contains commitments and evaluation claims.
static 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