Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
hypernova_prover.test.cpp
Go to the documentation of this file.
5#include "gtest/gtest.h"
6
7#include <optional>
8
9using namespace bb;
10
11// The stateful folding prover is flavor-agnostic; accumulate_instance is templated on the instance flavor. Run the
12// suite over both Chonk instance flavors (MegaKernelFlavor and MegaAppFlavor).
13template <typename Flavor_> class HypernovaFoldingProverTests : public ::testing::Test {
14 protected:
16
17 public:
18 using Flavor = Flavor_;
24
25 static constexpr size_t LOG_NUM_GATES = 4;
26
37
41 static bool validate_accumulator(Accumulator& accumulator)
42 {
43 auto ck = CommitmentKey(accumulator.dyadic_size);
44
45 auto unshifted_polynomial = Polynomial(accumulator.non_shifted_polynomial);
46 auto shifted_polynomial = Polynomial(accumulator.shifted_polynomial);
47 unshifted_polynomial.increase_virtual_size(1 << static_cast<uint>(accumulator.challenge.size()));
48 shifted_polynomial.increase_virtual_size(1 << static_cast<uint>(accumulator.challenge.size()));
49 if (unshifted_polynomial.evaluate_mle(accumulator.challenge) != accumulator.non_shifted_evaluation) {
50 info("Mismatch between batched unshifted evaluation and evaluation of the batched unshifted polynomial.");
51 return false;
52 }
53 if (shifted_polynomial.evaluate_mle(accumulator.challenge, true) != accumulator.shifted_evaluation) {
54 info("Mismatch between batched shifted evaluation and evaluation of the batched shifted polynomial.");
55 return false;
56 }
57 if (ck.commit(accumulator.non_shifted_polynomial) != accumulator.non_shifted_commitment) {
58 info("Mismatch between the commitment to the batched unshifted polynomial and the batched unshifted "
59 "commitment.");
60 return false;
61 }
62 if (ck.commit(accumulator.shifted_polynomial) != accumulator.shifted_commitment) {
63 info("Mismatch between the commitment to the batched shifted polynomial and the batched shifted "
64 "commitment.");
65 return false;
66 }
67 return true;
68 }
69
74 static Accumulator fold_session(size_t num_instances,
75 std::optional<Accumulator> previous_accumulator = std::nullopt)
76 {
77 auto transcript = std::make_shared<Transcript>();
78 HypernovaFoldingProver prover(transcript);
79 for (size_t i = 0; i < num_instances; ++i) {
80 prover.template accumulate_instance<Flavor>(generate_new_instance(LOG_NUM_GATES + i));
81 }
82 auto [_proof, accumulator] = prover.finalize(std::move(previous_accumulator));
83 return std::move(accumulator);
84 }
85};
86
87using ProverTestFlavors = ::testing::Types<MegaKernelFlavor, MegaAppFlavor>;
89
90// A single instance with no previous accumulator: finalize returns the lone claim (no batching).
92{
93 auto accumulator = TestFixture::fold_session(/*num_instances=*/1);
94 EXPECT_TRUE(TestFixture::validate_accumulator(accumulator));
95}
96
97// Variable-width folding (no previous accumulator): every width yields a consistent accumulator.
99{
100 for (size_t num_instances = 2; num_instances <= CHONK_MAX_CLAIMS_PER_KERNEL; ++num_instances) {
101 auto accumulator = TestFixture::fold_session(num_instances);
102 EXPECT_TRUE(TestFixture::validate_accumulator(accumulator)) << "width " << num_instances;
103 }
104}
105
106// Folding starting from a (valid) previous accumulator yields a consistent accumulator.
107TYPED_TEST(HypernovaFoldingProverTests, FoldWithPreviousAccumulator)
108{
109 for (size_t num_instances = 2; num_instances < CHONK_MAX_CLAIMS_PER_KERNEL; ++num_instances) {
110 auto previous_accumulator = TestFixture::fold_session(/*num_instances=*/1);
111 auto accumulator = TestFixture::fold_session(num_instances, std::move(previous_accumulator));
112 EXPECT_TRUE(TestFixture::validate_accumulator(accumulator)) << "width " << num_instances;
113 }
114}
115
116// Folding starting from a tampered previous accumulator yields an inconsistent accumulator (the polynomial no longer
117// opens to the claimed evaluation/commitment). This is the "previous invalid accumulator" failure mode.
118TYPED_TEST(HypernovaFoldingProverTests, TamperPreviousAccumulator)
119{
120 auto previous_accumulator = TestFixture::fold_session(/*num_instances=*/1);
121 previous_accumulator.non_shifted_polynomial.at(0) = HypernovaFoldingProver::FF::random_element();
122 auto accumulator = TestFixture::fold_session(/*num_instances=*/2, std::move(previous_accumulator));
123 EXPECT_FALSE(TestFixture::validate_accumulator(accumulator));
124}
static Accumulator fold_session(size_t num_instances, std::optional< Accumulator > previous_accumulator=std::nullopt)
Run a folding session: accumulate num_instances fresh instances on a new transcript,...
static constexpr size_t LOG_NUM_GATES
static bool validate_accumulator(Accumulator &accumulator)
Check that an accumulator's claimed evaluations and commitments are consistent with its polynomials.
static std::shared_ptr< ProverInstance > generate_new_instance(size_t log_num_gates=LOG_NUM_GATES)
Common transcript class for both parties. Stores the data for the current round, as well as the manif...
CommitmentKey object over a pairing group 𝔾₁.
ECCVMCircuitBuilder CircuitBuilder
bb::CommitmentKey< Curve > CommitmentKey
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.
MegaFlavor::Transcript Transcript
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.
Contains all the information required by a Honk prover to create a proof, constructed from a finalize...
#define info(...)
Definition log.hpp:93
AluTraceBuilder builder
Definition alu.test.cpp:124
::testing::Types< MegaKernelFlavor, MegaAppFlavor > ProverTestFlavors
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
TYPED_TEST_SUITE(CommitmentKeyTest, Curves)
TYPED_TEST(CommitmentKeyTest, CommitToZeroPoly)
CommitmentKey< Curve > ck
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.
static field random_element(numeric::RNG *engine=nullptr) noexcept