3#include <gtest/gtest.h>
20using FlavorTypes = ::testing::Types<MegaFlavor, MegaZKFlavor>;
22template <
typename Flavor>
class MegaHonkTests :
public ::testing::Test {
44 Prover prover(proving_key, verification_key);
47 bool verified = verifier.template verify_proof<DefaultIO>(proof).result;
66 Prover prover(proving_key, 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);
176 GTEST_SKIP() <<
"Skipping 'BasicStructured' test for MegaZKFlavor.";
188 Prover prover(proving_key, verification_key);
189 Verifier verifier(verification_key);
190 auto proof = prover.construct_proof();
193 EXPECT_TRUE(!proving_key->polynomials.z_perm.is_zero());
197 bool result = verifier.template verify_proof<DefaultIO>(proof).result;
215 GTEST_SKIP() <<
"Skipping 'DynamicVirtualSizeIncrease' test for MegaZKFlavor.";
226 TraceSettings trace_settings{ SMALL_TEST_STRUCTURE_FOR_OVERFLOWS };
231 auto doubled_circuit_size = 2 * circuit_size;
232 proving_key_copy->polynomials.increase_polynomials_virtual_size(doubled_circuit_size);
237 Prover prover(proving_key, verification_key);
240 Prover prover_copy(proving_key_copy, verification_key_copy);
242 for (
auto [entry, entry_copy] :
zip_view(verification_key->get_all(), verification_key_copy->get_all())) {
243 EXPECT_EQ(entry, entry_copy);
246 Verifier verifier(verification_key);
247 auto proof = prover.construct_proof();
250 bool result = verifier.template verify_proof<DefaultIO>(proof).result;
253 Verifier verifier_copy(verification_key_copy);
254 auto proof_copy = prover_copy.construct_proof();
257 bool result_copy = verifier_copy.template verify_proof<DefaultIO>(proof_copy).result;
258 EXPECT_TRUE(result_copy);
276 bool honk_verified = this->construct_and_verify_honk_proof(
builder);
277 EXPECT_TRUE(honk_verified);
280 auto merge_verified = this->construct_and_verify_merge_proof(
builder.op_queue);
281 EXPECT_TRUE(merge_verified);
295 size_t NUM_CIRCUITS = 3;
296 for (
size_t i = 0; i < NUM_CIRCUITS; ++i) {
302 auto merge_verified = this->construct_and_verify_merge_proof(op_queue);
303 EXPECT_TRUE(merge_verified);
313 size_t NUM_CIRCUITS = 3;
314 for (
size_t i = 0; i < NUM_CIRCUITS; ++i) {
320 auto merge_verified = this->construct_and_verify_merge_proof(op_queue);
321 EXPECT_TRUE(merge_verified);
330 auto merge_verified = this->construct_and_verify_merge_proof(op_queue, MergeSettings::APPEND);
331 EXPECT_TRUE(merge_verified);
346 size_t NUM_CIRCUITS = 3;
347 for (
size_t i = 0; i < NUM_CIRCUITS; ++i) {
351 bool honk_verified = this->construct_and_verify_honk_proof(
builder);
352 EXPECT_TRUE(honk_verified);
370 size_t NUM_CIRCUITS = 3;
371 for (
size_t i = 0; i < NUM_CIRCUITS; ++i) {
377 bool honk_verified = this->construct_and_verify_honk_proof(
builder);
378 EXPECT_TRUE(honk_verified);
381 auto merge_verified = this->construct_and_verify_merge_proof(op_queue);
382 EXPECT_TRUE(merge_verified);
391 bool honk_verified = this->construct_and_verify_honk_proof(
builder);
392 EXPECT_TRUE(honk_verified);
395 auto merge_verified = this->construct_and_verify_merge_proof(op_queue, MergeSettings::APPEND);
396 EXPECT_TRUE(merge_verified);
416 bool verified = this->construct_and_verify_honk_proof_with_structured_trace(
builder, trace_settings);
417 EXPECT_TRUE(verified);
420 EXPECT_TRUE(
builder.blocks.has_overflow);
429 bool verified = this->construct_and_verify_honk_proof_with_structured_trace(
builder, trace_settings);
430 EXPECT_TRUE(verified);
433 EXPECT_TRUE(
builder.blocks.has_overflow);
442 bool verified = this->construct_and_verify_honk_proof_with_structured_trace(
builder, trace_settings);
443 EXPECT_TRUE(verified);
446 EXPECT_TRUE(
builder.blocks.has_overflow);
457 bool verified = this->construct_and_verify_honk_proof_with_structured_trace(
builder, trace_settings);
458 EXPECT_TRUE(verified);
461 EXPECT_TRUE(
builder.blocks.has_overflow);
480 GTEST_SKIP() <<
"Skipping 'PolySwap' test for MegaZKFlavor.";
484 TraceSettings trace_settings{ SMALL_TEST_STRUCTURE_FOR_OVERFLOWS };
496 for (
size_t i = 0; i < proving_key_1->dyadic_size(); ++i) {
497 if (proving_key_1->polynomials.q_arith[i] != 0) {
498 proving_key_1->polynomials.w_l.at(i) += 1;
504 std::swap(proving_key_1->polynomials, proving_key_2->polynomials);
507 auto verification_key =
509 typename TestFixture::Prover prover(proving_key_1, verification_key);
510 typename TestFixture::Verifier verifier(verification_key);
511 auto proof = prover.construct_proof();
512 bool result = verifier.template verify_proof<DefaultIO>(proof).result;
517 auto verification_key =
519 typename TestFixture::Prover prover(proving_key_2, verification_key);
520 typename TestFixture::Verifier verifier(verification_key);
521 auto proof = prover.construct_proof();
522 bool result = verifier.template verify_proof<DefaultIO>(proof).result;
523 EXPECT_FALSE(result);
546 bool honk_verified = this->construct_and_verify_honk_proof(
builder);
547 EXPECT_TRUE(honk_verified);
557 bool honk_verified = this->construct_and_verify_honk_proof(
builder);
558 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 𝔾₁.
A DeciderProvingKey is normally constructed from a finalized circuit and it contains all the informat...
The DeciderVerificationKey encapsulates all the necessary information for a Mega Honk Verifier to ver...
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, bool last_circuit=false)
Generate a simple test circuit with some ECC op gates and conventional arithmetic gates.
static void randomise_op_queue(MegaBuilder &builder)
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.
static void check_all(const auto &polynomials, const auto ¶ms)
Check that the provided polynomials satisfy all relations for a given Flavor.
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