11#include "gtest/gtest.h"
66 constexpr size_t frs_per_G = FrCodec::calc_num_fields<curve::BN254::AffineElement>();
75 for (
size_t i = 1; i <= NUM_GEMINI_FOLDS; ++i) {
81 for (
size_t i = 1; i <= NUM_GEMINI_EVALS; ++i) {
87 manifest.
add_entry(LAST_FOLDING_ROUND + 3,
"Shplonk:Q", frs_per_G);
91 manifest.
add_entry(LAST_FOLDING_ROUND + 4,
"KZG:W", frs_per_G);
115 FF::from_witness(
builder, native_instance->get_vk()->hash()));
118 recursive_instance->alpha = FF::from_witness(
builder, native_instance->alpha);
119 auto native_comms = native_instance->witness_commitments.get_all();
120 for (
auto [native_comm, recursive_comm] :
121 zip_view(native_comms, recursive_instance->witness_commitments.get_all())) {
122 recursive_comm = Commitment::from_witness(
builder, native_comm);
124 recursive_instance->gate_challenges = std::vector<FF>(native_instance->gate_challenges.size());
125 for (
auto [native_challenge, recursive_challenge] :
126 zip_view(native_instance->gate_challenges, recursive_instance->gate_challenges)) {
127 recursive_challenge = FF::from_witness(
builder, native_challenge);
129 recursive_instance->relation_parameters.eta =
130 FF::from_witness(
builder, native_instance->relation_parameters.eta);
131 recursive_instance->relation_parameters.eta_two =
132 FF::from_witness(
builder, native_instance->relation_parameters.eta_two);
133 recursive_instance->relation_parameters.eta_three =
134 FF::from_witness(
builder, native_instance->relation_parameters.eta_three);
135 recursive_instance->relation_parameters.beta =
136 FF::from_witness(
builder, native_instance->relation_parameters.beta);
137 recursive_instance->relation_parameters.gamma =
138 FF::from_witness(
builder, native_instance->relation_parameters.gamma);
139 recursive_instance->relation_parameters.public_input_delta =
140 FF::from_witness(
builder, native_instance->relation_parameters.public_input_delta);
142 recursive_instance->gemini_masking_commitment =
143 Commitment::from_witness(
builder, native_instance->gemini_masking_commitment);
145 return recursive_instance;
156 auto [_proof, accumulator] = prover.
finalize();
174 auto [batch_proof, prover_accumulator] = prover.
finalize(previous_prover_accumulator);
182 auto decider_proof = decider_prover.
construct_proof(prover_accumulator);
185 auto incoming_native_verifier_instance =
190 auto [native_folded, native_accumulator] = native_verifier.
finalize(batch_proof, previous_native_accumulator);
195 native_transcript->enable_manifest();
198 bool native_decider_verified = native_decider_verifier.
verify_proof(native_accumulator, decider_proof).check();
202 auto incoming_recursive_instance =
204 auto previous_recursive_accumulator =
211 auto [recursive_folded, recursive_accumulator] =
212 recursive_verifier.
finalize(stdlib_batch_proof, previous_recursive_accumulator);
215 bool recursive_decider_verified =
216 recursive_decider_verifier.
verify_proof(recursive_accumulator, stdlib_decider_proof).check();
220 EXPECT_TRUE(native_folded);
221 EXPECT_TRUE(recursive_folded);
224 EXPECT_EQ(native_decider_verified, !tampered);
225 EXPECT_EQ(recursive_decider_verified, native_decider_verified);
229 auto verifier_manifest = native_transcript->get_manifest();
230 EXPECT_EQ(verifier_manifest, expected_manifest);
237 test_decider(TamperingMode::None);
242 test_decider(TamperingMode::FoldedAccumulator);
static std::shared_ptr< RecursiveVerifierInstance > create_recursive_verifier_instance(Builder *builder, const std::shared_ptr< NativeVerifierInstance > &native_instance)
static void SetUpTestSuite()
static ProverAccumulator make_previous_accumulator()
Build a valid previous accumulator (a single-instance fold) on a separate, discarded transcript.
static std::shared_ptr< ProverInstance > generate_new_instance(size_t log_num_gates=LOG_NUM_GATES)
RecursiveVerifier::Transcript RecursiveTranscript
static void test_decider(TamperingMode mode)
NativeVerifier::Transcript NativeTranscript
static constexpr size_t LOG_NUM_GATES
static TranscriptManifest build_expected_decider_manifest()
Build the expected transcript manifest for the HyperNova decider.
HyperNova decider prover. Produces final opening proof for the accumulated claim.
HonkProof construct_proof(Accumulator &accumulator)
HyperNova decider verifier (native + recursive). Verifies final opening proof.
PairingPoints verify_proof(Accumulator &accumulator, const Proof &proof)
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.
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 kernel circuits.
static constexpr bool HasZK
static constexpr size_t VIRTUAL_LOG_N
NativeVerificationKey_< PrecomputedEntities< Commitment >, Codec, HashFunction, CommitmentKey > VerificationKey
Recursive counterpart to MegaKernelFlavor.
MegaCircuitBuilder CircuitBuilder
VKAndHash_< FF, VerificationKey > VKAndHash
StdlibVerificationKey_< CircuitBuilder, NativeFlavor::PrecomputedEntities< Commitment >, NativeFlavor::VerificationKey > VerificationKey
typename Curve::ScalarField FF
typename Curve::Element Commitment
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.
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.
std::filesystem::path bb_crs_path()
void init_file_crs_factory(const std::filesystem::path &path)
Entry point for Barretenberg command-line interface.
std::vector< fr > HonkProof
TEST_F(IPATest, ChallengesAreZero)
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
std::string to_string(bb::avm2::ValueTag tag)
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