3#include <gtest/gtest.h>
20using FlavorTypes = ::testing::Types<MegaFlavor, MegaZKFlavor>;
22template <
typename Flavor>
class MegaHonkTests :
public ::testing::Test {
45 Prover prover(prover_instance, verification_key);
79 EXPECT_EQ(mega_proof.size(),
97 bool honk_verified = this->construct_and_verify_honk_proof(
builder);
98 EXPECT_TRUE(honk_verified);
113 GTEST_SKIP() <<
"Skipping 'DynamicVirtualSizeIncrease' test for MegaZKFlavor.";
126 auto circuit_size = prover_instance->dyadic_size();
128 auto doubled_circuit_size = 2 * circuit_size;
129 prover_instance_copy->polynomials.increase_polynomials_virtual_size(doubled_circuit_size);
134 Prover prover(prover_instance, verification_key);
137 Prover prover_copy(prover_instance_copy, verification_key_copy);
139 for (
auto [entry, entry_copy] :
zip_view(verification_key->get_all(), verification_key_copy->get_all())) {
140 EXPECT_EQ(entry, entry_copy);
144 Verifier verifier(vk_and_hash);
145 auto proof = prover.construct_proof();
147 auto relation_failures =
149 EXPECT_TRUE(relation_failures.empty());
150 bool result = verifier.verify_proof(proof).result;
154 Verifier verifier_copy(vk_and_hash_copy);
155 auto proof_copy = prover_copy.construct_proof();
157 auto relation_failures_copy =
159 EXPECT_TRUE(relation_failures.empty());
160 bool result_copy = verifier_copy.verify_proof(proof_copy).result;
161 EXPECT_TRUE(result_copy);
177 GTEST_SKIP() <<
"Skipping 'PolySwap' test for MegaZKFlavor.";
191 for (
size_t i = 0; i < prover_instance_1->dyadic_size(); ++i) {
192 if (prover_instance_1->polynomials.q_arith[i] != 0) {
193 prover_instance_1->polynomials.w_l.at(i) += 1;
199 std::swap(prover_instance_1->polynomials, prover_instance_2->polynomials);
202 auto verification_key =
205 typename TestFixture::Prover prover(prover_instance_1, verification_key);
206 typename TestFixture::Verifier verifier(vk_and_hash);
207 auto proof = prover.construct_proof();
208 bool result = verifier.verify_proof(proof).result;
213 auto verification_key =
216 typename TestFixture::Prover prover(prover_instance_2, verification_key);
217 typename TestFixture::Verifier verifier(vk_and_hash);
218 auto proof = prover.construct_proof();
219 bool result = verifier.verify_proof(proof).result;
220 EXPECT_FALSE(result);
235 GTEST_SKIP() <<
"Masking area only exists for ZK flavors";
244 const size_t baseline_dyadic = baseline_instance->dyadic_size();
248 size_t prev_dyadic = 0;
249 bool found_jump =
false;
250 for (
size_t num_extra_gates = 0; num_extra_gates <= baseline_dyadic; num_extra_gates++) {
253 if (num_extra_gates > 0) {
258 const size_t dyadic_size = prover_instance->dyadic_size();
259 const size_t final_active_idx = prover_instance->get_final_active_wire_idx();
263 <<
"final_active_idx (" << final_active_idx <<
") is within the disabled head region";
265 if (prev_dyadic != 0 && dyadic_size > prev_dyadic) {
266 EXPECT_EQ(dyadic_size, 2 * prev_dyadic);
272 bool verified = this->construct_and_verify_honk_proof(tight_builder);
273 EXPECT_TRUE(verified);
279 prev_dyadic = dyadic_size;
282 EXPECT_TRUE(found_jump) <<
"should have found a dyadic size jump within " << baseline_dyadic <<
" extra gates";
295 GTEST_SKIP() <<
"Masking only applies to ZK flavors";
303 auto check_masked = [](
const auto& poly,
const std::string& label) {
304 bool has_masking =
false;
305 for (
size_t j = 0; j < NUM_MASKED_ROWS; j++) {
306 has_masking |= !poly[NUM_ZERO_ROWS + j].is_zero();
308 EXPECT_TRUE(has_masking) << label <<
" should be masked";
311 auto check_unmasked = [](
const auto& poly,
const std::string& label) {
312 for (
size_t j = 0; j < NUM_MASKED_ROWS; j++) {
313 EXPECT_TRUE(poly[NUM_ZERO_ROWS + j].is_zero()) << label <<
" should not be masked";
317 auto& polys = prover_instance->polynomials;
318 check_masked(polys.w_l,
"w_l");
319 check_masked(polys.w_r,
"w_r");
320 check_masked(polys.w_o,
"w_o");
321 check_masked(polys.w_4,
"w_4");
322 check_masked(polys.z_perm,
"z_perm");
323 check_masked(polys.lookup_read_counts,
"lookup_read_counts");
324 check_masked(polys.lookup_read_tags,
"lookup_read_tags");
325 check_masked(polys.lookup_inverses,
"lookup_inverses");
326 check_unmasked(polys.kernel_calldata,
"kernel_calldata");
327 check_masked(polys.kernel_calldata_read_counts,
"kernel_calldata_read_counts");
328 check_masked(polys.kernel_calldata_inverses,
"kernel_calldata_inverses");
329 check_masked(polys.first_app_calldata,
"first_app_calldata");
330 check_masked(polys.first_app_calldata_read_counts,
"first_app_calldata_read_counts");
331 check_masked(polys.first_app_calldata_inverses,
"first_app_calldata_inverses");
332 check_masked(polys.second_app_calldata,
"second_app_calldata");
333 check_masked(polys.second_app_calldata_read_counts,
"second_app_calldata_read_counts");
334 check_masked(polys.second_app_calldata_inverses,
"second_app_calldata_inverses");
335 check_masked(polys.third_app_calldata,
"third_app_calldata");
336 check_masked(polys.third_app_calldata_read_counts,
"third_app_calldata_read_counts");
337 check_masked(polys.third_app_calldata_inverses,
"third_app_calldata_inverses");
338 check_masked(polys.return_data,
"return_data");
339 check_masked(polys.return_data_read_counts,
"return_data_read_counts");
340 check_masked(polys.return_data_inverses,
"return_data_inverses");
362 auto unshifted = prover_instance->polynomials.get_unshifted();
363 auto to_be_shifted = prover_instance->polynomials.get_to_be_shifted();
366 ASSERT_EQ(to_be_shifted.size(), repeated.first.count);
369 std::vector<Commitment> commitments;
370 commitments.push_back(Commitment::one());
371 for (
auto& poly : unshifted) {
372 commitments.push_back(
ck.commit(poly));
374 for (
auto& poly : to_be_shifted) {
375 commitments.push_back(
ck.commit(poly));
380 for (
size_t i = 0; i < repeated.first.count; i++) {
381 EXPECT_EQ(commitments[repeated.first.original_start +
offset + i],
382 commitments[repeated.first.duplicate_start +
offset + i])
383 <<
"REPEATED_COMMITMENTS commitment mismatch at index " << i;
Curve::AffineElement Point
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 void add_default(Builder &builder)
Add default IO values to a circuit builder (for native tests)
static constexpr bool HasZK
ECCVMCircuitBuilder CircuitBuilder
typename G1::affine_element Commitment
bb::CommitmentKey< Curve > CommitmentKey
FixedVKAndHash_< PrecomputedEntities< Commitment >, BF, ECCVMHardcodedVKAndHash > VerificationKey
The verification key stores commitments to the precomputed polynomials used by the verifier.
static constexpr RepeatedCommitmentsData REPEATED_COMMITMENTS
static void construct_simple_circuit(MegaBuilder &builder)
Generate a simple test circuit with some ECC op gates and conventional arithmetic gates.
static void add_arithmetic_gates(Builder &builder, const size_t num_gates=4)
Add a specified number of arithmetic gates to the provided circuit.
Contains all the information required by a Honk prover to create a proof, constructed from a finalize...
static constexpr size_t TRACE_OFFSET
static AllSubrelationFailures check_all(const auto &polynomials, const auto ¶ms)
Check that the provided polynomials satisfy all relations for a given Flavor.
Output verify_proof(const Proof &proof)
Perform ultra verification.
The VerifierInstance encapsulates all the necessary information for a Honk Verifier to verify a proof...
typename Group::affine_element AffineElement
Manages the data that is propagated on the public inputs of an application/function circuit.
testing::Types< UltraFlavor, UltraKeccakFlavor, MegaFlavor > FlavorTypes
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(CommitmentKeyTest, Curves)
TYPED_TEST(CommitmentKeyTest, CommitToZeroPoly)
CommitmentKey< Curve > ck
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Full Honk proof layout (used by UltraVerifier).