3#include <gtest/gtest.h>
20using FlavorTypes = ::testing::Types<MegaFlavor, MegaZKFlavor>;
22template <
typename Flavor>
class MegaHonkTests :
public ::testing::Test {
44 Prover prover(prover_instance, verification_key);
47 bool verified = verifier.template verify_proof<DefaultIO>(proof).result;
66 Prover prover(prover_instance, verification_key);
69 bool verified = verifier.template verify_proof<DefaultIO>(proof).result;
82 auto merge_proof = merge_prover.construct_proof();
86 auto t_current = op_queue->construct_current_ultra_ops_subtable_columns();
87 auto T_prev = op_queue->construct_previous_ultra_ops_table_columns();
89 merge_commitments.
t_commitments[idx] = merge_prover.pcs_commitment_key.commit(t_current[idx]);
90 merge_commitments.
T_prev_commitments[idx] = merge_prover.pcs_commitment_key.commit(T_prev[idx]);
93 auto [verified, _] = merge_verifier.verify_proof(merge_proof, merge_commitments);
117 DefaultIO::add_default(
builder);
141 auto merge_proof = merge_prover.construct_proof();
143 EXPECT_EQ(merge_proof.size(), MERGE_PROOF_SIZE);
159 bool honk_verified = this->construct_and_verify_honk_proof(
builder);
160 EXPECT_TRUE(honk_verified);
174 GTEST_SKIP() <<
"Skipping 'BasicStructured' test for MegaZKFlavor.";
186 Prover prover(prover_instance, verification_key);
187 Verifier verifier(verification_key);
188 auto proof = prover.construct_proof();
191 EXPECT_TRUE(!prover_instance->polynomials.z_perm.is_zero());
195 bool result = verifier.template verify_proof<DefaultIO>(proof).result;
211 GTEST_SKIP() <<
"Skipping 'DynamicVirtualSizeIncrease' test for MegaZKFlavor.";
222 TraceSettings trace_settings{ SMALL_TEST_STRUCTURE_FOR_OVERFLOWS };
225 auto circuit_size = prover_instance->
dyadic_size();
227 auto doubled_circuit_size = 2 * circuit_size;
228 prover_instance_copy->polynomials.increase_polynomials_virtual_size(doubled_circuit_size);
233 Prover prover(prover_instance, verification_key);
236 Prover prover_copy(prover_instance_copy, verification_key_copy);
238 for (
auto [entry, entry_copy] :
zip_view(verification_key->get_all(), verification_key_copy->get_all())) {
239 EXPECT_EQ(entry, entry_copy);
242 Verifier verifier(verification_key);
243 auto proof = prover.construct_proof();
246 bool result = verifier.template verify_proof<DefaultIO>(proof).result;
249 Verifier verifier_copy(verification_key_copy);
250 auto proof_copy = prover_copy.construct_proof();
253 bool result_copy = verifier_copy.template verify_proof<DefaultIO>(proof_copy).result;
254 EXPECT_TRUE(result_copy);
272 bool honk_verified = this->construct_and_verify_honk_proof(
builder);
273 EXPECT_TRUE(honk_verified);
276 auto merge_verified = this->construct_and_verify_merge_proof(
builder.op_queue);
277 EXPECT_TRUE(merge_verified);
291 size_t NUM_CIRCUITS = 3;
292 for (
size_t i = 0; i < NUM_CIRCUITS; ++i) {
298 auto merge_verified = this->construct_and_verify_merge_proof(op_queue);
299 EXPECT_TRUE(merge_verified);
309 size_t NUM_CIRCUITS = 3;
310 for (
size_t i = 0; i < NUM_CIRCUITS; ++i) {
316 auto merge_verified = this->construct_and_verify_merge_proof(op_queue);
317 EXPECT_TRUE(merge_verified);
326 auto merge_verified = this->construct_and_verify_merge_proof(op_queue, MergeSettings::APPEND);
327 EXPECT_TRUE(merge_verified);
342 size_t NUM_CIRCUITS = 3;
343 for (
size_t i = 0; i < NUM_CIRCUITS; ++i) {
347 bool honk_verified = this->construct_and_verify_honk_proof(
builder);
348 EXPECT_TRUE(honk_verified);
366 size_t NUM_CIRCUITS = 3;
367 for (
size_t i = 0; i < NUM_CIRCUITS; ++i) {
373 bool honk_verified = this->construct_and_verify_honk_proof(
builder);
374 EXPECT_TRUE(honk_verified);
377 auto merge_verified = this->construct_and_verify_merge_proof(op_queue);
378 EXPECT_TRUE(merge_verified);
387 bool honk_verified = this->construct_and_verify_honk_proof(
builder);
388 EXPECT_TRUE(honk_verified);
391 auto merge_verified = this->construct_and_verify_merge_proof(op_queue, MergeSettings::APPEND);
392 EXPECT_TRUE(merge_verified);
412 bool verified = this->construct_and_verify_honk_proof_with_structured_trace(
builder, trace_settings);
413 EXPECT_TRUE(verified);
416 EXPECT_TRUE(
builder.blocks.has_overflow);
425 bool verified = this->construct_and_verify_honk_proof_with_structured_trace(
builder, trace_settings);
426 EXPECT_TRUE(verified);
429 EXPECT_TRUE(
builder.blocks.has_overflow);
438 bool verified = this->construct_and_verify_honk_proof_with_structured_trace(
builder, trace_settings);
439 EXPECT_TRUE(verified);
442 EXPECT_TRUE(
builder.blocks.has_overflow);
453 bool verified = this->construct_and_verify_honk_proof_with_structured_trace(
builder, trace_settings);
454 EXPECT_TRUE(verified);
457 EXPECT_TRUE(
builder.blocks.has_overflow);
474 GTEST_SKIP() <<
"Skipping 'PolySwap' test for MegaZKFlavor.";
478 TraceSettings trace_settings{ SMALL_TEST_STRUCTURE_FOR_OVERFLOWS };
490 for (
size_t i = 0; i < prover_instance_1->dyadic_size(); ++i) {
491 if (prover_instance_1->polynomials.q_arith[i] != 0) {
492 prover_instance_1->polynomials.w_l.at(i) += 1;
498 std::swap(prover_instance_1->polynomials, prover_instance_2->polynomials);
501 auto verification_key =
503 typename TestFixture::Prover prover(prover_instance_1, verification_key);
504 typename TestFixture::Verifier verifier(verification_key);
505 auto proof = prover.construct_proof();
506 bool result = verifier.template verify_proof<DefaultIO>(proof).result;
511 auto verification_key =
513 typename TestFixture::Prover prover(prover_instance_2, verification_key);
514 typename TestFixture::Verifier verifier(verification_key);
515 auto proof = prover.construct_proof();
516 bool result = verifier.template verify_proof<DefaultIO>(proof).result;
517 EXPECT_FALSE(result);
540 bool honk_verified = this->construct_and_verify_honk_proof(
builder);
541 EXPECT_TRUE(honk_verified);
551 bool honk_verified = this->construct_and_verify_honk_proof(
builder);
552 EXPECT_TRUE(honk_verified);
Curve::AffineElement Point
bool construct_and_verify_merge_proof(auto &op_queue, MergeSettings settings=MergeSettings::PREPEND)
Construct and verify a Goblin ECC op queue merge proof.
bool construct_and_verify_honk_proof_with_structured_trace(auto &builder, TraceSettings &trace_settings)
Construct and a verify a Honk proof using a specified structured trace.
typename Flavor::VerificationKey VerificationKey
static void SetUpTestSuite()
bool construct_and_verify_honk_proof(auto &builder)
Construct and a verify a Honk proof.
CommitmentKey object over a pairing group 𝔾₁.
Manages the data that is propagated on the public inputs of an application/function circuit.
static constexpr size_t PUBLIC_INPUTS_SIZE
static constexpr size_t PROOF_LENGTH_WITHOUT_PUB_INPUTS
static void construct_simple_circuit(MegaBuilder &builder)
Generate a simple test circuit with some ECC op gates and conventional arithmetic gates.
static void randomise_op_queue(MegaBuilder &builder, size_t num_ops)
Add some randomness into the op queue.
The verification key is responsible for storing the commitments to the precomputed (non-witness) poly...
static constexpr size_t NUM_WIRES
MegaCircuitBuilder CircuitBuilder
Prover class for the Goblin ECC op queue transcript merge protocol.
std::shared_ptr< ECCOpQueue > op_queue
Verifier class for the Goblin ECC op queue transcript merge protocol.
static void add_RAM_gates(Builder &builder)
Add some simple RAM (memory) gates for testing memory read/write functionality.
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 void check_all(const auto &polynomials, const auto ¶ms)
Check that the provided polynomials satisfy all relations for a given Flavor.
The VerifierInstance encapsulates all the necessary information for a Mega Honk Verifier to verify a ...
typename Group::affine_element AffineElement
Manages the data that is propagated on the public inputs of an application/function circuit.
RNG & get_debug_randomness(bool reset, std::uint_fast64_t seed)
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
TYPED_TEST_SUITE(ShpleminiTest, TestSettings)
MergeSettings
The MergeSettings define whether an current subtable will be added at the beginning (PREPEND) or at t...
TYPED_TEST(ShpleminiTest, CorrectnessOfMultivariateClaimBatching)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
size_t dyadic_size() const