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.
6#include "gtest/gtest.h"
7
8using namespace bb;
9
10// TODO(https://github.com/AztecProtocol/barretenberg/issues/1553): improve testing
11class HypernovaFoldingVerifierTests : public ::testing::Test {
12 protected:
14
15 public:
16 // Recursive verifier
20 using Builder = RecursiveFlavor::CircuitBuilder;
23
24 // Native verifier
27 using NativeFF = NativeFlavor::FF;
29 using NativeVerificationKey = NativeFlavor::VerificationKey;
32
33 // Prover
37
38 enum class TamperingMode : uint8_t {
39 None,
41 };
42
43 static std::shared_ptr<ProverInstance> generate_new_instance(size_t log_num_gates = 4)
44 {
46
50
52
53 return instance;
54 }
55
58 {
59 for (size_t idx = 0; auto [challenge_lhs, challenge_rhs] : zip_view(lhs.challenge, rhs.challenge)) {
60 if (challenge_lhs != challenge_rhs) {
61 info("Mismatch in the challenges at index ", idx);
62 return false;
63 }
64 }
66 info("Mismatch in the unshifted commitments");
67 return false;
68 }
70 info("Mismatch in the shifted commitments");
71 return false;
72 }
74 info("Mismatch in the unshifted evaluations");
75 return false;
76 }
78 info("Mismatch in the shifted evaluations");
79 return false;
80 }
81 return true;
82 }
83
84 static void tampering(std::shared_ptr<ProverInstance>& instance, const TamperingMode& mode)
85 {
86 switch (mode) {
88 break;
90 // Tamper with the instance by changing w_l. This should invalidate the first sumcheck
91 instance->polynomials.w_l.at(1) = NativeFF::random_element();
92 break;
93 }
94 };
95
96 static void test_folding(const TamperingMode& mode)
97 {
98 // Generate accumulator
99 auto instance = generate_new_instance();
100 auto transcript = std::make_shared<NativeTranscript>();
101
102 bb::HypernovaFoldingProver prover(transcript);
103 auto accumulator = prover.instance_to_accumulator(instance);
104
105 // Folding
106 auto incoming_instance = generate_new_instance(5);
107 tampering(incoming_instance, mode);
108 auto incoming_vk = std::make_shared<NativeVerificationKey>(incoming_instance->get_precomputed());
109 auto incoming_verifier_instance = std::make_shared<NativeVerifierInstance>(incoming_vk);
110
111 auto folding_transcript = std::make_shared<NativeTranscript>();
112 HypernovaFoldingProver folding_prover(folding_transcript);
113 auto [folding_proof, folded_accumulator] = folding_prover.fold(accumulator, incoming_instance);
114
115 // Natively verify the folding
116 auto native_verifier_transcript = std::make_shared<NativeTranscript>();
117 NativeHypernovaVerifier native_verifier(native_verifier_transcript);
118 auto [first_sumcheck_native, second_sumcheck_native, folded_verifier_accumulator_native] =
119 native_verifier.verify_folding_proof(incoming_verifier_instance, folding_proof);
120
121 // Recursively verify the folding
123
124 auto stdlib_incoming_instance =
125 std::make_shared<RecursiveVerifierInstance>(&builder, incoming_verifier_instance);
126 auto recursive_verifier_transcript = std::make_shared<RecursiveTranscript>();
127 RecursiveHypernovaVerifier recursive_verifier(recursive_verifier_transcript);
128 RecursiveProof proof(builder, folding_proof);
129 auto [first_sumcheck_recursive, second_sumcheck_recursive, folded_verifier_accumulator] =
130 recursive_verifier.verify_folding_proof(stdlib_incoming_instance, proof);
131
132 // If the instance has been tampered with, then the first sumcheck should fail (hence the circuit is not
133 // satisfied), but the second should pass
135 EXPECT_EQ(first_sumcheck_recursive, mode == TamperingMode::None);
136 EXPECT_EQ(first_sumcheck_recursive, first_sumcheck_native);
137 EXPECT_TRUE(second_sumcheck_recursive);
138 EXPECT_EQ(second_sumcheck_recursive, second_sumcheck_native);
139 EXPECT_TRUE(compare_prover_verifier_accumulators(folded_accumulator, folded_verifier_accumulator.get_value()));
140 }
141};
142
144{
145 test_folding(TamperingMode::None);
146}
147
149{
151 test_folding(TamperingMode::Instance);
152}
#define BB_DISABLE_ASSERTS()
Definition assert.hpp:32
NativeFlavor::VerificationKey NativeVerificationKey
static void tampering(std::shared_ptr< ProverInstance > &instance, const TamperingMode &mode)
static std::shared_ptr< ProverInstance > generate_new_instance(size_t log_num_gates=4)
RecursiveHypernovaVerifier::Flavor RecursiveFlavor
RecursiveHypernovaVerifier::VerifierInstance RecursiveVerifierInstance
static void test_folding(const TamperingMode &mode)
NativeHypernovaVerifier::VerifierInstance NativeVerifierInstance
NativeHypernovaVerifier::Flavor NativeFlavor
RecursiveFlavor::CircuitBuilder Builder
static bool compare_prover_verifier_accumulators(const NativeProverAccumulator &lhs, const NativeVerifierAccumulator &rhs)
RecursiveHypernovaVerifier::Proof RecursiveProof
Common transcript class for both parties. Stores the data for the current round, as well as the manif...
MultilinearBatchingProverClaim Accumulator
std::pair< HonkProof, Accumulator > fold(const Accumulator &accumulator, const std::shared_ptr< ProverInstance > &instance)
Fold an instance into an accumulator. Folding happens in place.
ProverInstance_< Flavor > ProverInstance
Accumulator instance_to_accumulator(const std::shared_ptr< ProverInstance > &instance)
Turn an instance into an accumulator by running Sumcheck.
std::tuple< bool, bool, Accumulator > verify_folding_proof(const std::shared_ptr< typename HypernovaFoldingVerifier::VerifierInstance > &instance, const Proof &proof)
Verify folding proof. Return the new accumulator and the results of the two sumchecks.
std::conditional_t< IsRecursiveFlavor< Flavor >, typename HypernovaRecursiveTypes::Proof, typename HypernovaNativeTypes::Proof > Proof
std::conditional_t< IsRecursiveFlavor< Flavor >, typename HypernovaRecursiveTypes::VerifierInstance, typename HypernovaNativeTypes::VerifierInstance > VerifierInstance
MultilinearBatchingVerifierClaim< Curve > Accumulator
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.
A ProverInstance is normally constructed from a finalized circuit and it contains all the information...
static bool check(const Builder &circuit)
Check the witness satisifies the circuit.
void info(Args... args)
Definition log.hpp:74
AluTraceBuilder builder
Definition alu.test.cpp:123
std::filesystem::path bb_crs_path()
void init_file_crs_factory(const std::filesystem::path &path)
Entry point for Barretenberg command-line interface.
TEST_F(IPATest, ChallengesAreZero)
Definition ipa.test.cpp:188
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13