Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
hypernova_prover.hpp
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#pragma once
17
18#include <optional>
19#include <vector>
20
21namespace bb {
22
58 public:
63
64 HypernovaFoldingProver(std::shared_ptr<Transcript> transcript)
65 : transcript(std::move(transcript)) {};
66
70 template <typename InstanceFlavor>
72 const std::shared_ptr<ProverInstance_<InstanceFlavor>>& instance,
74 {
75 BB_BENCH_NAME("HypernovaFoldingProver::instance_to_accumulator");
76 vinfo("HypernovaFoldingProver: converting instance to accumulator...");
77
78 auto precomputed_vk =
79 honk_vk ? honk_vk : std::make_shared<typename InstanceFlavor::VerificationKey>(instance->get_precomputed());
80 OinkProver<InstanceFlavor> oink_prover{ instance, precomputed_vk, transcript };
81 oink_prover.prove();
84 }
85
86 instance->gate_challenges = transcript->template get_dyadic_powers_of_challenge<FF>(
87 "HypernovaFoldingProver:gate_challenge", InstanceFlavor::VIRTUAL_LOG_N);
88
89 auto sumcheck_output = [&] {
90 BB_BENCH_NAME("HypernovaFoldingProver::sumcheck");
91 SumcheckProver<InstanceFlavor> sumcheck(instance->dyadic_size(),
92 instance->polynomials,
94 instance->alpha,
95 instance->gate_challenges,
96 instance->relation_parameters,
97 InstanceFlavor::VIRTUAL_LOG_N);
98 return sumcheck.prove();
99 }();
102 }
103
104 Accumulator accumulator =
105 sumcheck_output_to_accumulator<InstanceFlavor>(sumcheck_output, instance, precomputed_vk);
106 vinfo("HypernovaFoldingProver: accumulator constructed.");
107 return accumulator;
108 }
109
114 template <typename InstanceFlavor>
117 {
118 cached_claims.emplace_back(instance_to_accumulator<InstanceFlavor>(instance, honk_vk));
119 return transcript->export_proof();
120 }
121
129 {
130 BB_BENCH_NAME("HypernovaFoldingProver::finalize");
131
133 claims.reserve((previous_accumulator.has_value() ? 1 : 0) + cached_claims.size());
134 if (previous_accumulator.has_value()) {
135 claims.emplace_back(std::move(*previous_accumulator));
136 }
137 for (auto& claim : cached_claims) {
138 claims.emplace_back(std::move(claim));
139 }
140 cached_claims.clear();
141 BB_ASSERT(!claims.empty(), "HypernovaFoldingProver::finalize: nothing to fold");
142
143 if (claims.size() == 1) {
144 // No batching: the single claim is already the accumulator.
145 return { HonkProof{}, std::move(claims[0]) };
146 }
147 MultilinearBatchingProver batching_prover(std::move(claims), transcript);
148 HonkProof proof = batching_prover.construct_proof();
149 return { std::move(proof), batching_prover.compute_new_claim() };
150 }
151
155 HonkProof export_proof() { return transcript->export_proof(); };
156
157 // Read access to the per-instance claims accumulated so far
159
160 private:
161 std::shared_ptr<Transcript> transcript;
162 std::vector<Accumulator> cached_claims; // one per accumulated instance, in order
163
167 template <typename InstanceFlavor>
169 const std::shared_ptr<ProverInstance_<InstanceFlavor>>& instance,
171 {
172 BB_BENCH_NAME("HypernovaFoldingProver::sumcheck_output_to_accumulator");
173
174 auto [unshifted_challenges, shifted_challenges] = get_hypernova_batching_challenges<FF>(
175 transcript, InstanceFlavor::NUM_UNSHIFTED_ENTITIES, InstanceFlavor::NUM_SHIFTED_ENTITIES);
176
177 Polynomial<FF> batched_unshifted_polynomial = batch_polynomials<InstanceFlavor::NUM_UNSHIFTED_ENTITIES>(
178 instance->polynomials.get_unshifted(), instance->dyadic_size(), unshifted_challenges);
179 Polynomial<FF> batched_shifted_polynomial = batch_polynomials<InstanceFlavor::NUM_SHIFTED_ENTITIES>(
180 instance->polynomials.get_to_be_shifted(), instance->dyadic_size(), shifted_challenges);
181
182 FF batched_unshifted_evaluation(0);
183 FF batched_shifted_evaluation(0);
184 for (auto [eval, challenge] :
185 zip_view(sumcheck_output.claimed_evaluations.get_unshifted(), unshifted_challenges)) {
186 batched_unshifted_evaluation += eval * challenge;
187 }
188 for (auto [eval, challenge] : zip_view(sumcheck_output.claimed_evaluations.get_shifted(), shifted_challenges)) {
189 batched_shifted_evaluation += eval * challenge;
190 }
191
193 VerifierCommitmentsConstructor<InstanceFlavor>::construct(honk_vk, instance->commitments);
194
195 Commitment batched_unshifted_commitment = batch_mul(verifier_commitments.get_unshifted(), unshifted_challenges);
196 Commitment batched_shifted_commitment = batch_mul(verifier_commitments.get_to_be_shifted(), shifted_challenges);
197
198 return Accumulator{
199 .challenge = std::move(sumcheck_output.challenge),
200 .non_shifted_evaluation = batched_unshifted_evaluation,
201 .shifted_evaluation = batched_shifted_evaluation,
202 .non_shifted_polynomial = std::move(batched_unshifted_polynomial),
203 .shifted_polynomial = std::move(batched_shifted_polynomial),
204 .non_shifted_commitment = batched_unshifted_commitment,
205 .shifted_commitment = batched_shifted_commitment,
206 .dyadic_size = instance->dyadic_size(),
207 };
208 }
209
213 template <size_t N>
215 const size_t& full_batched_size,
216 const std::vector<FF>& challenges)
217 {
218 BB_BENCH_NAME("HypernovaFoldingProver::batch_polynomials");
219 BB_ASSERT_EQ(full_batched_size,
220 polynomials_to_batch[0].virtual_size(),
221 "The virtual size of the first polynomial is different from the full batched size.");
222 BB_ASSERT_EQ(challenges.size(),
223 N,
224 "The number of challenges provided does not match the number of polynomials to batch.");
225
226 size_t min_start = polynomials_to_batch[0].start_index();
227 size_t max_end = polynomials_to_batch[0].end_index();
228 for (size_t idx = 1; idx < N; idx++) {
229 min_start = std::min(min_start, polynomials_to_batch[idx].start_index());
230 max_end = std::max(max_end, polynomials_to_batch[idx].end_index());
231 }
232
234 sources.reserve(N - 1);
235 for (size_t i = 1; i < N; ++i) {
236 sources.emplace_back(polynomials_to_batch[i]);
237 }
238 auto tail_scalars = std::span<const FF>(challenges).subspan(1);
239 auto sources_span = std::span<const PolynomialSpan<const FF>>(sources);
240 if (min_start < polynomials_to_batch[0].start_index() || max_end > polynomials_to_batch[0].end_index()) {
241 Polynomial<FF> result(max_end - min_start, full_batched_size, min_start);
242 result += polynomials_to_batch[0];
243 add_scaled_batch(result, sources_span, tail_scalars);
244 return result;
245 }
246 add_scaled_batch(polynomials_to_batch[0], sources_span, tail_scalars);
247 return polynomials_to_batch[0];
248 }
249
253 template <size_t N> static Commitment batch_mul(std::span<Commitment, N> _points, std::vector<FF>& scalars)
254 {
255 std::vector<Commitment> points(N);
256 for (size_t idx = 0; idx < N; ++idx) {
257 points[idx] = _points[idx];
258 }
259 return Commitment::batch_mul(points, scalars);
260 }
261};
262
263} // namespace bb
constexpr size_t N
#define BB_ASSERT(expression,...)
Definition assert.hpp:70
#define BB_ASSERT_EQ(actual, expected,...)
Definition assert.hpp:83
#define BB_BENCH_NAME(name)
Definition bb_bench.hpp:264
Common transcript class for both parties. Stores the data for the current round, as well as the manif...
HyperNova folding prover. Folds circuit instances into accumulators, deferring PCS verification.
std::pair< HonkProof, Accumulator > finalize(std::optional< Accumulator > previous_accumulator=std::nullopt)
Batch the previous accumulator (if any) and the cached claims into a single accumulator.
MegaFlavor::Commitment Commitment
static Polynomial< FF > batch_polynomials(RefArray< Polynomial< FF >, N > polynomials_to_batch, const size_t &full_batched_size, const std::vector< FF > &challenges)
Batch prover polynomials. Batching happens in place into the first polynomial in the RefArray supplie...
std::shared_ptr< Transcript > transcript
HonkProof export_proof()
Export the proof contained in the transcript.
std::vector< Accumulator > cached_claims
HonkProof accumulate_instance(const std::shared_ptr< ProverInstance_< InstanceFlavor > > &instance, const std::shared_ptr< typename InstanceFlavor::VerificationKey > &honk_vk=nullptr)
Turn an instance into an accumulator and cache the resulting claim for the final batching.
HypernovaFoldingProver(std::shared_ptr< Transcript > transcript)
Accumulator instance_to_accumulator(const std::shared_ptr< ProverInstance_< InstanceFlavor > > &instance, const std::shared_ptr< typename InstanceFlavor::VerificationKey > &honk_vk=nullptr)
Turn an instance into an accumulator by running Sumcheck.
Accumulator sumcheck_output_to_accumulator(SumcheckOutput< InstanceFlavor > &sumcheck_output, const std::shared_ptr< ProverInstance_< InstanceFlavor > > &instance, const std::shared_ptr< typename InstanceFlavor::VerificationKey > &honk_vk)
Convert the output of the sumcheck run on the incoming instance into an accumulator.
static Commitment batch_mul(std::span< Commitment, N > _points, std::vector< FF > &scalars)
Utility to perform batch mul of commitments.
const std::vector< Accumulator > & get_cached_claims() const
Curve::ScalarField FF
BaseTranscript< Codec, HashFunction > Transcript
Curve::AffineElement Commitment
Public entrypoint for multilinear batching.
Executes the "Oink" phase of the Honk proving protocol: the initial rounds that commit to witness dat...
void prove(bool emit_alpha=true)
Commit to witnesses, compute relation parameters, and prepare for Sumcheck.
Contains all the information required by a Honk prover to create a proof, constructed from a finalize...
A template class for a reference array. Behaves as if std::array<T&, N> was possible.
Definition ref_array.hpp:23
The implementation of the sumcheck Prover for statements of the form for multilinear polynomials .
Definition sumcheck.hpp:304
SumcheckOutput< Flavor > prove()
Non-ZK version: Compute round univariate, place it in transcript, compute challenge,...
Definition sumcheck.hpp:398
typename VerifierCommitmentEntities< Flavor, Commitment >::Type Commitments
static Commitments construct(const std::shared_ptr< VerificationKey > &verification_key)
#define vinfo(...)
Definition log.hpp:94
bool use_memory_profile
MemoryProfile GLOBAL_MEMORY_PROFILE
Entry point for Barretenberg command-line interface.
Definition api.hpp:5
std::vector< fr > HonkProof
Definition proof.hpp:15
void add_scaled_batch(Polynomial< Fr > &dst, std::span< const PolynomialSpan< const Fr > > sources, std::span< const Fr > scalars)
Fused parallel batched add: dst += sum_i scalars[i] * sources[i].
STL namespace.
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
Prover's claim for multilinear batching - contains polynomials and their evaluation claims.
Contains the evaluations of multilinear polynomials at the challenge point . These are computed by S...
ClaimedEvaluations claimed_evaluations
std::vector< FF > challenge
void add_checkpoint(const std::string &stage)
VectorField result