8#include "gtest/gtest.h"
22 using Builder = RecursiveFlavor::CircuitBuilder;
64 constexpr size_t frs_per_G = FrCodec::calc_num_fields<curve::BN254::AffineElement>();
65 constexpr size_t NUM_GEMINI_FOLDS = NativeFlavor::VIRTUAL_LOG_N - 1;
66 constexpr size_t NUM_GEMINI_EVALS = NativeFlavor::VIRTUAL_LOG_N;
67 constexpr size_t FOLDING_ROUNDS = 50;
73 for (
size_t i = 1; i <= NUM_GEMINI_FOLDS; ++i) {
79 for (
size_t i = 1; i <= NUM_GEMINI_EVALS; ++i) {
85 manifest.
add_entry(FOLDING_ROUNDS + 3,
"Shplonk:Q", frs_per_G);
89 manifest.
add_entry(FOLDING_ROUNDS + 4,
"KZG:W", frs_per_G);
90 manifest.
add_challenge(FOLDING_ROUNDS + 4,
"KZG:masking_challenge");
112 if (challenge_lhs != challenge_rhs) {
113 info(
"Mismatch in the challenges at index ", idx);
118 info(
"Mismatch in the unshifted commitments");
122 info(
"Mismatch in the shifted commitments");
126 info(
"Mismatch in the unshifted evaluations");
130 info(
"Mismatch in the shifted evaluations");
143 using FF = RecursiveFlavor::FF;
144 using Commitment = RecursiveFlavor::Commitment;
146 using VKAndHash = RecursiveFlavor::VKAndHash;
151 FF::from_witness(
builder, native_instance->get_vk()->hash()));
157 recursive_instance->alpha = FF::from_witness(
builder, native_instance->alpha);
160 auto native_comms = native_instance->witness_commitments.get_all();
161 for (
auto [native_comm, recursive_comm] :
162 zip_view(native_comms, recursive_instance->witness_commitments.get_all())) {
163 recursive_comm = Commitment::from_witness(
builder, native_comm);
167 recursive_instance->gate_challenges = std::vector<FF>(native_instance->gate_challenges.size());
168 for (
auto [native_challenge, recursive_challenge] :
169 zip_view(native_instance->gate_challenges, recursive_instance->gate_challenges)) {
170 recursive_challenge = FF::from_witness(
builder, native_challenge);
174 recursive_instance->relation_parameters.eta =
175 FF::from_witness(
builder, native_instance->relation_parameters.eta);
176 recursive_instance->relation_parameters.eta_two =
177 FF::from_witness(
builder, native_instance->relation_parameters.eta_two);
178 recursive_instance->relation_parameters.eta_three =
179 FF::from_witness(
builder, native_instance->relation_parameters.eta_three);
180 recursive_instance->relation_parameters.beta =
181 FF::from_witness(
builder, native_instance->relation_parameters.beta);
182 recursive_instance->relation_parameters.gamma =
183 FF::from_witness(
builder, native_instance->relation_parameters.gamma);
184 recursive_instance->relation_parameters.public_input_delta =
185 FF::from_witness(
builder, native_instance->relation_parameters.public_input_delta);
188 if constexpr (NativeFlavor::HasZK) {
189 recursive_instance->gemini_masking_commitment =
190 Commitment::from_witness(
builder, native_instance->gemini_masking_commitment);
193 return recursive_instance;
205 accumulator.
challenge[0] = NativeFF::random_element();
225 instance->polynomials.w_l.at(1) = NativeFF::random_element();
245 auto incoming_verifier_instance =
250 auto [folding_proof, folded_accumulator] = folding_prover.
fold(accumulator, incoming_instance);
261 auto [first_sumcheck_native, second_sumcheck_native, folded_verifier_accumulator_native] =
265 native_transcript->enable_manifest();
269 auto native_pairing_points = decider_verifier.
verify_proof(folded_verifier_accumulator_native, decider_proof);
270 bool native_verified = native_pairing_points.check();
279 auto [first_sumcheck_recursive, second_sumcheck_recursive, folded_verifier_accumulator] =
285 auto recursive_pairing_points =
286 recursive_decider_verifier.
verify_proof(folded_verifier_accumulator, stdlib_proof);
289 auto P0 = recursive_pairing_points.P0.get_value();
290 auto P1 = recursive_pairing_points.P1.get_value();
292 auto recursive_verified = pp.check();
300 EXPECT_EQ(recursive_verified, native_verified);
303 EXPECT_EQ(first_sumcheck_recursive, first_sumcheck_native);
306 EXPECT_EQ(second_sumcheck_recursive, second_sumcheck_native);
311 auto verifier_manifest = native_transcript->get_manifest();
312 EXPECT_EQ(verifier_manifest, expected_manifest);
319 test_decider(TamperingMode::None);
325 test_decider(TamperingMode::Accumulator);
331 test_decider(TamperingMode::Instance);
336 test_decider(TamperingMode::FoldedAccumulator);
#define BB_DISABLE_ASSERTS()
std::shared_ptr< Napi::ThreadSafeFunction > instance
NativeHypernovaDeciderVerifier::Flavor NativeFlavor
static std::shared_ptr< RecursiveVerifierInstance > create_recursive_verifier_instance(Builder *builder, const std::shared_ptr< NativeVerifierInstance > &native_instance)
Test helper to create a recursive verifier instance from a native one.
static std::shared_ptr< ProverInstance > generate_new_instance(size_t log_num_gates=4)
static void SetUpTestSuite()
RecursiveHypernovaDeciderVerifier::Proof RecursiveProof
NativeFlavor::VerificationKey NativeVerificationKey
NativeHypernovaVerifier::VerifierInstance NativeVerifierInstance
static void tamper_with_accumulator(NativeProverAccumulator &accumulator, const TamperingMode &mode)
RecursiveHypernovaVerifier::VerifierInstance RecursiveVerifierInstance
RecursiveFlavor::CircuitBuilder Builder
static bool compare_prover_verifier_accumulators(const NativeProverAccumulator &lhs, const NativeVerifierAccumulator &rhs)
NativeFlavor::FF NativeFF
NativeFlavor::CommitmentKey CommitmentKey
static void test_decider(const TamperingMode &mode)
RecursiveHypernovaDeciderVerifier::Flavor RecursiveFlavor
static TranscriptManifest build_expected_decider_manifest()
Build the expected transcript manifest for HyperNova decider.
static void tamper_with_instance(std::shared_ptr< ProverInstance > &instance, const TamperingMode &mode)
Common transcript class for both parties. Stores the data for the current round, as well as the manif...
HyperNova decider prover. Produces final opening proof for the accumulated claim.
HonkProof construct_proof(const CommitmentKey &ck, Accumulator &accumulator)
HyperNova decider verifier (native + recursive). Verifies final opening proof.
HypernovaFoldingVerifier< Flavor >::Accumulator Accumulator
PairingPoints verify_proof(Accumulator &accumulator, const Proof &proof)
std::conditional_t< IsRecursiveFlavor< Flavor >, typename HypernovaRecursiveTypes::Proof, typename HypernovaNativeTypes::Proof > Proof
Flavor::Transcript Transcript
std::conditional_t< IsRecursiveFlavor< Flavor >, typename HypernovaRecursiveTypes::PairingPoints, typename HypernovaNativeTypes::PairingPoints > PairingPoints
HyperNova folding prover. Folds circuit instances into accumulators, deferring PCS verification.
MultilinearBatchingProverClaim Accumulator
ProverInstance_< Flavor > ProverInstance
std::pair< HonkProof, Accumulator > fold(const Accumulator &accumulator, const std::shared_ptr< ProverInstance > &instance, const std::shared_ptr< VerificationKey > &honk_vk=nullptr)
Fold an instance into an accumulator. Folding happens in place.
Accumulator instance_to_accumulator(const std::shared_ptr< ProverInstance > &instance, const std::shared_ptr< VerificationKey > &honk_vk=nullptr)
Turn an instance into an accumulator by running Sumcheck.
HyperNova folding verifier (native + recursive). Verifies folding proofs and maintains accumulators.
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::VerifierInstance, typename HypernovaNativeTypes::VerifierInstance > VerifierInstance
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.
Base Native verification key class.
A ProverInstance is normally constructed from a finalized circuit and it contains all the information...
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.
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)
CommitmentKey< Curve > ck
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
std::string to_string(bb::avm2::ValueTag tag)
FF non_shifted_evaluation
std::vector< FF > challenge
Commitment shifted_commitment
Commitment non_shifted_commitment
Commitment non_shifted_commitment
Commitment shifted_commitment
std::vector< FF > challenge
FF non_shifted_evaluation