Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
hypernova_verifier.test.cpp
Go to the documentation of this file.
12#include "gtest/gtest.h"
13
14#include <optional>
15#include <vector>
16
17using namespace bb;
18
28{
30 "expected manifest only defined for MegaKernelFlavor / MegaAppFlavor");
31 // Apps keep LogDerivLookup; kernels drop it.
32 constexpr bool has_lookup = std::is_same_v<Flavor, bb::MegaAppFlavor>;
33
34 // Databus columns this flavor commits, in builder order, derived from the flavor's bus indices.
35 constexpr std::array<const char*, 7> ALL_BUSES = { "KERNEL_CALLDATA", "FIRST_APP_CALLDATA",
36 "SECOND_APP_CALLDATA", "THIRD_APP_CALLDATA",
37 "FOURTH_APP_CALLDATA", "FIFTH_APP_CALLDATA",
38 "RETURN_DATA" };
39 std::vector<std::string> buses;
40 for (size_t builder_idx : Flavor::BUILDER_BUS_INDICES) {
41 buses.emplace_back(ALL_BUSES[builder_idx]);
42 }
43
44 TranscriptManifest manifest;
45 constexpr size_t frs_per_G = FrCodec::calc_num_fields<curve::BN254::AffineElement>();
46 constexpr size_t NUM_SUMCHECK_UNIVARIATES = Flavor::VIRTUAL_LOG_N;
47
48 size_t round = 0;
49
50 // Round 0: Oink preamble + wires + ECC ops + databus -> eta + rom_logup_gamma challenges
51 manifest.add_challenge(round, std::array{ "eta", "rom_logup_gamma" });
52 manifest.add_entry(round, "vk_hash", 1);
53 for (size_t i = 0; i < 4; ++i) {
54 manifest.add_entry(round, "public_input_" + std::to_string(i), 1);
55 }
56 for (const auto& wire : { "W_L", "W_R", "W_O" }) {
57 manifest.add_entry(round, wire, frs_per_G);
58 }
59 for (const auto& wire : { "ECC_OP_WIRE_1", "ECC_OP_WIRE_2", "ECC_OP_WIRE_3", "ECC_OP_WIRE_4" }) {
60 manifest.add_entry(round, wire, frs_per_G);
61 }
62 for (const auto& bus : buses) {
63 manifest.add_entry(round, bus, frs_per_G);
64 manifest.add_entry(round, bus + "_READ_COUNTS", frs_per_G);
65 }
66 round++;
67
68 // Round 1: (lookup read columns) + w_4 -> beta, gamma challenges
69 manifest.add_challenge(round, std::array{ "beta", "gamma" });
70 if constexpr (has_lookup) {
71 manifest.add_entry(round, "LOOKUP_READ_COUNTS", frs_per_G);
72 manifest.add_entry(round, "LOOKUP_READ_TAGS", frs_per_G);
73 }
74 manifest.add_entry(round, "W_4", frs_per_G);
75 round++;
76
77 // Round 2: (lookup inverses) + databus inverses + z_perm -> alpha + gate_challenge
78 manifest.add_challenge(round, "alpha");
79 manifest.add_challenge(round, "HypernovaFoldingProver:gate_challenge");
80 if constexpr (has_lookup) {
81 manifest.add_entry(round, "LOOKUP_INVERSES", frs_per_G);
82 }
83 for (const auto& bus : buses) {
84 manifest.add_entry(round, bus + "_INVERSES", frs_per_G);
85 }
86 manifest.add_entry(round, "Z_PERM", frs_per_G);
87 round++;
88
89 // Instance sumcheck univariates
90 for (size_t i = 0; i < NUM_SUMCHECK_UNIVARIATES; ++i) {
91 manifest.add_challenge(round, "Sumcheck:u_" + std::to_string(i));
92 manifest.add_entry(round, "Sumcheck:univariate_" + std::to_string(i), 8);
93 round++;
94 }
95
96 // Unshifted + shifted batching challenges (accumulate_instance), then the batching challenge + MLB alpha
97 // (finalize). All consecutive challenges since no new prover data is added in between.
98 for (size_t i = 0; i < Flavor::NUM_UNSHIFTED_ENTITIES - 1; ++i) {
99 manifest.add_challenge(round, "unshifted_challenge_" + std::to_string(i));
100 }
101 for (size_t i = 0; i < Flavor::NUM_SHIFTED_ENTITIES - 1; ++i) {
102 manifest.add_challenge(round, "shifted_challenge_" + std::to_string(i));
103 }
104 manifest.add_challenge(round, "claim_batching_challenge");
105 manifest.add_challenge(round, "Sumcheck:alpha");
106 manifest.add_entry(round, "Sumcheck:evaluations", Flavor::NUM_ALL_ENTITIES);
107 round++;
108
109 // MLB sumcheck univariates
110 for (size_t i = 0; i < NUM_SUMCHECK_UNIVARIATES; ++i) {
111 manifest.add_challenge(round, "Sumcheck:u_" + std::to_string(i));
112 manifest.add_entry(round, "Sumcheck:univariate_" + std::to_string(i), 3);
113 round++;
114 }
115
116 // Final batched evaluations of the original polynomials (6 = 3 entities * 2 claims), then the merge challenge.
117 manifest.add_entry(round, "Sumcheck:evaluations", MultilinearBatchingFlavor_</*NumClaims*/ 2>::NUM_ALL_ENTITIES);
118 manifest.add_challenge(round, "claim_merge_challenge");
119
120 return manifest;
121}
122
123// Exercises the stateful folding scheme end to end: a prover folds a variable number of instances (optionally
124// against a previous accumulator), then the native and recursive verifiers fold the same group from the produced
125// proofs. The verifiers' accumulators are cross-checked against the prover's. Failure modes specific to HyperNova
126// (instance-to-accumulator sumcheck failure) are tested here; the multilinear batching faults (eq-consistency,
127// merge-binding, commitment binding) live in multilinear_batching.test.cpp and are not duplicated.
128class HypernovaFoldingVerifierTests : public ::testing::Test {
129 protected:
131
132 public:
139
147
148 static constexpr size_t LOG_NUM_GATES = 4;
149
150 enum class TamperingMode : uint8_t { None, Instance };
151
152 template <typename Flavor>
161
163 {
164 for (size_t idx = 0; auto [challenge_lhs, challenge_rhs] : zip_view(lhs.challenge, rhs.challenge)) {
165 if (challenge_lhs != challenge_rhs) {
166 info("Mismatch in the challenges at index ", idx);
167 return false;
168 }
169 }
170 if (lhs.non_shifted_commitment != rhs.non_shifted_commitment) {
171 info("Mismatch in the unshifted commitments");
172 return false;
173 }
174 if (lhs.shifted_commitment != rhs.shifted_commitment) {
175 info("Mismatch in the shifted commitments");
176 return false;
177 }
178 if (lhs.non_shifted_evaluation != rhs.non_shifted_evaluation) {
179 info("Mismatch in the unshifted evaluations");
180 return false;
181 }
182 if (lhs.shifted_evaluation != rhs.shifted_evaluation) {
183 info("Mismatch in the shifted evaluations");
184 return false;
185 }
186 return true;
187 }
188
192 template <typename NativeFlavor, typename RecursiveFlavor>
194 Builder* builder, const std::shared_ptr<VerifierInstance_<NativeFlavor>>& native_instance)
195 {
196 using FF = typename RecursiveFlavor::FF;
197 using Commitment = typename RecursiveFlavor::Commitment;
198 using VerificationKey = typename RecursiveFlavor::VerificationKey;
199 using VKAndHash = typename RecursiveFlavor::VKAndHash;
200
201 auto recursive_vk =
203 FF::from_witness(builder, native_instance->get_vk()->hash()));
204 auto recursive_instance = std::make_shared<VerifierInstance_<RecursiveFlavor>>(recursive_vk);
205
206 recursive_instance->alpha = FF::from_witness(builder, native_instance->alpha);
207
208 auto native_comms = native_instance->witness_commitments.get_all();
209 for (auto [native_comm, recursive_comm] :
210 zip_view(native_comms, recursive_instance->witness_commitments.get_all())) {
211 recursive_comm = Commitment::from_witness(builder, native_comm);
212 }
213
214 recursive_instance->gate_challenges = std::vector<FF>(native_instance->gate_challenges.size());
215 for (auto [native_challenge, recursive_challenge] :
216 zip_view(native_instance->gate_challenges, recursive_instance->gate_challenges)) {
217 recursive_challenge = FF::from_witness(builder, native_challenge);
218 }
219
220 recursive_instance->relation_parameters.eta =
221 FF::from_witness(builder, native_instance->relation_parameters.eta);
222 recursive_instance->relation_parameters.eta_two =
223 FF::from_witness(builder, native_instance->relation_parameters.eta_two);
224 recursive_instance->relation_parameters.eta_three =
225 FF::from_witness(builder, native_instance->relation_parameters.eta_three);
226 recursive_instance->relation_parameters.beta =
227 FF::from_witness(builder, native_instance->relation_parameters.beta);
228 recursive_instance->relation_parameters.gamma =
229 FF::from_witness(builder, native_instance->relation_parameters.gamma);
230 recursive_instance->relation_parameters.public_input_delta =
231 FF::from_witness(builder, native_instance->relation_parameters.public_input_delta);
232
233 if constexpr (NativeFlavor::HasZK) {
234 recursive_instance->gemini_masking_commitment =
235 Commitment::from_witness(builder, native_instance->gemini_masking_commitment);
236 }
237
238 return recursive_instance;
239 }
240
241 template <typename Flavor> static void tamper_instance(const std::shared_ptr<ProverInstance_<Flavor>>& instance)
242 {
243 // Tamper with w_l at the first row where q_arith is non-zero (an active arithmetic gate).
244 auto& q_arith = instance->polynomials.q_arith();
245 for (size_t i = ProverInstance_<Flavor>::TRACE_OFFSET; i < q_arith.end_index(); i++) {
246 if (!q_arith[i].is_zero()) {
247 instance->polynomials.w_l().at(i) = FF::random_element();
248 break;
249 }
250 }
251 }
252
257 {
258 auto transcript = std::make_shared<NativeTranscript>();
259 FoldingProver prover(transcript);
260 prover.accumulate_instance<KernelFlavor>(generate_instance<KernelFlavor>());
261 auto [_proof, accumulator] = prover.finalize();
262 return accumulator;
263 }
264
270 static void test_folding(size_t num_instances, bool use_previous_accumulator, TamperingMode mode)
271 {
274 prover_instances.reserve(num_instances);
275 vks.reserve(num_instances);
276 for (size_t i = 0; i < num_instances; ++i) {
277 prover_instances.push_back(generate_instance<KernelFlavor>(LOG_NUM_GATES + i));
278 vks.push_back(std::make_shared<KernelFlavor::VerificationKey>(prover_instances.back()->get_precomputed()));
279 }
281 tamper_instance<KernelFlavor>(prover_instances.back());
282 }
283
284 std::optional<ProverAccumulator> previous_prover_accumulator;
285 std::optional<NativeVerifierAccumulator> previous_native_accumulator;
286 if (use_previous_accumulator) {
287 previous_prover_accumulator = make_previous_accumulator();
288 previous_native_accumulator = previous_prover_accumulator->to_verifier_claim_for_testing();
289 }
290
291 // ---- Prover ----
292 auto prover_transcript = std::make_shared<NativeTranscript>();
293 FoldingProver prover(prover_transcript);
295 proofs.reserve(num_instances);
296 for (size_t i = 0; i < num_instances; ++i) {
297 proofs.push_back(prover.accumulate_instance<KernelFlavor>(prover_instances[i], vks[i]));
298 }
299 auto [batch_proof, prover_accumulator] =
300 prover.finalize(previous_prover_accumulator.has_value() ? previous_prover_accumulator : std::nullopt);
301
302 // ---- Native verifier ----
304 native_verifier_instances.reserve(num_instances);
305 for (size_t i = 0; i < num_instances; ++i) {
306 native_verifier_instances.push_back(
308 }
309 auto native_transcript = std::make_shared<NativeTranscript>();
310 NativeVerifier native_verifier(native_transcript);
311 std::vector<bool> native_sumchecks;
312 native_sumchecks.reserve(num_instances);
313 for (size_t i = 0; i < num_instances; ++i) {
314 native_sumchecks.push_back(
315 native_verifier.accumulate_instance<KernelFlavor>(native_verifier_instances[i], proofs[i]));
316 }
317 auto [native_verified, native_accumulator] = native_verifier.finalize(
318 batch_proof, previous_native_accumulator.has_value() ? previous_native_accumulator : std::nullopt);
319
320 // ---- Recursive verifier (native instances are now populated) ----
323 recursiver_verifier_instances.reserve(num_instances);
324 for (size_t i = 0; i < num_instances; ++i) {
325 recursiver_verifier_instances.push_back(
326 make_recursive_verifier_instance<KernelFlavor, KernelRecursiveFlavor>(&builder,
327 native_verifier_instances[i]));
328 }
329 std::optional<RecursiveVerifier::Accumulator> previous_recursive_accumulator;
330 if (previous_native_accumulator.has_value()) {
331 previous_recursive_accumulator =
332 create_recursive_verifier_accumulator(&builder, *previous_native_accumulator);
333 }
334 auto recursive_transcript = std::make_shared<RecursiveTranscript>();
335 RecursiveVerifier recursive_verifier(recursive_transcript);
336 std::vector<bool> recursive_sumchecks;
337 recursive_sumchecks.reserve(num_instances);
338 for (size_t i = 0; i < num_instances; ++i) {
339 stdlib::Proof<Builder> stdlib_proof(builder, proofs[i]);
340 recursive_sumchecks.push_back(recursive_verifier.accumulate_instance<KernelRecursiveFlavor>(
341 recursiver_verifier_instances[i], stdlib_proof));
342 }
343 stdlib::Proof<Builder> stdlib_batch_proof(builder, batch_proof);
344 auto [recursive_verified, recursive_accumulator] = recursive_verifier.finalize(
345 stdlib_batch_proof,
346 previous_recursive_accumulator.has_value() ? previous_recursive_accumulator : std::nullopt);
347
348 // ---- Assertions ----
349 const bool tampered = (mode == TamperingMode::Instance);
350 for (size_t i = 0; i < num_instances; ++i) {
351 const bool expected = !tampered || i != num_instances - 1;
352 EXPECT_EQ(native_sumchecks[i], expected) << "native instance " << i;
353 EXPECT_EQ(recursive_sumchecks[i], native_sumchecks[i]) << "recursive instance " << i;
354 }
355 EXPECT_EQ(bb::CircuitChecker::check(builder), !tampered);
356 EXPECT_TRUE(native_verified);
357 EXPECT_EQ(recursive_verified, native_verified);
358 EXPECT_TRUE(compare_prover_verifier_accumulators(prover_accumulator, native_accumulator));
360 prover_accumulator, recursive_accumulator.template get_value<NativeVerifierAccumulator>()));
361 }
362
367 template <typename Flavor> void expect_folding_manifest()
368 {
371
372 // Build a (valid) previous accumulator from a single instance on a separate, discarded transcript.
373 ProverAccumulator previous_prover_accumulator = [&] {
374 auto transcript = std::make_shared<NativeTranscript>();
375 bb::HypernovaFoldingProver prover(transcript);
376 prover.accumulate_instance<Flavor>(generate_instance<Flavor>());
377 auto [_proof, accumulator] = prover.finalize();
378 return accumulator;
379 }();
380 auto previous_verifier_accumulator = previous_prover_accumulator.to_verifier_claim_for_testing();
381
382 // Prover folds one incoming instance against the previous accumulator -> a 2-claim batch.
383 auto incoming_instance = generate_instance<Flavor>(LOG_NUM_GATES + 1);
384 auto incoming_vk = std::make_shared<typename Flavor::VerificationKey>(incoming_instance->get_precomputed());
385 auto folding_transcript = std::make_shared<NativeTranscript>();
386 bb::HypernovaFoldingProver folding_prover(folding_transcript);
387 HonkProof instance_proof = folding_prover.accumulate_instance<Flavor>(incoming_instance, incoming_vk);
388 auto [batch_proof, _folded] = folding_prover.finalize(previous_prover_accumulator);
389
390 // Verifier replays the same session with manifest tracking enabled.
391 auto incoming_verifier_instance =
393 auto verifier_transcript = std::make_shared<NativeTranscript>();
394 verifier_transcript->enable_manifest();
395 bb::HypernovaFoldingNativeVerifier verifier(verifier_transcript);
396 verifier.accumulate_instance<Flavor>(incoming_verifier_instance, instance_proof);
397 verifier.finalize(batch_proof, previous_verifier_accumulator);
398
399 auto actual_manifest = verifier_transcript->get_manifest();
400 auto expected_manifest = build_expected_folding_manifest<Flavor>();
401 ASSERT_EQ(actual_manifest.size(), expected_manifest.size());
402 for (size_t round = 0; round < actual_manifest.size(); ++round) {
403 EXPECT_EQ(actual_manifest[round], expected_manifest[round])
404 << "folding manifest discrepancy in round " << round;
405 }
406 }
407};
408
409// Completeness across widths, with and without a previous accumulator.
411{
412 for (size_t num_instances = 1; num_instances <= CHONK_MAX_CLAIMS_PER_KERNEL; ++num_instances) {
413 test_folding(num_instances, /*use_previous_accumulator=*/false, TamperingMode::None);
414 }
415}
416
417TEST_F(HypernovaFoldingVerifierTests, FoldWithPreviousAccumulator)
418{
419 for (size_t num_instances = 1; num_instances < CHONK_MAX_CLAIMS_PER_KERNEL; ++num_instances) {
420 test_folding(num_instances, /*use_previous_accumulator=*/true, TamperingMode::None);
421 }
422}
423
424// Folding a group that mixes flavors (a kernel instance and several app instances), as a real inner-kernel group
425// does. A single flavor-agnostic verifier folds all of them into one accumulator, cross-checked native vs recursive
426// vs prover.
428{
429 auto kernel_instance = generate_instance<KernelFlavor>();
430 auto app_instance_0 = generate_instance<AppFlavor>(LOG_NUM_GATES + 1);
431 auto app_instance_1 = generate_instance<AppFlavor>(LOG_NUM_GATES + 2);
432 auto kernel_vk = std::make_shared<KernelFlavor::VerificationKey>(kernel_instance->get_precomputed());
433 auto app_vk_0 = std::make_shared<AppFlavor::VerificationKey>(app_instance_0->get_precomputed());
434 auto app_vk_1 = std::make_shared<AppFlavor::VerificationKey>(app_instance_1->get_precomputed());
435
436 // ---- Prover: fold [kernel, app, app] into one accumulator ----
437 auto prover_transcript = std::make_shared<NativeTranscript>();
438 FoldingProver prover(prover_transcript);
439 HonkProof kernel_proof = prover.accumulate_instance<KernelFlavor>(kernel_instance, kernel_vk);
440 HonkProof app_proof_0 = prover.accumulate_instance<AppFlavor>(app_instance_0, app_vk_0);
441 HonkProof app_proof_1 = prover.accumulate_instance<AppFlavor>(app_instance_1, app_vk_1);
442 auto [batch_proof, prover_accumulator] = prover.finalize();
443
444 // ---- Native verifier ----
445 auto kernel_verifier_instance =
447 auto app_verifier_instance_0 =
449 auto app_verifier_instance_1 =
451 auto native_transcript = std::make_shared<NativeTranscript>();
452 NativeVerifier native_verifier(native_transcript);
453 EXPECT_TRUE(native_verifier.accumulate_instance<KernelFlavor>(kernel_verifier_instance, kernel_proof));
454 EXPECT_TRUE(native_verifier.accumulate_instance<AppFlavor>(app_verifier_instance_0, app_proof_0));
455 EXPECT_TRUE(native_verifier.accumulate_instance<AppFlavor>(app_verifier_instance_1, app_proof_1));
456 auto [native_verified, native_accumulator] = native_verifier.finalize(batch_proof);
457
458 // ---- Recursive verifier ----
460 auto kernel_recursive_instance =
461 make_recursive_verifier_instance<KernelFlavor, KernelRecursiveFlavor>(&builder, kernel_verifier_instance);
462 auto app_recursive_instance_0 =
463 make_recursive_verifier_instance<AppFlavor, AppRecursiveFlavor>(&builder, app_verifier_instance_0);
464 auto app_recursive_instance_1 =
465 make_recursive_verifier_instance<AppFlavor, AppRecursiveFlavor>(&builder, app_verifier_instance_1);
466 auto recursive_transcript = std::make_shared<RecursiveTranscript>();
467 RecursiveVerifier recursive_verifier(recursive_transcript);
468 stdlib::Proof<Builder> stdlib_kernel_proof(builder, kernel_proof);
469 recursive_verifier.accumulate_instance<KernelRecursiveFlavor>(kernel_recursive_instance, stdlib_kernel_proof);
470 stdlib::Proof<Builder> stdlib_app_proof_0(builder, app_proof_0);
471 recursive_verifier.accumulate_instance<AppRecursiveFlavor>(app_recursive_instance_0, stdlib_app_proof_0);
472 stdlib::Proof<Builder> stdlib_app_proof_1(builder, app_proof_1);
473 recursive_verifier.accumulate_instance<AppRecursiveFlavor>(app_recursive_instance_1, stdlib_app_proof_1);
474 stdlib::Proof<Builder> stdlib_batch_proof(builder, batch_proof);
475 auto [recursive_verified, recursive_accumulator] = recursive_verifier.finalize(stdlib_batch_proof);
476
478 EXPECT_TRUE(native_verified);
479 EXPECT_EQ(recursive_verified, native_verified);
480 EXPECT_TRUE(compare_prover_verifier_accumulators(prover_accumulator, native_accumulator));
481 EXPECT_TRUE(compare_prover_verifier_accumulators(
482 prover_accumulator, recursive_accumulator.template get_value<NativeVerifierAccumulator>()));
483}
484
485// Tampering an incoming instance's witness makes its instance-to-accumulator sumcheck fail (and the recursive
486// circuit unsatisfiable), while the other instances and the batching are unaffected.
488{
490 test_folding(/*num_instances=*/3, /*use_previous_accumulator=*/false, TamperingMode::Instance);
491}
492
493// Pin the folding transcript manifest for a previous-accumulator + one-instance (2-claim) fold, for both the kernel
494// and app instance flavors (they commit different databus columns and differ on LogDerivLookup).
495TEST_F(HypernovaFoldingVerifierTests, KernelFoldingManifestMatchesExpected)
496{
497 expect_folding_manifest<bb::MegaKernelFlavor>();
498}
499
500TEST_F(HypernovaFoldingVerifierTests, AppFoldingManifestMatchesExpected)
501{
502 expect_folding_manifest<bb::MegaAppFlavor>();
503}
#define BB_DISABLE_ASSERTS()
Definition assert.hpp:33
void expect_folding_manifest()
Drive a "previous accumulator + one instance" folding session through the native verifier with manife...
static std::shared_ptr< ProverInstance_< Flavor > > generate_instance(size_t log_num_gates=LOG_NUM_GATES)
RecursiveVerifier::Transcript RecursiveTranscript
static ProverAccumulator make_previous_accumulator()
Build a valid previous accumulator (a single-instance fold) for the prover and verifiers.
NativeVerifier::Transcript NativeTranscript
static bool compare_prover_verifier_accumulators(const ProverAccumulator &lhs, const NativeVerifierAccumulator &rhs)
static void tamper_instance(const std::shared_ptr< ProverInstance_< Flavor > > &instance)
static void test_folding(size_t num_instances, bool use_previous_accumulator, TamperingMode mode)
Fold num_instances kernel instances with the prover, then verify the group natively and recursively.
static std::shared_ptr< VerifierInstance_< RecursiveFlavor > > make_recursive_verifier_instance(Builder *builder, const std::shared_ptr< VerifierInstance_< NativeFlavor > > &native_instance)
Build a recursive verifier instance from a native one (already populated by the native verifier).
static constexpr size_t NUM_ALL_ENTITIES
HyperNova folding prover. Folds circuit instances into accumulators, deferring PCS verification.
MultilinearBatchingProverClaim Accumulator
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.
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.
MegaFlavor::Transcript Transcript
Stateful HyperNova folding verifier (native + recursive). Verifies a series of instances against a st...
std::pair< bool, Accumulator > finalize(const Proof &batching_proof, std::optional< Accumulator > previous_accumulator=std::nullopt)
Batch the previous accumulator (if any) and the cached claims into a single accumulator.
typename BaseFlavor::Transcript Transcript
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.
MultilinearBatchingVerifierClaim< Curve > Accumulator
Mega flavor specialized for Chonk app circuits.
Recursive counterpart to MegaAppFlavor.
Mega flavor specialized for Chonk kernel circuits.
Recursive counterpart to MegaKernelFlavor.
static void add_arithmetic_gates_with_public_inputs(Builder &builder, const size_t num_gates=4)
Add a specified number of arithmetic gates (with public inputs) to the provided circuit.
static void add_lookup_gates(Builder &builder, size_t num_iterations=1)
Add lookup gates using the uint32 XOR lookup table (table size 4096)
static void add_arithmetic_gates(Builder &builder, const size_t num_gates=4)
Add a specified number of arithmetic gates to the provided circuit.
Native flavor for multilinear batching sumcheck with NumClaims polynomials.
Base Native verification key class.
Definition flavor.hpp:138
Contains all the information required by a Honk prover to create a proof, constructed from a finalize...
void add_entry(size_t round, const std::string &element_label, size_t element_size)
void add_challenge(size_t round, const std::string &label)
Add a single challenge label to the manifest for the given round.
static bool check(const Builder &circuit)
Check the witness satisifies the circuit.
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 info(...)
Definition log.hpp:93
AluTraceBuilder builder
Definition alu.test.cpp:124
TranscriptManifest build_expected_folding_manifest()
Build the expected HyperNova folding transcript manifest for a "previous accumulator + one instance" ...
std::filesystem::path bb_crs_path()
void init_file_crs_factory(const std::filesystem::path &path)
Entry point for Barretenberg command-line interface.
Definition api.hpp:5
std::vector< fr > HonkProof
Definition proof.hpp:15
TEST_F(IPATest, ChallengesAreZero)
Definition ipa.test.cpp:160
MultilinearBatchingVerifierClaim< bb::MegaKernelRecursiveFlavor::Curve > create_recursive_verifier_accumulator(MegaCircuitBuilder *builder, const MultilinearBatchingVerifierClaim< bb::MegaKernelFlavor::Curve > &native_accumulator)
Test helper to create a recursive verifier accumulator from a native one.
HypernovaFoldingVerifier< true > HypernovaFoldingRecursiveVerifier
HypernovaFoldingVerifier< false > HypernovaFoldingNativeVerifier
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
std::string to_string(bb::avm2::ValueTag tag)
bb::VectorAffineElementPushSpan< BaseParams > lhs
bb::VectorAffineElementPushSpan< BaseParams > rhs
Prover's claim for multilinear batching - contains polynomials and their evaluation claims.
MultilinearBatchingVerifierClaim< curve::BN254 > to_verifier_claim_for_testing() const
Verifier's claim for multilinear batching - contains commitments and evaluation claims.
static field random_element(numeric::RNG *engine=nullptr) noexcept