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;
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& polys = prover_instance->polynomials;
312 check_masked(polys.w_l(),
"w_l");
313 check_masked(polys.w_r(),
"w_r");
314 check_masked(polys.w_o(),
"w_o");
315 check_masked(polys.w_4(),
"w_4");
316 check_masked(polys.z_perm(),
"z_perm");
317 if constexpr (Flavor::HasLogDerivLookup) {
318 check_masked(polys.lookup_read_counts(),
"lookup_read_counts");
319 check_masked(polys.lookup_read_tags(),
"lookup_read_tags");
320 check_masked(polys.lookup_inverses(),
"lookup_inverses");
322 if constexpr (Flavor::HasDataBus) {
323 check_masked(polys.kernel_calldata_read_counts(),
"kernel_calldata_read_counts");
324 check_masked(polys.kernel_calldata_inverses(),
"kernel_calldata_inverses");
325 if constexpr (Flavor::NUM_BUS_COLUMNS >= 2) {
326 check_masked(polys.first_app_calldata(),
"first_app_calldata");
327 check_masked(polys.first_app_calldata_read_counts(),
"first_app_calldata_read_counts");
328 check_masked(polys.first_app_calldata_inverses(),
"first_app_calldata_inverses");
329 check_masked(polys.second_app_calldata(),
"second_app_calldata");
330 check_masked(polys.second_app_calldata_read_counts(),
"second_app_calldata_read_counts");
331 check_masked(polys.second_app_calldata_inverses(),
"second_app_calldata_inverses");
332 check_masked(polys.third_app_calldata(),
"third_app_calldata");
333 check_masked(polys.third_app_calldata_read_counts(),
"third_app_calldata_read_counts");
334 check_masked(polys.third_app_calldata_inverses(),
"third_app_calldata_inverses");
335 check_masked(polys.fourth_app_calldata(),
"fourth_app_calldata");
336 check_masked(polys.fourth_app_calldata_read_counts(),
"fourth_app_calldata_read_counts");
337 check_masked(polys.fourth_app_calldata_inverses(),
"fourth_app_calldata_inverses");
338 check_masked(polys.fifth_app_calldata(),
"fifth_app_calldata");
339 check_masked(polys.fifth_app_calldata_read_counts(),
"fifth_app_calldata_read_counts");
340 check_masked(polys.fifth_app_calldata_inverses(),
"fifth_app_calldata_inverses");
341 check_masked(polys.return_data(),
"return_data");
342 check_masked(polys.return_data_read_counts(),
"return_data_read_counts");
343 check_masked(polys.return_data_inverses(),
"return_data_inverses");
367 auto unshifted = prover_instance->polynomials.get_unshifted();
368 auto to_be_shifted = prover_instance->polynomials.get_to_be_shifted();
370 constexpr auto repeated = Flavor::REPEATED_COMMITMENTS;
371 ASSERT_EQ(to_be_shifted.size(), repeated.first.count);
374 std::vector<Commitment> commitments;
375 commitments.push_back(Commitment::one());
376 for (
auto& poly : unshifted) {
377 commitments.push_back(
ck.commit(poly));
379 for (
auto& poly : to_be_shifted) {
380 commitments.push_back(
ck.commit(poly));
385 constexpr size_t offset = flavor_has_gemini_masking<Flavor>() ? 2 : 1;
386 for (
size_t i = 0; i < repeated.first.count; i++) {
387 EXPECT_EQ(commitments[repeated.first.original_start +
offset + i],
388 commitments[repeated.first.duplicate_start +
offset + i])
389 <<
"REPEATED_COMMITMENTS commitment mismatch at index " << i;
405 GTEST_SKIP() <<
"Offset-boundary relation applies only to MegaZKFlavor.";
410 auto prove_and_verify = [](
bool tamper) {
416 prover_instance->polynomials.ecc_op_wire_1().at(2) =
FF(42);
418 auto verification_key =
422 typename TestFixture::Prover prover(prover_instance, verification_key);
423 typename TestFixture::Verifier verifier(vk_and_hash);
424 auto proof = prover.construct_proof();
425 return verifier.verify_proof(proof).result;
429 ASSERT_TRUE(prove_and_verify(
false));
432 EXPECT_FALSE(prove_and_verify(
true));