Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
ultra_honk.test.cpp
Go to the documentation of this file.
1#include "ultra_honk.test.hpp"
6
7#include <gtest/gtest.h>
8#include <sstream>
9
10using namespace bb;
11
13
14#ifdef STARKNET_GARAGA_FLAVORS
15using FlavorTypes = testing::Types<UltraFlavor,
19 UltraStarknetFlavor,
20 UltraStarknetZKFlavor>;
21#else
22using FlavorTypes = testing::Types<UltraFlavor, UltraZKFlavor, UltraKeccakFlavor, UltraKeccakZKFlavor>;
23#endif
34TYPED_TEST(UltraHonkTests, ProofLengthCheck)
35{
36 using Flavor = TypeParam;
38 using IO = typename TestFixture::IO;
39 using Proof = typename Flavor::Transcript::Proof;
40
41 auto builder = Builder{};
42 IO::add_default(builder);
43 // Construct a UH proof and ensure its size matches expectation; if not, the constant may need to be updated
45 auto verification_key = std::make_shared<typename Flavor::VerificationKey>(prover_instance->get_precomputed());
46 UltraProver_<Flavor> prover(prover_instance, verification_key);
47 Proof ultra_proof = prover.construct_proof();
48 const size_t virtual_log_n = Flavor::USE_PADDING ? CONST_PROOF_SIZE_LOG_N : prover_instance->log_dyadic_size();
49 size_t expected_proof_length =
50 ProofLength::Honk<Flavor>::LENGTH_WITHOUT_PUB_INPUTS(virtual_log_n) + IO::PUBLIC_INPUTS_SIZE;
51 EXPECT_EQ(ultra_proof.size(), expected_proof_length);
52}
53
59{
61 size_t num_gates = 10;
62
63 // Add some arbitrary arithmetic gates that utilize public inputs
65 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(builder);
66
67 TestFixture::prove_and_verify(builder, /*expected_result=*/true);
68}
69
70TYPED_TEST(UltraHonkTests, TestNoLookupProof)
71{
72 auto circuit_builder = UltraCircuitBuilder();
73
74 for (size_t i = 0; i < 16; ++i) {
75 for (size_t j = 0; j < 16; ++j) {
76 uint64_t left = static_cast<uint64_t>(j);
77 uint64_t right = static_cast<uint64_t>(i);
78 uint32_t left_idx = circuit_builder.add_variable(fr(left));
79 uint32_t right_idx = circuit_builder.add_variable(fr(right));
80 uint32_t result_idx = circuit_builder.add_variable(fr(left ^ right));
81
82 uint32_t add_idx =
83 circuit_builder.add_variable(fr(left) + fr(right) + circuit_builder.get_variable(result_idx));
84 circuit_builder.create_big_add_gate(
85 { left_idx, right_idx, result_idx, add_idx, fr(1), fr(1), fr(1), fr(-1), fr(0) });
86 }
87 }
88 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(circuit_builder);
89
90 TestFixture::prove_and_verify(circuit_builder, /*expected_result=*/true);
91}
92
93TYPED_TEST(UltraHonkTests, TestEllipticGate)
94{
95 typedef grumpkin::g1::affine_element affine_element;
96 typedef grumpkin::g1::element element;
97 auto circuit_builder = UltraCircuitBuilder();
98
99 affine_element p1 = affine_element::random_element();
100 affine_element p2 = affine_element::random_element();
101
102 affine_element p3(element(p1) + element(p2));
103
104 uint32_t x1 = circuit_builder.add_variable(p1.x);
105 uint32_t y1 = circuit_builder.add_variable(p1.y);
106 uint32_t x2 = circuit_builder.add_variable(p2.x);
107 uint32_t y2 = circuit_builder.add_variable(p2.y);
108 uint32_t x3 = circuit_builder.add_variable(p3.x);
109 uint32_t y3 = circuit_builder.add_variable(p3.y);
110
111 circuit_builder.create_ecc_add_gate({ x1, y1, x2, y2, x3, y3, /*is_addition=*/true });
112
113 p3 = affine_element(element(p1) + element(p2));
114 x3 = circuit_builder.add_variable(p3.x);
115 y3 = circuit_builder.add_variable(p3.y);
116 circuit_builder.create_ecc_add_gate({ x1, y1, x2, y2, x3, y3, /*is_addition=*/true });
117
118 p3 = affine_element(element(p1) - element(p2));
119 x3 = circuit_builder.add_variable(p3.x);
120 y3 = circuit_builder.add_variable(p3.y);
121 circuit_builder.create_ecc_add_gate({ x1, y1, x2, y2, x3, y3, /*is_addition=*/false });
122
123 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(circuit_builder);
124
125 TestFixture::prove_and_verify(circuit_builder, /*expected_result=*/true);
126}
127
128TYPED_TEST(UltraHonkTests, NonNativeFieldMultiplication)
129{
130 using fq = fq;
131 auto circuit_builder = UltraCircuitBuilder();
132
135 uint256_t modulus = fq::modulus;
136
139 uint1024_t p_big = uint512_t(uint256_t(modulus));
140
141 uint1024_t q_big = (a_big * b_big) / p_big;
142 uint1024_t r_big = (a_big * b_big) % p_big;
143
144 uint256_t q(q_big.lo.lo);
145 uint256_t r(r_big.lo.lo);
146
147 const auto split_into_limbs = [&](const uint512_t& input) {
148 constexpr size_t NUM_BITS = 68;
149 std::array<fr, 4> limbs;
150 limbs[0] = input.slice(0, NUM_BITS).lo;
151 limbs[1] = input.slice(NUM_BITS * 1, NUM_BITS * 2).lo;
152 limbs[2] = input.slice(NUM_BITS * 2, NUM_BITS * 3).lo;
153 limbs[3] = input.slice(NUM_BITS * 3, NUM_BITS * 4).lo;
154 return limbs;
155 };
156
157 const auto get_limb_witness_indices = [&](const std::array<fr, 4>& limbs) {
158 std::array<uint32_t, 4> limb_indices;
159 limb_indices[0] = circuit_builder.add_variable(limbs[0]);
160 limb_indices[1] = circuit_builder.add_variable(limbs[1]);
161 limb_indices[2] = circuit_builder.add_variable(limbs[2]);
162 limb_indices[3] = circuit_builder.add_variable(limbs[3]);
163 return limb_indices;
164 };
165 const uint512_t BINARY_BASIS_MODULUS = uint512_t(1) << (68 * 4);
166 auto modulus_limbs = split_into_limbs(BINARY_BASIS_MODULUS - uint512_t(modulus));
167
168 const auto a_indices = get_limb_witness_indices(split_into_limbs(uint256_t(a)));
169 const auto b_indices = get_limb_witness_indices(split_into_limbs(uint256_t(b)));
170 const auto q_indices = get_limb_witness_indices(split_into_limbs(uint256_t(q)));
171 const auto r_indices = get_limb_witness_indices(split_into_limbs(uint256_t(r)));
172
174 a_indices, b_indices, q_indices, r_indices, modulus_limbs,
175 };
176 const auto [lo_1_idx, hi_1_idx] = circuit_builder.evaluate_non_native_field_multiplication(inputs);
177
178 // Range constrain the lo and hi carry outputs
179 const bool is_low_70_bits = uint256_t(circuit_builder.get_variable(lo_1_idx)).get_msb() < 70;
180 const bool is_high_70_bits = uint256_t(circuit_builder.get_variable(hi_1_idx)).get_msb() < 70;
181 if (is_low_70_bits && is_high_70_bits) {
182 // Uses more efficient NNF range check if both limbs are < 2^70
183 circuit_builder.range_constrain_two_limbs(lo_1_idx, hi_1_idx, 70, 70);
184 } else {
185 // Fallback to default range checks
186 circuit_builder.create_limbed_range_constraint(lo_1_idx, 72);
187 circuit_builder.create_limbed_range_constraint(hi_1_idx, 72);
188 }
189
190 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(circuit_builder);
191
192 TestFixture::prove_and_verify(circuit_builder, /*expected_result=*/true);
193}
194
195TYPED_TEST(UltraHonkTests, RangeChecksOnDuplicates)
196{
197 auto circuit_builder = UltraCircuitBuilder();
198
199 uint32_t a = circuit_builder.add_variable(fr(100));
200 uint32_t b = circuit_builder.add_variable(fr(100));
201 uint32_t c = circuit_builder.add_variable(fr(100));
202 uint32_t d = circuit_builder.add_variable(fr(100));
203
204 circuit_builder.assert_equal(a, b);
205 circuit_builder.assert_equal(a, c);
206 circuit_builder.assert_equal(a, d);
207
208 circuit_builder.create_small_range_constraint(a, 1000);
209 circuit_builder.create_small_range_constraint(b, 1001);
210 circuit_builder.create_small_range_constraint(c, 999);
211 circuit_builder.create_small_range_constraint(d, 1000);
212
213 circuit_builder.create_big_add_gate(
214 {
215 a,
216 b,
217 c,
218 d,
219 0,
220 0,
221 0,
222 0,
223 0,
224 },
225 false);
226
227 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(circuit_builder);
228
229 TestFixture::prove_and_verify(circuit_builder, /*expected_result=*/true);
230}
231
232// Ensure copy constraints added on variables smaller than 2^14, which have been previously
233// range constrained, do not break the set equivalence checks because of indices mismatch.
234// 2^14 is DEFAULT_PLOOKUP_RANGE_BITNUM i.e. the maximum size before a variable gets sliced
235// before range constraints are applied to it.
236TYPED_TEST(UltraHonkTests, RangeConstraintSmallVariable)
237{
238 auto circuit_builder = UltraCircuitBuilder();
239
240 uint16_t mask = (1 << 8) - 1;
241 int a = engine.get_random_uint16() & mask;
242 uint32_t a_idx = circuit_builder.add_variable(fr(a));
243 uint32_t b_idx = circuit_builder.add_variable(fr(a));
244 ASSERT_NE(a_idx, b_idx);
245 uint32_t c_idx = circuit_builder.add_variable(fr(a));
246 ASSERT_NE(c_idx, b_idx);
247 circuit_builder.create_dyadic_range_constraint(b_idx, 8, "bad range");
248 circuit_builder.assert_equal(a_idx, b_idx);
249 circuit_builder.create_dyadic_range_constraint(c_idx, 8, "bad range");
250 circuit_builder.assert_equal(a_idx, c_idx);
251
252 TestFixture::set_default_pairing_points_and_ipa_claim_and_proof(circuit_builder);
253
254 TestFixture::prove_and_verify(circuit_builder, /*expected_result=*/true);
255}
256
263TYPED_TEST(UltraHonkTests, NativeVKHashMismatchDetected)
264{
265 using Flavor = TypeParam;
266 using IO = typename TestFixture::IO;
267 using Builder = typename Flavor::CircuitBuilder;
268 using Prover = UltraProver_<Flavor>;
271 using VKAndHash = typename Flavor::VKAndHash;
272 using Verifier = UltraVerifier_<Flavor, IO>;
273
274 // Create a simple circuit
277 this->set_default_pairing_points_and_ipa_claim_and_proof(builder);
278
279 // Create prover instance and VK
280 auto prover_instance = std::make_shared<ProverInstance>(builder);
281 auto vk = std::make_shared<VerificationKey>(prover_instance->get_precomputed());
282
283 // Create prover and prove
284 Prover prover(prover_instance, vk);
285 auto proof = prover.construct_proof();
286 auto vk_and_hash = std::make_shared<VKAndHash>(vk);
287
288 // Corrupt the stored hash
289 vk_and_hash->hash = fr::random_element();
290
291 // Verification should fail with BB_ASSERT_EQ detecting the mismatch
292 Verifier verifier(vk_and_hash);
293 EXPECT_THROW_WITH_MESSAGE(verifier.verify_proof(proof), "VK Hash Mismatch");
294}
295
301TYPED_TEST(UltraHonkTests, TooShortProofRejected)
302{
303 using Flavor = TypeParam;
304 using IO = typename TestFixture::IO;
305 using Builder = typename Flavor::CircuitBuilder;
306 using Prover = UltraProver_<Flavor>;
309 using VKAndHash = typename Flavor::VKAndHash;
310 using Verifier = UltraVerifier_<Flavor, IO>;
311 using Proof = typename Flavor::Transcript::Proof;
312
313 // Create a simple circuit and produce a valid proof
316 this->set_default_pairing_points_and_ipa_claim_and_proof(builder);
317
318 auto prover_instance = std::make_shared<ProverInstance>(builder);
319 auto vk = std::make_shared<VerificationKey>(prover_instance->get_precomputed());
320
321 Prover prover(prover_instance, vk);
322 auto proof = prover.construct_proof();
323
324 // Truncate the proof by removing the last 10 elements
325 Proof truncated_proof(proof.begin(), proof.end() - 10);
326
327 auto vk_and_hash = std::make_shared<VKAndHash>(vk);
328 Verifier verifier(vk_and_hash);
329 EXPECT_THROW_WITH_MESSAGE(verifier.verify_proof(truncated_proof), "Proof size too small");
330}
331
337TYPED_TEST(UltraHonkTests, TooLongProofRejected)
338{
339 using Flavor = TypeParam;
340 using IO = typename TestFixture::IO;
341 using Builder = typename Flavor::CircuitBuilder;
342 using Prover = UltraProver_<Flavor>;
345 using VKAndHash = typename Flavor::VKAndHash;
346 using Verifier = UltraVerifier_<Flavor, IO>;
347 using Proof = typename Flavor::Transcript::Proof;
348 using FF = typename Flavor::FF;
349
350 // Create a simple circuit and produce a valid proof
353 this->set_default_pairing_points_and_ipa_claim_and_proof(builder);
354
355 auto prover_instance = std::make_shared<ProverInstance>(builder);
356 auto vk = std::make_shared<VerificationKey>(prover_instance->get_precomputed());
357
358 Prover prover(prover_instance, vk);
359 auto proof = prover.construct_proof();
360
361 // Append extra elements to the proof
362 Proof extended_proof(proof);
363 for (size_t i = 0; i < 10; i++) {
364 extended_proof.push_back(FF::random_element());
365 }
366
367 auto vk_and_hash = std::make_shared<VKAndHash>(vk);
368 Verifier verifier(vk_and_hash);
369 EXPECT_THROW_WITH_MESSAGE(verifier.verify_proof(extended_proof), "num_public_inputs mismatch");
370}
371
382TYPED_TEST(UltraHonkTests, DyadicSizeJumpsToProtectMaskingArea)
383{
384 using Flavor = TypeParam;
385 if constexpr (!Flavor::HasZK) {
386 GTEST_SKIP() << "Masking area only exists for ZK flavors";
387 } else {
388 using Builder = typename Flavor::CircuitBuilder;
390
391 // Determine the baseline dyadic size (pairing points + finalization overhead, no user gates)
392 Builder baseline_builder;
393 this->set_default_pairing_points_and_ipa_claim_and_proof(baseline_builder);
394 auto baseline_instance = std::make_shared<ProverInstance>(baseline_builder);
395 const size_t baseline_dyadic = baseline_instance->dyadic_size();
396
397 // The disabled head region (rows 0..TRACE_OFFSET-1)
398 // is always present. Verify that the active trace starts after the disabled region and that
399 // the dyadic size doubles when the trace gets tightly packed.
400 size_t prev_dyadic = 0;
401 bool found_jump = false;
402 for (size_t num_extra_gates = 0; num_extra_gates <= baseline_dyadic; num_extra_gates++) {
404 if (num_extra_gates > 0) {
406 }
407 this->set_default_pairing_points_and_ipa_claim_and_proof(builder);
408
409 auto prover_instance = std::make_shared<ProverInstance>(builder);
410
411 const size_t dyadic_size = prover_instance->dyadic_size();
412 const size_t final_active_idx = prover_instance->get_final_active_wire_idx();
413
414 // Invariant: active trace doesn't overlap the disabled head region
415 ASSERT_GE(final_active_idx, ProverInstance::TRACE_OFFSET)
416 << "final_active_idx (" << final_active_idx << ") is within the disabled head region";
417
418 if (prev_dyadic != 0 && dyadic_size > prev_dyadic) {
419 // Dyadic size should exactly double
420 EXPECT_EQ(dyadic_size, 2 * prev_dyadic);
421
422 // Prove and verify at the tightest packing (right before the jump)
423 Builder tight_builder;
424 MockCircuits::add_arithmetic_gates(tight_builder, num_extra_gates - 1);
425 this->set_default_pairing_points_and_ipa_claim_and_proof(tight_builder);
426 auto tight_instance = std::make_shared<ProverInstance>(tight_builder);
427 this->prove_and_verify(tight_instance, /*expected_result=*/true);
428
429 found_jump = true;
430 break;
431 }
432
433 prev_dyadic = dyadic_size;
434 }
435
436 EXPECT_TRUE(found_jump) << "should have found a dyadic size jump within " << baseline_dyadic << " extra gates";
437 }
438}
439
446TYPED_TEST(UltraHonkTests, DyadicSizeAccountsForTableOffset)
447{
448 using Flavor = TypeParam;
449 using Builder = typename Flavor::CircuitBuilder;
450 using IO = typename TestFixture::IO;
451
452 // Test with several lookup table types of varying sizes
453 for (auto table_id : { plookup::MultiTableId::UINT32_XOR,
454 plookup::MultiTableId::UINT32_AND,
455 plookup::MultiTableId::SHA256_CH_INPUT }) {
456 auto builder = Builder{};
457 uint32_t left_idx = builder.add_variable(fr(engine.get_random_uint32()));
458 uint32_t right_idx = builder.add_variable(fr(engine.get_random_uint32()));
459 auto accumulators = plookup::get_lookup_accumulators(
460 table_id, builder.get_variable(left_idx), builder.get_variable(right_idx), true);
461 builder.create_gates_from_plookup_accumulators(table_id, accumulators, left_idx, right_idx);
462 IO::add_default(builder);
463
464 auto prover_instance = std::make_shared<ProverInstance_<Flavor>>(builder);
465
466 const size_t tables_size = builder.get_tables_size();
467 ASSERT_GT(tables_size, 0) << "expected non-empty lookup tables";
468
469 const size_t table_offset = builder.blocks.lookup.trace_offset();
470 const size_t tables_end = table_offset + tables_size;
471
472 EXPECT_GE(table_offset, ProverInstance_<Flavor>::TRACE_OFFSET)
473 << "lookup block should be past the disabled region";
474 EXPECT_GE(prover_instance->dyadic_size(), tables_end)
475 << "dyadic size (" << prover_instance->dyadic_size() << ") must accommodate tables_end (" << tables_end
476 << ") for table_offset=" << table_offset << " tables_size=" << tables_size;
477 }
478}
479
484TYPED_TEST(UltraHonkTests, WitnessPolynomialsMasked)
485{
486 using Flavor = TypeParam;
487 if constexpr (!Flavor::HasZK) {
488 GTEST_SKIP() << "Masking only applies to ZK flavors";
489 } else {
490 using Builder = typename Flavor::CircuitBuilder;
491 using IO = typename TestFixture::IO;
492
493 auto builder = Builder{};
494 IO::add_default(builder);
495 auto prover_instance = std::make_shared<ProverInstance_<Flavor>>(builder);
496
497 auto check_masked = [](const auto& poly, const std::string& label) {
498 bool has_masking = false;
499 for (size_t j = 0; j < NUM_MASKED_ROWS; j++) {
500 has_masking |= !poly[NUM_ZERO_ROWS + j].is_zero();
501 }
502 EXPECT_TRUE(has_masking) << label << " should be masked";
503 };
504
505 auto& polys = prover_instance->polynomials;
506 check_masked(polys.w_l(), "w_l");
507 check_masked(polys.w_r(), "w_r");
508 check_masked(polys.w_o(), "w_o");
509 check_masked(polys.w_4(), "w_4");
510 check_masked(polys.z_perm(), "z_perm");
511 check_masked(polys.lookup_read_counts(), "lookup_read_counts");
512 check_masked(polys.lookup_read_tags(), "lookup_read_tags");
513 check_masked(polys.lookup_inverses(), "lookup_inverses");
514 }
515}
516
522TYPED_TEST(UltraHonkTests, RepeatedCommitmentsIndicesCorrect)
523{
524 using Flavor = TypeParam;
525 using Builder = typename Flavor::CircuitBuilder;
526 using IO = typename TestFixture::IO;
527 using CommitmentKey = typename Flavor::CommitmentKey;
528 using Commitment = typename Flavor::Commitment;
529
530 auto builder = Builder{};
531 IO::add_default(builder);
532 auto prover_instance = std::make_shared<ProverInstance_<Flavor>>(builder);
533 CommitmentKey ck(prover_instance->dyadic_size());
534
535 auto unshifted = prover_instance->polynomials.get_unshifted();
536 auto to_be_shifted = prover_instance->polynomials.get_to_be_shifted();
537
538 constexpr auto repeated = Flavor::REPEATED_COMMITMENTS;
539 ASSERT_EQ(to_be_shifted.size(), repeated.first.count);
540
541 // Build the commitment vector exactly as Shplemini does: [Q, unshifted..., to_be_shifted...]
542 std::vector<Commitment> commitments;
543 commitments.push_back(Commitment::one()); // dummy Q
544 for (auto& poly : unshifted) {
545 commitments.push_back(ck.commit(poly));
546 }
547 for (auto& poly : to_be_shifted) {
548 commitments.push_back(ck.commit(poly));
549 }
550
551 // Same offset logic as remove_repeated_commitments
552 constexpr size_t offset = Flavor::HasZK ? 2 : 1;
553 for (size_t i = 0; i < repeated.first.count; i++) {
554 EXPECT_EQ(commitments[repeated.first.original_start + offset + i],
555 commitments[repeated.first.duplicate_start + offset + i])
556 << "REPEATED_COMMITMENTS commitment mismatch at index " << i;
557 }
558}
559
560namespace {
561size_t count_occurrences(const std::string& haystack, const std::string& needle)
562{
563 size_t count = 0;
564 for (size_t pos = haystack.find(needle); pos != std::string::npos;
565 pos = haystack.find(needle, pos + needle.size())) {
566 ++count;
567 }
568 return count;
569}
570} // namespace
571
572// Finding #1: the Solidity VK generator hand-codes the G1 emission list. Couple the number of
573// emitted G1 points to the flavor's precomputed entity count so the list cannot silently drift.
574TEST(HonkKeyGen, EmittedG1CountMatchesPrecomputedEntities)
575{
578
579 std::ostringstream os;
580 output_vk_sol_ultra_honk(os, vk, "TestHonkVerificationKey", /*include_types_import=*/true);
581
582 EXPECT_EQ(count_occurrences(os.str(), "Honk.G1Point"), VerificationKey::size());
583}
#define EXPECT_THROW_WITH_MESSAGE(code, expectedMessageRegex)
Definition assert.hpp:224
CommitmentKey object over a pairing group 𝔾₁.
static constexpr bool HasZK
typename Curve::ScalarField FF
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 bool USE_PADDING
static void add_arithmetic_gates_with_public_inputs(Builder &builder, const size_t num_gates=4)
Add a specified number of arithmetic gates (with public inputs) to the provided circuit.
static void add_arithmetic_gates(Builder &builder, const size_t num_gates=4)
Add a specified number of arithmetic gates to the provided circuit.
Base Native verification key class.
Definition flavor.hpp:138
Contains all the information required by a Honk prover to create a proof, constructed from a finalize...
static constexpr size_t TRACE_OFFSET
NativeVerificationKey_< PrecomputedEntities< Commitment >, Codec, HashFunction, CommitmentKey > VerificationKey
Child class of UltraFlavor that runs with ZK Sumcheck.
element class. Implements ecc group arithmetic using Jacobian coordinates See https://hyperelliptic....
Definition element.hpp:35
virtual uint16_t get_random_uint16()=0
virtual uint32_t get_random_uint32()=0
constexpr uint64_t get_msb() const
AluTraceBuilder builder
Definition alu.test.cpp:124
FF a
FF b
std::string label
numeric::RNG & engine
ssize_t offset
Definition engine.cpp:62
testing::Types< UltraFlavor, UltraKeccakFlavor, MegaFlavor > FlavorTypes
AvmProvingInputs inputs
void output_vk_sol_ultra_honk(std::ostream &os, auto const &key, std::string const &class_name, bool include_types_import=false)
uintx< uint256_t > uint512_t
Definition uintx.hpp:309
ReadData< bb::fr > get_lookup_accumulators(const MultiTableId id, const fr &key_a, const fr &key_b, const bool is_2_to_1_lookup)
Given a table ID and the key(s) for a key-value lookup, return the lookup accumulators.
Entry point for Barretenberg command-line interface.
Definition api.hpp:5
field< Bn254FqParams > fq
Definition fq.hpp:153
TYPED_TEST_SUITE(CommitmentKeyTest, Curves)
field< Bn254FrParams > fr
Definition fr.hpp:155
TYPED_TEST(CommitmentKeyTest, CommitToZeroPoly)
UltraCircuitBuilder_< UltraExecutionTraceBlocks > UltraCircuitBuilder
TEST(BoomerangMegaCircuitBuilder, BasicCircuit)
CommitmentKey< Curve > ck
VerifierCommitmentKey< Curve > vk
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
static constexpr size_t LENGTH_WITHOUT_PUB_INPUTS(size_t log_n)
static constexpr uint256_t modulus
static field random_element(numeric::RNG *engine=nullptr) noexcept
An object storing two EC points that represent the inputs to a pairing check.