61 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(circuit_builder);
65 typename TestFixture::Prover prover(prover_instance, verification_key);
66 auto proof = prover.construct_proof();
67 auto& polynomials = prover_instance->polynomials;
70 bool has_non_zero_coefficient =
false;
71 for (
auto& coeff : polynomial.coeffs()) {
72 has_non_zero_coefficient |= !coeff.is_zero();
74 ASSERT_TRUE(has_non_zero_coefficient);
77 for (
auto& poly : polynomials.get_selectors()) {
81 for (
auto& poly : polynomials.get_tables()) {
85 for (
auto& poly : polynomials.get_wires()) {
110 for (
size_t i = 0; i < 16; ++i) {
111 for (
size_t j = 0; j < 16; ++j) {
112 uint64_t left =
static_cast<uint64_t
>(j);
113 uint64_t right =
static_cast<uint64_t
>(i);
114 uint32_t left_idx = circuit_builder.add_variable(
fr(left));
115 uint32_t right_idx = circuit_builder.add_variable(
fr(right));
116 uint32_t result_idx = circuit_builder.add_variable(
fr(left ^ right));
119 circuit_builder.add_variable(
fr(left) +
fr(right) + circuit_builder.get_variable(result_idx));
120 circuit_builder.create_big_add_gate(
121 { left_idx, right_idx, result_idx, add_idx,
fr(1),
fr(1),
fr(1),
fr(-1),
fr(0) });
124 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(circuit_builder);
126 TestFixture::prove_and_verify(circuit_builder,
true);
135 affine_element p1 = affine_element::random_element();
136 affine_element p2 = affine_element::random_element();
138 affine_element p3(element(p1) + element(p2));
140 uint32_t x1 = circuit_builder.add_variable(p1.x);
141 uint32_t y1 = circuit_builder.add_variable(p1.y);
142 uint32_t x2 = circuit_builder.add_variable(p2.x);
143 uint32_t y2 = circuit_builder.add_variable(p2.y);
144 uint32_t x3 = circuit_builder.add_variable(p3.x);
145 uint32_t y3 = circuit_builder.add_variable(p3.y);
147 circuit_builder.create_ecc_add_gate({ x1, y1, x2, y2, x3, y3,
true });
149 p3 = affine_element(element(p1) + element(p2));
150 x3 = circuit_builder.add_variable(p3.x);
151 y3 = circuit_builder.add_variable(p3.y);
152 circuit_builder.create_ecc_add_gate({ x1, y1, x2, y2, x3, y3,
true });
154 p3 = affine_element(element(p1) - element(p2));
155 x3 = circuit_builder.add_variable(p3.x);
156 y3 = circuit_builder.add_variable(p3.y);
157 circuit_builder.create_ecc_add_gate({ x1, y1, x2, y2, x3, y3,
false });
159 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(circuit_builder);
161 TestFixture::prove_and_verify(circuit_builder,
true);
183 const auto split_into_limbs = [&](
const uint512_t& input) {
184 constexpr size_t NUM_BITS = 68;
186 limbs[0] = input.slice(0, NUM_BITS).lo;
187 limbs[1] = input.slice(NUM_BITS * 1, NUM_BITS * 2).lo;
188 limbs[2] = input.slice(NUM_BITS * 2, NUM_BITS * 3).lo;
189 limbs[3] = input.slice(NUM_BITS * 3, NUM_BITS * 4).lo;
194 std::array<uint32_t, 4> limb_indices;
195 limb_indices[0] = circuit_builder.add_variable(limbs[0]);
196 limb_indices[1] = circuit_builder.add_variable(limbs[1]);
197 limb_indices[2] = circuit_builder.add_variable(limbs[2]);
198 limb_indices[3] = circuit_builder.add_variable(limbs[3]);
202 auto modulus_limbs = split_into_limbs(BINARY_BASIS_MODULUS -
uint512_t(modulus));
204 const auto a_indices = get_limb_witness_indices(split_into_limbs(
uint256_t(
a)));
205 const auto b_indices = get_limb_witness_indices(split_into_limbs(
uint256_t(
b)));
206 const auto q_indices = get_limb_witness_indices(split_into_limbs(
uint256_t(q)));
207 const auto r_indices = get_limb_witness_indices(split_into_limbs(
uint256_t(r)));
210 a_indices, b_indices, q_indices, r_indices, modulus_limbs,
212 const auto [lo_1_idx, hi_1_idx] = circuit_builder.evaluate_non_native_field_multiplication(
inputs);
215 const bool is_low_70_bits =
uint256_t(circuit_builder.get_variable(lo_1_idx)).
get_msb() < 70;
216 const bool is_high_70_bits =
uint256_t(circuit_builder.get_variable(hi_1_idx)).
get_msb() < 70;
217 if (is_low_70_bits && is_high_70_bits) {
219 circuit_builder.range_constrain_two_limbs(lo_1_idx, hi_1_idx, 70, 70);
222 circuit_builder.create_limbed_range_constraint(lo_1_idx, 72);
223 circuit_builder.create_limbed_range_constraint(hi_1_idx, 72);
226 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(circuit_builder);
228 TestFixture::prove_and_verify(circuit_builder,
true);
235 uint32_t
a = circuit_builder.add_variable(
fr(100));
236 uint32_t
b = circuit_builder.add_variable(
fr(100));
237 uint32_t c = circuit_builder.add_variable(
fr(100));
238 uint32_t d = circuit_builder.add_variable(
fr(100));
240 circuit_builder.assert_equal(
a,
b);
241 circuit_builder.assert_equal(
a, c);
242 circuit_builder.assert_equal(
a, d);
244 circuit_builder.create_small_range_constraint(
a, 1000);
245 circuit_builder.create_small_range_constraint(
b, 1001);
246 circuit_builder.create_small_range_constraint(c, 999);
247 circuit_builder.create_small_range_constraint(d, 1000);
249 circuit_builder.create_big_add_gate(
263 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(circuit_builder);
265 TestFixture::prove_and_verify(circuit_builder,
true);
276 uint16_t mask = (1 << 8) - 1;
278 uint32_t a_idx = circuit_builder.add_variable(
fr(
a));
279 uint32_t b_idx = circuit_builder.add_variable(
fr(
a));
280 ASSERT_NE(a_idx, b_idx);
281 uint32_t c_idx = circuit_builder.add_variable(
fr(
a));
282 ASSERT_NE(c_idx, b_idx);
283 circuit_builder.create_dyadic_range_constraint(b_idx, 8,
"bad range");
284 circuit_builder.assert_equal(a_idx, b_idx);
285 circuit_builder.create_dyadic_range_constraint(c_idx, 8,
"bad range");
286 circuit_builder.assert_equal(a_idx, c_idx);
288 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(circuit_builder);
290 TestFixture::prove_and_verify(circuit_builder,
true);
376 using IO =
typename TestFixture::IO;
381 using VKAndHash =
typename Flavor::VKAndHash;
389 this->set_default_pairing_points_and_ipa_claim_and_proof(
builder);
394 Prover prover(prover_instance,
vk);
395 auto proof = prover.construct_proof();
398 Proof extended_proof(proof);
399 for (
size_t i = 0; i < 10; i++) {
404 Verifier verifier(vk_and_hash);
422 GTEST_SKIP() <<
"Masking area only exists for ZK flavors";
429 this->set_default_pairing_points_and_ipa_claim_and_proof(baseline_builder);
431 const size_t baseline_dyadic = baseline_instance->dyadic_size();
434 size_t prev_dyadic = 0;
435 size_t prev_final_active_idx = 0;
436 bool found_jump =
false;
437 for (
size_t num_extra_gates = 0; num_extra_gates <= baseline_dyadic; num_extra_gates++) {
439 if (num_extra_gates > 0) {
442 this->set_default_pairing_points_and_ipa_claim_and_proof(
builder);
446 const size_t dyadic_size = prover_instance->dyadic_size();
447 const size_t final_active_idx = prover_instance->get_final_active_wire_idx();
448 const size_t first_masked_row = dyadic_size - NUM_MASKED_ROWS;
451 ASSERT_LT(final_active_idx, first_masked_row)
452 <<
"lagrange_last (at " << final_active_idx <<
") overlaps masking area (starting at "
453 << first_masked_row <<
") with num_extra_gates=" << num_extra_gates;
456 ASSERT_GE(dyadic_size - final_active_idx - 1,
static_cast<size_t>(NUM_DISABLED_ROWS_IN_SUMCHECK));
458 if (prev_dyadic != 0 && dyadic_size > prev_dyadic) {
460 EXPECT_EQ(dyadic_size, 2 * prev_dyadic);
462 EXPECT_LE(prev_dyadic - prev_final_active_idx - 1,
463 2 *
static_cast<size_t>(NUM_DISABLED_ROWS_IN_SUMCHECK));
468 this->set_default_pairing_points_and_ipa_claim_and_proof(tight_builder);
470 this->prove_and_verify(tight_instance,
true);
476 prev_dyadic = dyadic_size;
477 prev_final_active_idx = final_active_idx;
480 EXPECT_TRUE(found_jump) <<
"should have found a dyadic size jump within " << baseline_dyadic <<
" extra gates";
FixedVKAndHash_< PrecomputedEntities< Commitment >, BF, ECCVMHardcodedVKAndHash > VerificationKey
The verification key stores commitments to the precomputed polynomials used by the verifier.