Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
test_class.hpp
Go to the documentation of this file.
1#pragma once
2
8#include "gtest/gtest.h"
9#include <type_traits>
10#include <vector>
11
12namespace acir_format {
13
14using namespace bb;
15using namespace bb::stdlib;
16
17// Type trait to detect std::vector
18template <typename T> struct is_std_vector : std::false_type {};
19
20template <typename T, typename Alloc> struct is_std_vector<std::vector<T, Alloc>> : std::true_type {};
21
22template <typename T> inline constexpr bool is_std_vector_v = is_std_vector<T>::value;
23
24// True if the constraint is Bilinear or BatchedEq, in which case the circuit construction needs to go
25// down the Mega path
26template <typename T> inline constexpr bool needs_mega_classification = false;
27template <> inline constexpr bool needs_mega_classification<BilinearConstraint> = true;
28template <> inline constexpr bool needs_mega_classification<BatchedEqCheckConstraint> = true;
29template <typename T> inline constexpr bool needs_mega_classification<std::vector<T>> = needs_mega_classification<T>;
30
42
46inline Acir::FunctionInput witness_to_function_input(uint32_t witness_index)
47{
48 return Acir::FunctionInput{ .value =
49 Acir::FunctionInput::Witness{ .value = Acir::Witness{ .value = witness_index } } };
50}
51
59{
61 .mul_terms = {},
62 .linear_combinations = {},
63 .q_c = bb::fr::zero().to_buffer(),
64 };
65
66 if (input.is_constant) {
67 expr.q_c = input.value.to_buffer();
68 } else {
69 // Linear term with coefficient 1
70 expr.linear_combinations.push_back(
71 std::make_tuple(bb::fr::one().to_buffer(), Acir::Witness{ .value = input.index }));
72 }
73
74 return expr;
75}
76
81{
82 return Acir::MemOp{
83 // Acir::MemOp::read is the serialized MemOpKind bool: false = Read, true = Write.
84 .read = (mem_op.access_type == AccessType::Write),
85 .index = Acir::Witness{ .value = mem_op.index },
86 .value = Acir::Witness{ .value = mem_op.value },
87 };
88}
89
94{
95 switch (type) {
96 case BlockType::ROM:
97 case BlockType::RAM:
98 // ROM and RAM both map to Memory in ACIR
100 case BlockType::CallData: {
101 uint32_t id = static_cast<uint32_t>(calldata_id);
103 }
106 default:
107 throw_or_abort("Unknown BlockType");
108 }
109}
110
122inline std::vector<Acir::Opcode> block_constraint_to_acir_opcodes(const BlockConstraint& constraint,
123 uint32_t block_id = 0)
124{
125 std::vector<Acir::Opcode> opcodes;
126
127 // Create the MemoryInit opcode
128 std::vector<Acir::Witness> init_witnesses;
129 init_witnesses.reserve(constraint.init.size());
130 for (const auto& init_val : constraint.init) {
131 init_witnesses.push_back(Acir::Witness{ .value = init_val });
132 }
133
135 .block_id = Acir::BlockId{ .value = block_id },
136 .init = std::move(init_witnesses),
137 .block_type = block_type_to_acir_block_type(constraint.type, constraint.calldata_id),
138 };
139 opcodes.push_back(Acir::Opcode{ .value = mem_init });
140
141 // Create MemoryOp opcodes for each operation in the trace
142 for (const auto& mem_op : constraint.trace) {
143 Acir::Opcode::MemoryOp acir_mem_op{
144 .block_id = Acir::BlockId{ .value = block_id },
145 .op = mem_op_to_acir_mem_op(mem_op),
146 };
147 opcodes.push_back(Acir::Opcode{ .value = acir_mem_op });
148 }
149
150 return opcodes;
151}
152
157inline void add_terms_to_expression(Acir::Expression& expr, const QuadConstraint& mul_quad)
158{
159 // Add multiplication term if both a and b are not constants
160 if (mul_quad.a != bb::stdlib::IS_CONSTANT && mul_quad.b != bb::stdlib::IS_CONSTANT &&
161 !mul_quad.mul_scaling.is_zero()) {
162 expr.mul_terms.push_back(std::make_tuple(mul_quad.mul_scaling.to_buffer(),
163 Acir::Witness{ .value = mul_quad.a },
164 Acir::Witness{ .value = mul_quad.b }));
165 }
166
167 // Add linear terms for each non-constant witness with non-zero scaling
168 if (mul_quad.a != bb::stdlib::IS_CONSTANT && !mul_quad.a_scaling.is_zero()) {
169 expr.linear_combinations.push_back(
170 std::make_tuple(mul_quad.a_scaling.to_buffer(), Acir::Witness{ .value = mul_quad.a }));
171 }
172 if (mul_quad.b != bb::stdlib::IS_CONSTANT && !mul_quad.b_scaling.is_zero()) {
173 expr.linear_combinations.push_back(
174 std::make_tuple(mul_quad.b_scaling.to_buffer(), Acir::Witness{ .value = mul_quad.b }));
175 }
176 if (mul_quad.c != bb::stdlib::IS_CONSTANT && !mul_quad.c_scaling.is_zero()) {
177 expr.linear_combinations.push_back(
178 std::make_tuple(mul_quad.c_scaling.to_buffer(), Acir::Witness{ .value = mul_quad.c }));
179 }
180 if (mul_quad.d != bb::stdlib::IS_CONSTANT && !mul_quad.d_scaling.is_zero()) {
181 expr.linear_combinations.push_back(
182 std::make_tuple(mul_quad.d_scaling.to_buffer(), Acir::Witness{ .value = mul_quad.d }));
183 }
184}
185
197template <typename ConstraintType> std::vector<Acir::Opcode> constraint_to_acir_opcode(const ConstraintType& constraint)
198{
200 // LogicConstraint maps to either AND or XOR BlackBoxFuncCall
201 if (constraint.is_xor_gate) {
202 return { Acir::Opcode{
206 .rhs = witness_or_constant_to_function_input(constraint.b),
207 .num_bits = constraint.num_bits,
208 .output = Acir::Witness{ .value = constraint.result },
209 } } } } };
210 }
211 return { Acir::Opcode{
215 .rhs = witness_or_constant_to_function_input(constraint.b),
216 .num_bits = constraint.num_bits,
217 .output = Acir::Witness{ .value = constraint.result },
218 } } } } };
220 return { Acir::Opcode{
223 .input = witness_to_function_input(constraint.witness),
224 .num_bits = constraint.num_bits,
225 } } } } };
227 std::vector<Acir::FunctionInput> inputs;
228 for (const auto& input : constraint.inputs) {
230 }
232 for (size_t i = 0; i < 16; ++i) {
233 (*iv)[i] = witness_or_constant_to_function_input(constraint.iv[i]);
234 }
236 for (size_t i = 0; i < 16; ++i) {
237 (*key)[i] = witness_or_constant_to_function_input(constraint.key[i]);
238 }
239 std::vector<Acir::Witness> outputs;
240 for (const auto& out : constraint.outputs) {
241 outputs.push_back(Acir::Witness{ .value = out });
242 }
246 .iv = iv,
247 .key = key,
248 .outputs = std::move(outputs),
249 } } } } };
252 for (size_t i = 0; i < 16; ++i) {
253 (*inputs)[i] = witness_or_constant_to_function_input(constraint.inputs[i]);
254 }
256 for (size_t i = 0; i < 8; ++i) {
257 (*hash_values)[i] = witness_or_constant_to_function_input(constraint.hash_values[i]);
258 }
260 for (size_t i = 0; i < 8; ++i) {
261 (*outputs)[i] = Acir::Witness{ .value = constraint.result[i] };
262 }
265 .inputs = inputs,
266 .hash_values = hash_values,
267 .outputs = outputs,
268 } } } } };
271 for (size_t i = 0; i < 32; ++i) {
272 (*hashed_message)[i] = witness_to_function_input(constraint.hashed_message[i]);
273 }
275 for (size_t i = 0; i < 64; ++i) {
276 (*signature)[i] = witness_to_function_input(constraint.signature[i]);
277 }
279 for (size_t i = 0; i < 32; ++i) {
280 (*public_key_x)[i] = witness_to_function_input(constraint.pub_x_indices[i]);
281 }
283 for (size_t i = 0; i < 32; ++i) {
284 (*public_key_y)[i] = witness_to_function_input(constraint.pub_y_indices[i]);
285 }
286 auto predicate = witness_or_constant_to_function_input(constraint.predicate);
287 if (constraint.type == bb::CurveType::SECP256K1) {
288 return { Acir::Opcode{
291 .public_key_x = public_key_x,
292 .public_key_y = public_key_y,
293 .signature = signature,
294 .hashed_message = hashed_message,
295 .predicate = predicate,
296 .output = Acir::Witness{ .value = constraint.result },
297 } } } } };
298 }
299 return { Acir::Opcode{
302 .public_key_x = public_key_x,
303 .public_key_y = public_key_y,
304 .signature = signature,
305 .hashed_message = hashed_message,
306 .predicate = predicate,
307 .output = Acir::Witness{ .value = constraint.result },
308 } } } } };
310 std::vector<Acir::FunctionInput> inputs;
311 for (const auto& input : constraint.inputs) {
313 }
315 for (size_t i = 0; i < 32; ++i) {
316 (*outputs)[i] = Acir::Witness{ .value = constraint.result[i] };
317 }
321 .outputs = outputs,
322 } } } } };
324 std::vector<Acir::FunctionInput> inputs;
325 for (const auto& input : constraint.inputs) {
327 }
329 for (size_t i = 0; i < 32; ++i) {
330 (*outputs)[i] = Acir::Witness{ .value = constraint.result[i] };
331 }
335 .outputs = outputs,
336 } } } } };
337 } else if constexpr (std::is_same_v<ConstraintType, Keccakf1600>) {
339 for (size_t i = 0; i < 25; ++i) {
340 (*inputs)[i] = witness_or_constant_to_function_input(constraint.state[i]);
341 }
343 for (size_t i = 0; i < 25; ++i) {
344 (*outputs)[i] = Acir::Witness{ .value = constraint.result[i] };
345 }
348 .inputs = inputs,
349 .outputs = outputs,
350 } } } } };
352 std::vector<Acir::FunctionInput> inputs;
353 for (const auto& input : constraint.state) {
355 }
356 std::vector<Acir::Witness> outputs;
357 for (const auto& out : constraint.result) {
358 outputs.push_back(Acir::Witness{ .value = out });
359 }
360 return { Acir::Opcode{
364 .outputs = std::move(outputs),
365 } } } } };
367 std::vector<Acir::FunctionInput> points;
368 for (const auto& pt : constraint.points) {
369 points.push_back(witness_or_constant_to_function_input(pt));
370 }
371 std::vector<Acir::FunctionInput> scalars;
372 for (const auto& sc : constraint.scalars) {
373 scalars.push_back(witness_or_constant_to_function_input(sc));
374 }
376 (*outputs)[0] = Acir::Witness{ .value = constraint.out_point_x };
377 (*outputs)[1] = Acir::Witness{ .value = constraint.out_point_y };
381 .points = std::move(points),
382 .scalars = std::move(scalars),
383 .predicate = witness_or_constant_to_function_input(constraint.predicate),
384 .outputs = outputs,
385 } } } } };
386 } else if constexpr (std::is_same_v<ConstraintType, EcAdd>) {
388 (*input1)[0] = witness_or_constant_to_function_input(constraint.input1_x);
389 (*input1)[1] = witness_or_constant_to_function_input(constraint.input1_y);
391 (*input2)[0] = witness_or_constant_to_function_input(constraint.input2_x);
392 (*input2)[1] = witness_or_constant_to_function_input(constraint.input2_y);
394 (*outputs)[0] = Acir::Witness{ .value = constraint.result_x };
395 (*outputs)[1] = Acir::Witness{ .value = constraint.result_y };
399 .input1 = input1,
400 .input2 = input2,
401 .predicate = witness_or_constant_to_function_input(constraint.predicate),
402 .outputs = outputs,
403 } } } } };
405 std::vector<Acir::FunctionInput> verification_key;
406 for (const auto& key_idx : constraint.key) {
407 verification_key.push_back(witness_to_function_input(key_idx));
408 }
409 std::vector<Acir::FunctionInput> proof;
410 for (const auto& proof_idx : constraint.proof) {
411 proof.push_back(witness_to_function_input(proof_idx));
412 }
413 std::vector<Acir::FunctionInput> public_inputs;
414 for (const auto& pub_input_idx : constraint.public_inputs) {
415 public_inputs.push_back(witness_to_function_input(pub_input_idx));
416 }
420 .verification_key = std::move(verification_key),
421 .proof = std::move(proof),
422 .public_inputs = std::move(public_inputs),
423 .key_hash = witness_to_function_input(constraint.key_hash),
424 .proof_type = constraint.proof_type,
425 .predicate = witness_or_constant_to_function_input(constraint.predicate),
426 } } } } };
428 return block_constraint_to_acir_opcodes(constraint);
430 // Convert a single mul_quad_ to an AssertZero opcode
431 Acir::Expression expr{
432 .mul_terms = {},
433 .linear_combinations = {},
434 .q_c = constraint.const_scaling.to_buffer(),
435 };
436
437 add_terms_to_expression(expr, constraint);
438
439 return { Acir::Opcode{ .value = Acir::Opcode::AssertZero{ .value = expr } } };
441 // Convert a vector of mul_quad_ (big_quad_constraints) to an AssertZero opcode
442 Acir::Expression expr{
443 .mul_terms = {},
444 .linear_combinations = {},
445 .q_c = constraint[0].const_scaling.to_buffer(),
446 };
447
448 for (const auto& mul_quad : constraint) {
449 add_terms_to_expression(expr, mul_quad);
450 }
451
452 return { Acir::Opcode{ .value = Acir::Opcode::AssertZero{ .value = expr } } };
454 // Rewind a BILINEAR row back to the single AssertZero opcode it was classified from:
455 // q_m·a·b + q_5·a·c + q_l·a + q_r·b + q_o·c + q_4·d + q_c = 0
456 // The two products share wire a. Zero coefficients are dropped so the re-classification sees the
457 // same shape.
458 auto push_linear = [](Acir::Expression& expr, const bb::fr& coeff, uint32_t witness) {
459 if (!coeff.is_zero()) {
460 expr.linear_combinations.push_back(
461 std::make_tuple(coeff.to_buffer(), Acir::Witness{ .value = witness }));
462 }
463 };
464
465 Acir::Expression expr{ .mul_terms = {}, .linear_combinations = {}, .q_c = constraint.q_c.to_buffer() };
466 if (!constraint.q_m.is_zero()) {
467 expr.mul_terms.push_back(std::make_tuple(constraint.q_m.to_buffer(),
468 Acir::Witness{ .value = constraint.a },
469 Acir::Witness{ .value = constraint.b }));
470 }
471 if (!constraint.q_5.is_zero()) {
472 expr.mul_terms.push_back(std::make_tuple(constraint.q_5.to_buffer(),
473 Acir::Witness{ .value = constraint.a },
474 Acir::Witness{ .value = constraint.c }));
475 }
476 push_linear(expr, constraint.q_l, constraint.a);
477 push_linear(expr, constraint.q_r, constraint.b);
478 push_linear(expr, constraint.q_o, constraint.c);
479 push_linear(expr, constraint.q_4, constraint.d);
480 return { Acir::Opcode{ .value = Acir::Opcode::AssertZero{ .value = expr } } };
482 // Rewind a BATCHED_EQ row back to its two independent linear AssertZeros — batched-eq-half-1
483 // (q_l·a + q_r·b + q_c) and, unless it is the zeroed leftover of a single-half batched-eq, batched-eq-half-2
484 // (q_o·c + q_4·d + q_m). Zero coefficients are dropped so the re-classification sees the same shape.
485 auto push_linear = [](Acir::Expression& expr, const bb::fr& coeff, uint32_t witness) {
486 if (!coeff.is_zero()) {
487 expr.linear_combinations.push_back(
488 std::make_tuple(coeff.to_buffer(), Acir::Witness{ .value = witness }));
489 }
490 };
491
492 std::vector<Acir::Opcode> opcodes;
493 Acir::Expression half_1{ .mul_terms = {}, .linear_combinations = {}, .q_c = constraint.q_c.to_buffer() };
494 push_linear(half_1, constraint.q_l, constraint.a);
495 push_linear(half_1, constraint.q_r, constraint.b);
496 opcodes.push_back(Acir::Opcode{ .value = Acir::Opcode::AssertZero{ .value = half_1 } });
497
498 if (!(constraint.q_o.is_zero() && constraint.q_4.is_zero() && constraint.q_m.is_zero())) {
499 Acir::Expression half_2{ .mul_terms = {}, .linear_combinations = {}, .q_c = constraint.q_m.to_buffer() };
500 push_linear(half_2, constraint.q_o, constraint.c);
501 push_linear(half_2, constraint.q_4, constraint.d);
502 opcodes.push_back(Acir::Opcode{ .value = Acir::Opcode::AssertZero{ .value = half_2 } });
503 }
504 return opcodes;
505 } else {
506 throw_or_abort("Unsupported constraint type");
507 }
508}
509
519inline Acir::Circuit build_acir_circuit(const std::vector<Acir::Opcode>& opcodes)
520{
521 return Acir::Circuit{
522 .function_name = "test_circuit",
523 .opcodes = opcodes,
524 .private_parameters = {},
525 .public_parameters = Acir::PublicInputs{ .value = {} },
526 .return_values = Acir::PublicInputs{ .value = {} },
527 .assert_messages = {},
528 };
529}
530
544template <typename ConstraintType> AcirFormat constraint_to_acir_format(const ConstraintType& constraint)
545{
546 std::vector<Acir::Opcode> opcodes;
547
548 if constexpr (is_std_vector_v<ConstraintType>) {
549 // Handle vector of constraints - collect all opcodes
550 for (const auto& c : constraint) {
551 auto c_opcodes = constraint_to_acir_opcode(c);
552 opcodes.insert(opcodes.end(), c_opcodes.begin(), c_opcodes.end());
553 }
554 } else {
555 // Handle single constraint
556 opcodes = constraint_to_acir_opcode(constraint);
557 }
558
559 // The bilinear / batched-eq gate is Mega-only
560 constexpr bool is_mega = needs_mega_classification<ConstraintType>;
561 Acir::Circuit circuit = build_acir_circuit(opcodes);
562 return circuit_serde_to_acir_format(circuit, is_mega);
563}
564
576template <typename T>
577concept TestBase = requires {
578 // Required type aliases
579 typename T::Builder;
580 typename T::AcirConstraint;
581 typename T::InvalidWitness;
582 typename T::InvalidWitness::Target;
583
584 // Ensure InvalidWitness::Target is enum
586
587 // Ensure that InvalidWitness::Target has a None value
588 { T::InvalidWitness::Target::None };
589
590 // InvalidWitness must provide static methods for test iteration
591 { T::InvalidWitness::get_all() } -> std::same_as<std::vector<typename T::InvalidWitness::Target>>;
592 { T::InvalidWitness::get_labels() } -> std::same_as<std::vector<std::string>>;
593
594 // Required constraint manipulation methods
595 requires requires(T& instance, typename T::AcirConstraint& constraint, WitnessVector& witness_values) {
600 { T::generate_constraints(constraint, witness_values) } -> std::same_as<void>;
601
606 { T::generate_metadata() } -> std::same_as<ProgramMetadata>;
607 };
608
609 requires requires(T& instance,
610 typename T::AcirConstraint constraint,
611 WitnessVector witness_values,
612 const typename T::InvalidWitness::Target& invalid_witness_target) {
620 {
621 T::invalidate_witness(constraint, witness_values, invalid_witness_target)
623 };
624};
625
626template <TestBase Base_> class TestClass {
627 public:
628 using Base = Base_;
629 using Builder = Base::Builder;
630 using AcirConstraint = Base::AcirConstraint;
631 using InvalidWitness = Base::InvalidWitness;
632 using InvalidWitnessTarget = Base::InvalidWitness::Target;
633
649 WitnessVector& witness_values,
650 const InvalidWitnessTarget& invalid_witness_target)
651 {
652 auto [updated_constraint, updated_witness_values] =
653 Base::invalidate_witness(constraint, witness_values, invalid_witness_target);
654
655 // Use the full ACIR flow: constraint -> Acir::Opcode -> Acir::Circuit -> circuit_serde_to_acir_format
656 AcirFormat constraint_system = constraint_to_acir_format(updated_constraint);
657 AcirProgram program{ constraint_system, updated_witness_values };
658 auto builder = create_circuit<Builder>(program, Base::generate_metadata());
659
660 return { CircuitChecker::check(builder), builder.failed(), builder.err() };
661 }
662
671 template <typename Flavor> static size_t test_vk_independence()
672 {
675
676 size_t num_gates = 0;
677
678 // Generate the constraint system
679 AcirConstraint constraint;
680 WitnessVector witness_values;
681 Base::generate_constraints(constraint, witness_values);
682
683 // Use the full ACIR flow: constraint -> Acir::Opcode -> Acir::Circuit -> circuit_serde_to_acir_format
684 AcirFormat constraint_system = constraint_to_acir_format(constraint);
685
686 // Construct the vks
687 std::shared_ptr<VerificationKey> vk_from_witness;
688 {
689 AcirProgram program{ constraint_system, witness_values };
690 auto builder = create_circuit<Builder>(program, Base::generate_metadata());
691 num_gates = builder.get_num_finalized_gates_inefficient();
692
693 auto prover_instance = std::make_shared<ProverInstance>(builder);
694 vk_from_witness = std::make_shared<VerificationKey>(prover_instance->get_precomputed());
695
696 // Validate the builder
697 EXPECT_TRUE(CircuitChecker::check(builder));
698 EXPECT_FALSE(builder.failed());
699 }
700
701 std::shared_ptr<VerificationKey> vk_from_constraint;
702 {
703 AcirProgram program{ constraint_system, /*witness=*/{} };
704 auto builder = create_circuit<Builder>(program, Base::generate_metadata());
705 auto prover_instance = std::make_shared<ProverInstance>(builder);
706 vk_from_constraint = std::make_shared<VerificationKey>(prover_instance->get_precomputed());
707 }
708
709 EXPECT_EQ(*vk_from_witness, *vk_from_constraint) << "Mismatch in the vks";
710
711 return num_gates;
712 }
713
719 static std::vector<std::string> test_tampering()
720 {
721 std::vector<std::string> error_msgs;
722
723 // Generate the constraint system
724 AcirConstraint constraint;
725 WitnessVector witness_values;
726 Base::generate_constraints(constraint, witness_values);
727
728 for (auto [target, label] : zip_view(InvalidWitness::get_all(), InvalidWitness::get_labels())) {
729 auto [circuit_checker_result, builder_failed, builder_err] =
730 test_constraints(constraint, witness_values, target);
731 error_msgs.emplace_back(builder_err);
732
733 if (target != InvalidWitness::Target::None) {
734 bool circuit_check_failed = !circuit_checker_result;
735 bool assert_eq_error_present = (builder_err.find("assert_eq") != std::string::npos);
736 EXPECT_TRUE(circuit_check_failed || assert_eq_error_present)
737 << "Circuit checker succeeded unexpectedly and no assert_eq failure for invalid witness target " +
738 label;
739 EXPECT_TRUE(builder_failed) << "Builder succeeded for invalid witness target " + label;
740 } else {
741 EXPECT_TRUE(circuit_checker_result)
742 << "Circuit checker failed unexpectedly for invalid witness target " + label;
743 EXPECT_FALSE(builder_failed) << "Builder failed unexpectedly for invalid witness target " + label;
744 }
745 }
746
747 return error_msgs;
748 }
749};
750
751} // namespace acir_format
static std::tuple< bool, bool, std::string > test_constraints(AcirConstraint &constraint, WitnessVector &witness_values, const InvalidWitnessTarget &invalid_witness_target)
General purpose testing function. It tests the constraints based on the invalidation target.
Base::InvalidWitness::Target InvalidWitnessTarget
Base::InvalidWitness InvalidWitness
static std::vector< std::string > test_tampering()
Test all invalid witness targets.
Base::AcirConstraint AcirConstraint
static size_t test_vk_independence()
Test vk generation is independent of the witness values supplied.
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 bool check(const Builder &circuit)
Check the witness satisifies the circuit.
FixedVKAndHash_< PrecomputedEntities< Commitment >, FF, typename constraining::AvmHardCodedVKAndHash > VerificationKey
Verification key of the AVM. It is fixed and reconstructed from precomputed values.
Definition flavor.hpp:213
Concept defining the requirements for the Base template parameter of TestClass.
AluTraceBuilder builder
Definition alu.test.cpp:124
std::string label
AvmProvingInputs inputs
ProverInstance_< UltraKeccakFlavor > ProverInstance
AcirFormat circuit_serde_to_acir_format(Acir::Circuit const &circuit, bool is_mega)
Convert an Acir::Circuit into an AcirFormat by processing all the opcodes.
void add_terms_to_expression(Acir::Expression &expr, const QuadConstraint &mul_quad)
Add terms for a QuadConstraint to an Acir::Expression.
AcirFormat constraint_to_acir_format(const ConstraintType &constraint)
Convert an AcirConstraint (single or vector) to AcirFormat by going through the full ACIR serde flow.
constexpr bool is_std_vector_v
Acir::BlockType block_type_to_acir_block_type(BlockType type, CallDataType calldata_id)
Convert an acir_format::BlockType to an Acir::BlockType.
std::vector< Acir::Opcode > block_constraint_to_acir_opcodes(const BlockConstraint &constraint, uint32_t block_id=0)
Convert a BlockConstraint to a vector of Acir::Opcodes.
constexpr bool needs_mega_classification
std::vector< bb::fr > WitnessVector
std::vector< Acir::Opcode > constraint_to_acir_opcode(const ConstraintType &constraint)
Convert a constraint to a vector of Acir::Opcodes.
Acir::Circuit build_acir_circuit(const std::vector< Acir::Opcode > &opcodes)
Build an Acir::Circuit from opcodes and witness count.
constexpr bool needs_mega_classification< BatchedEqCheckConstraint >
Acir::FunctionInput witness_or_constant_to_function_input(const WitnessOrConstant< bb::fr > &input)
Convert a WitnessOrConstant back to an Acir::FunctionInput.
Acir::FunctionInput witness_to_function_input(uint32_t witness_index)
Convert a witness index to an Acir::FunctionInput (witness variant).
Acir::MemOp mem_op_to_acir_mem_op(const MemOp &mem_op)
Convert an acir_format::MemOp to an Acir::MemOp.
constexpr bool needs_mega_classification< BilinearConstraint >
Acir::Expression witness_or_constant_to_expression(const WitnessOrConstant< bb::fr > &input)
Convert a WitnessOrConstant to an Acir::Expression.
Entry point for Barretenberg command-line interface.
Definition api.hpp:5
@ SECP256K1
Definition types.hpp:10
STL namespace.
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
std::vector< Instruction > target
bb::VectorAffineElementPushSpan< BaseParams > out
std::vector< uint8_t > to_buffer(T const &value)
std::vector< Acir::FunctionInput > inputs
Definition acir.hpp:4413
Acir::FunctionInput lhs
Definition acir.hpp:4475
std::vector< Acir::FunctionInput > inputs
Definition acir.hpp:4647
std::vector< Acir::FunctionInput > inputs
Definition acir.hpp:4695
std::shared_ptr< std::array< Acir::FunctionInput, 32 > > public_key_x
Definition acir.hpp:4743
std::shared_ptr< std::array< Acir::FunctionInput, 32 > > public_key_x
Definition acir.hpp:4819
std::shared_ptr< std::array< Acir::FunctionInput, 2 > > input1
Definition acir.hpp:4957
std::shared_ptr< std::array< Acir::FunctionInput, 25 > > inputs
Definition acir.hpp:5019
std::vector< Acir::FunctionInput > points
Definition acir.hpp:4895
std::vector< Acir::FunctionInput > inputs
Definition acir.hpp:5143
Acir::FunctionInput input
Definition acir.hpp:4599
std::vector< Acir::FunctionInput > verification_key
Definition acir.hpp:5067
std::shared_ptr< std::array< Acir::FunctionInput, 16 > > inputs
Definition acir.hpp:5191
Acir::FunctionInput lhs
Definition acir.hpp:4537
std::variant< AES128Encrypt, AND, XOR, RANGE, Blake2s, Blake3, EcdsaSecp256k1, EcdsaSecp256r1, MultiScalarMul, EmbeddedCurveAdd, Keccakf1600, RecursiveAggregation, Poseidon2Permutation, Sha256Compression > value
Definition acir.hpp:5259
uint32_t value
Definition acir.hpp:5682
std::variant< Memory, CallData, ReturnData > value
Definition acir.hpp:5733
std::string function_name
Definition acir.hpp:7231
std::vector< std::tuple< std::vector< uint8_t >, Acir::Witness > > linear_combinations
Definition acir.hpp:5856
std::vector< std::tuple< std::vector< uint8_t >, Acir::Witness, Acir::Witness > > mul_terms
Definition acir.hpp:5855
std::vector< uint8_t > value
Definition acir.hpp:4253
std::variant< Constant, Witness > value
Definition acir.hpp:4288
bool read
Definition acir.hpp:6273
Acir::Expression value
Definition acir.hpp:6330
Acir::BlackBoxFuncCall value
Definition acir.hpp:6348
Acir::BlockId block_id
Definition acir.hpp:6414
Acir::BlockId block_id
Definition acir.hpp:6366
std::variant< AssertZero, BlackBoxFuncCall, MemoryOp, MemoryInit, BrilligCall, Call > value
Definition acir.hpp:6592
std::vector< Acir::Witness > value
Definition acir.hpp:7213
uint32_t value
Definition acir.hpp:4233
Barretenberg's representation of ACIR constraints.
Struct containing both the constraints to be added to the circuit and the witness vector.
Struct holding the data required to add memory constraints to a circuit.
std::vector< uint32_t > init
Memory operation. index is the witness index of the memory location, and value is the witness index o...
static constexpr field one()
BB_INLINE constexpr bool is_zero() const noexcept
BB_INLINE std::vector< uint8_t > to_buffer() const
static constexpr field zero()
void throw_or_abort(std::string const &err)