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
7#include "gtest/gtest.h"
8#include <type_traits>
9#include <vector>
10
11namespace acir_format {
12
13using namespace bb;
14using namespace bb::stdlib;
15
16// Type trait to detect std::vector
17template <typename T> struct is_std_vector : std::false_type {};
18
19template <typename T, typename Alloc> struct is_std_vector<std::vector<T, Alloc>> : std::true_type {};
20
21template <typename T> inline constexpr bool is_std_vector_v = is_std_vector<T>::value;
22
34
38inline Acir::FunctionInput witness_to_function_input(uint32_t witness_index)
39{
40 return Acir::FunctionInput{ .value =
41 Acir::FunctionInput::Witness{ .value = Acir::Witness{ .value = witness_index } } };
42}
43
51{
53 .mul_terms = {},
54 .linear_combinations = {},
55 .q_c = bb::fr::zero().to_buffer(),
56 };
57
58 if (input.is_constant) {
59 expr.q_c = input.value.to_buffer();
60 } else {
61 // Linear term with coefficient 1
62 expr.linear_combinations.push_back(
63 std::make_tuple(bb::fr::one().to_buffer(), Acir::Witness{ .value = input.index }));
64 }
65
66 return expr;
67}
68
76{
77 bb::fr value = (access_type == AccessType::Write) ? bb::fr::one() : bb::fr::zero();
78 return Acir::Expression{
79 .mul_terms = {},
80 .linear_combinations = {},
81 .q_c = value.to_buffer(),
82 };
83}
84
88inline Acir::Expression witness_to_expression(uint32_t witness_index)
89{
90 return Acir::Expression{
91 .mul_terms = {},
92 .linear_combinations = { std::make_tuple(bb::fr::one().to_buffer(), Acir::Witness{ .value = witness_index }) },
93 .q_c = bb::fr::zero().to_buffer(),
94 };
95}
96
101{
102 return Acir::MemOp{
104 .index = witness_to_expression(mem_op.index),
105 .value = witness_to_expression(mem_op.value),
106 };
107}
108
113{
114 switch (type) {
115 case BlockType::ROM:
116 case BlockType::RAM:
117 // ROM and RAM both map to Memory in ACIR
119 case BlockType::CallData: {
120 uint32_t id = static_cast<uint32_t>(calldata_id);
122 }
125 default:
126 throw_or_abort("Unknown BlockType");
127 }
128}
129
141inline std::vector<Acir::Opcode> block_constraint_to_acir_opcodes(const BlockConstraint& constraint,
142 uint32_t block_id = 0)
143{
144 std::vector<Acir::Opcode> opcodes;
145
146 // Create the MemoryInit opcode
147 std::vector<Acir::Witness> init_witnesses;
148 init_witnesses.reserve(constraint.init.size());
149 for (const auto& init_val : constraint.init) {
150 init_witnesses.push_back(Acir::Witness{ .value = init_val });
151 }
152
154 .block_id = Acir::BlockId{ .value = block_id },
155 .init = std::move(init_witnesses),
156 .block_type = block_type_to_acir_block_type(constraint.type, constraint.calldata_id),
157 };
158 opcodes.push_back(Acir::Opcode{ .value = mem_init });
159
160 // Create MemoryOp opcodes for each operation in the trace
161 for (const auto& mem_op : constraint.trace) {
162 Acir::Opcode::MemoryOp acir_mem_op{
163 .block_id = Acir::BlockId{ .value = block_id },
164 .op = mem_op_to_acir_mem_op(mem_op),
165 };
166 opcodes.push_back(Acir::Opcode{ .value = acir_mem_op });
167 }
168
169 return opcodes;
170}
171
176inline void add_terms_to_expression(Acir::Expression& expr, const QuadConstraint& mul_quad)
177{
178 // Add multiplication term if both a and b are not constants
179 if (mul_quad.a != bb::stdlib::IS_CONSTANT && mul_quad.b != bb::stdlib::IS_CONSTANT &&
180 !mul_quad.mul_scaling.is_zero()) {
181 expr.mul_terms.push_back(std::make_tuple(mul_quad.mul_scaling.to_buffer(),
182 Acir::Witness{ .value = mul_quad.a },
183 Acir::Witness{ .value = mul_quad.b }));
184 }
185
186 // Add linear terms for each non-constant witness with non-zero scaling
187 if (mul_quad.a != bb::stdlib::IS_CONSTANT && !mul_quad.a_scaling.is_zero()) {
188 expr.linear_combinations.push_back(
189 std::make_tuple(mul_quad.a_scaling.to_buffer(), Acir::Witness{ .value = mul_quad.a }));
190 }
191 if (mul_quad.b != bb::stdlib::IS_CONSTANT && !mul_quad.b_scaling.is_zero()) {
192 expr.linear_combinations.push_back(
193 std::make_tuple(mul_quad.b_scaling.to_buffer(), Acir::Witness{ .value = mul_quad.b }));
194 }
195 if (mul_quad.c != bb::stdlib::IS_CONSTANT && !mul_quad.c_scaling.is_zero()) {
196 expr.linear_combinations.push_back(
197 std::make_tuple(mul_quad.c_scaling.to_buffer(), Acir::Witness{ .value = mul_quad.c }));
198 }
199 if (mul_quad.d != bb::stdlib::IS_CONSTANT && !mul_quad.d_scaling.is_zero()) {
200 expr.linear_combinations.push_back(
201 std::make_tuple(mul_quad.d_scaling.to_buffer(), Acir::Witness{ .value = mul_quad.d }));
202 }
203}
204
216template <typename ConstraintType> std::vector<Acir::Opcode> constraint_to_acir_opcode(const ConstraintType& constraint)
217{
219 // LogicConstraint maps to either AND or XOR BlackBoxFuncCall
220 if (constraint.is_xor_gate) {
221 return { Acir::Opcode{
225 .rhs = witness_or_constant_to_function_input(constraint.b),
226 .num_bits = constraint.num_bits,
227 .output = Acir::Witness{ .value = constraint.result },
228 } } } } };
229 }
230 return { Acir::Opcode{
234 .rhs = witness_or_constant_to_function_input(constraint.b),
235 .num_bits = constraint.num_bits,
236 .output = Acir::Witness{ .value = constraint.result },
237 } } } } };
239 return { Acir::Opcode{
242 .input = witness_to_function_input(constraint.witness),
243 .num_bits = constraint.num_bits,
244 } } } } };
246 std::vector<Acir::FunctionInput> inputs;
247 for (const auto& input : constraint.inputs) {
249 }
251 for (size_t i = 0; i < 16; ++i) {
252 (*iv)[i] = witness_or_constant_to_function_input(constraint.iv[i]);
253 }
255 for (size_t i = 0; i < 16; ++i) {
256 (*key)[i] = witness_or_constant_to_function_input(constraint.key[i]);
257 }
258 std::vector<Acir::Witness> outputs;
259 for (const auto& out : constraint.outputs) {
260 outputs.push_back(Acir::Witness{ .value = out });
261 }
265 .iv = iv,
266 .key = key,
267 .outputs = std::move(outputs),
268 } } } } };
271 for (size_t i = 0; i < 16; ++i) {
272 (*inputs)[i] = witness_or_constant_to_function_input(constraint.inputs[i]);
273 }
275 for (size_t i = 0; i < 8; ++i) {
276 (*hash_values)[i] = witness_or_constant_to_function_input(constraint.hash_values[i]);
277 }
279 for (size_t i = 0; i < 8; ++i) {
280 (*outputs)[i] = Acir::Witness{ .value = constraint.result[i] };
281 }
284 .inputs = inputs,
285 .hash_values = hash_values,
286 .outputs = outputs,
287 } } } } };
290 for (size_t i = 0; i < 32; ++i) {
291 (*hashed_message)[i] = witness_to_function_input(constraint.hashed_message[i]);
292 }
294 for (size_t i = 0; i < 64; ++i) {
295 (*signature)[i] = witness_to_function_input(constraint.signature[i]);
296 }
298 for (size_t i = 0; i < 32; ++i) {
299 (*public_key_x)[i] = witness_to_function_input(constraint.pub_x_indices[i]);
300 }
302 for (size_t i = 0; i < 32; ++i) {
303 (*public_key_y)[i] = witness_to_function_input(constraint.pub_y_indices[i]);
304 }
305 auto predicate = witness_or_constant_to_function_input(constraint.predicate);
306 if (constraint.type == bb::CurveType::SECP256K1) {
307 return { Acir::Opcode{
310 .public_key_x = public_key_x,
311 .public_key_y = public_key_y,
312 .signature = signature,
313 .hashed_message = hashed_message,
314 .predicate = predicate,
315 .output = Acir::Witness{ .value = constraint.result },
316 } } } } };
317 }
318 return { Acir::Opcode{
321 .public_key_x = public_key_x,
322 .public_key_y = public_key_y,
323 .signature = signature,
324 .hashed_message = hashed_message,
325 .predicate = predicate,
326 .output = Acir::Witness{ .value = constraint.result },
327 } } } } };
329 std::vector<Acir::FunctionInput> inputs;
330 for (const auto& input : constraint.inputs) {
332 }
334 for (size_t i = 0; i < 32; ++i) {
335 (*outputs)[i] = Acir::Witness{ .value = constraint.result[i] };
336 }
340 .outputs = outputs,
341 } } } } };
343 std::vector<Acir::FunctionInput> inputs;
344 for (const auto& input : constraint.inputs) {
346 }
348 for (size_t i = 0; i < 32; ++i) {
349 (*outputs)[i] = Acir::Witness{ .value = constraint.result[i] };
350 }
354 .outputs = outputs,
355 } } } } };
356 } else if constexpr (std::is_same_v<ConstraintType, Keccakf1600>) {
358 for (size_t i = 0; i < 25; ++i) {
359 (*inputs)[i] = witness_or_constant_to_function_input(constraint.state[i]);
360 }
362 for (size_t i = 0; i < 25; ++i) {
363 (*outputs)[i] = Acir::Witness{ .value = constraint.result[i] };
364 }
367 .inputs = inputs,
368 .outputs = outputs,
369 } } } } };
371 std::vector<Acir::FunctionInput> inputs;
372 for (const auto& input : constraint.state) {
374 }
375 std::vector<Acir::Witness> outputs;
376 for (const auto& out : constraint.result) {
377 outputs.push_back(Acir::Witness{ .value = out });
378 }
379 return { Acir::Opcode{
383 .outputs = std::move(outputs),
384 } } } } };
386 std::vector<Acir::FunctionInput> points;
387 for (const auto& pt : constraint.points) {
388 points.push_back(witness_or_constant_to_function_input(pt));
389 }
390 std::vector<Acir::FunctionInput> scalars;
391 for (const auto& sc : constraint.scalars) {
392 scalars.push_back(witness_or_constant_to_function_input(sc));
393 }
395 (*outputs)[0] = Acir::Witness{ .value = constraint.out_point_x };
396 (*outputs)[1] = Acir::Witness{ .value = constraint.out_point_y };
397 (*outputs)[2] = Acir::Witness{ .value = constraint.out_point_is_infinite };
401 .points = std::move(points),
402 .scalars = std::move(scalars),
403 .predicate = witness_or_constant_to_function_input(constraint.predicate),
404 .outputs = outputs,
405 } } } } };
406 } else if constexpr (std::is_same_v<ConstraintType, EcAdd>) {
408 (*input1)[0] = witness_or_constant_to_function_input(constraint.input1_x);
409 (*input1)[1] = witness_or_constant_to_function_input(constraint.input1_y);
410 (*input1)[2] = witness_or_constant_to_function_input(constraint.input1_infinite);
412 (*input2)[0] = witness_or_constant_to_function_input(constraint.input2_x);
413 (*input2)[1] = witness_or_constant_to_function_input(constraint.input2_y);
414 (*input2)[2] = witness_or_constant_to_function_input(constraint.input2_infinite);
416 (*outputs)[0] = Acir::Witness{ .value = constraint.result_x };
417 (*outputs)[1] = Acir::Witness{ .value = constraint.result_y };
418 (*outputs)[2] = Acir::Witness{ .value = constraint.result_infinite };
422 .input1 = input1,
423 .input2 = input2,
424 .predicate = witness_or_constant_to_function_input(constraint.predicate),
425 .outputs = outputs,
426 } } } } };
428 std::vector<Acir::FunctionInput> verification_key;
429 for (const auto& key_idx : constraint.key) {
430 verification_key.push_back(witness_to_function_input(key_idx));
431 }
432 std::vector<Acir::FunctionInput> proof;
433 for (const auto& proof_idx : constraint.proof) {
434 proof.push_back(witness_to_function_input(proof_idx));
435 }
436 std::vector<Acir::FunctionInput> public_inputs;
437 for (const auto& pub_input_idx : constraint.public_inputs) {
438 public_inputs.push_back(witness_to_function_input(pub_input_idx));
439 }
443 .verification_key = std::move(verification_key),
444 .proof = std::move(proof),
445 .public_inputs = std::move(public_inputs),
446 .key_hash = witness_to_function_input(constraint.key_hash),
447 .proof_type = constraint.proof_type,
448 .predicate = witness_or_constant_to_function_input(constraint.predicate),
449 } } } } };
451 return block_constraint_to_acir_opcodes(constraint);
453 // Convert a single mul_quad_ to an AssertZero opcode
454 Acir::Expression expr{
455 .mul_terms = {},
456 .linear_combinations = {},
457 .q_c = constraint.const_scaling.to_buffer(),
458 };
459
460 add_terms_to_expression(expr, constraint);
461
462 return { Acir::Opcode{ .value = Acir::Opcode::AssertZero{ .value = expr } } };
464 // Convert a vector of mul_quad_ (big_quad_constraints) to an AssertZero opcode
465 Acir::Expression expr{
466 .mul_terms = {},
467 .linear_combinations = {},
468 .q_c = constraint[0].const_scaling.to_buffer(),
469 };
470
471 for (const auto& mul_quad : constraint) {
472 add_terms_to_expression(expr, mul_quad);
473 }
474
475 return { Acir::Opcode{ .value = Acir::Opcode::AssertZero{ .value = expr } } };
476 } else {
477 throw_or_abort("Unsupported constraint type");
478 }
479}
480
490inline Acir::Circuit build_acir_circuit(const std::vector<Acir::Opcode>& opcodes)
491{
492 return Acir::Circuit{
493 .function_name = "test_circuit",
494 .opcodes = opcodes,
495 .private_parameters = {},
496 .public_parameters = Acir::PublicInputs{ .value = {} },
497 .return_values = Acir::PublicInputs{ .value = {} },
498 .assert_messages = {},
499 };
500}
501
515template <typename ConstraintType> AcirFormat constraint_to_acir_format(const ConstraintType& constraint)
516{
517 std::vector<Acir::Opcode> opcodes;
518
519 if constexpr (is_std_vector_v<ConstraintType>) {
520 // Handle vector of constraints - collect all opcodes
521 for (const auto& c : constraint) {
522 auto c_opcodes = constraint_to_acir_opcode(c);
523 opcodes.insert(opcodes.end(), c_opcodes.begin(), c_opcodes.end());
524 }
525 } else {
526 // Handle single constraint
527 opcodes = constraint_to_acir_opcode(constraint);
528 }
529
530 Acir::Circuit circuit = build_acir_circuit(opcodes);
531 return circuit_serde_to_acir_format(circuit);
532}
533
545template <typename T>
546concept TestBase = requires {
547 // Required type aliases
548 typename T::Builder;
549 typename T::AcirConstraint;
550 typename T::InvalidWitness;
551 typename T::InvalidWitness::Target;
552
553 // Ensure InvalidWitness::Target is enum
555
556 // Ensure that InvalidWitness::Target has a None value
557 { T::InvalidWitness::Target::None };
558
559 // InvalidWitness must provide static methods for test iteration
560 { T::InvalidWitness::get_all() } -> std::same_as<std::vector<typename T::InvalidWitness::Target>>;
561 { T::InvalidWitness::get_labels() } -> std::same_as<std::vector<std::string>>;
562
563 // Required constraint manipulation methods
564 requires requires(T& instance, typename T::AcirConstraint& constraint, WitnessVector& witness_values) {
569 { T::generate_constraints(constraint, witness_values) } -> std::same_as<void>;
570
575 { T::generate_metadata() } -> std::same_as<ProgramMetadata>;
576 };
577
578 requires requires(T& instance,
579 typename T::AcirConstraint constraint,
580 WitnessVector witness_values,
581 const typename T::InvalidWitness::Target& invalid_witness_target) {
589 {
590 T::invalidate_witness(constraint, witness_values, invalid_witness_target)
592 };
593};
594
595template <TestBase Base_> class TestClass {
596 public:
597 using Base = Base_;
598 using Builder = Base::Builder;
599 using AcirConstraint = Base::AcirConstraint;
600 using InvalidWitness = Base::InvalidWitness;
601 using InvalidWitnessTarget = Base::InvalidWitness::Target;
602
618 WitnessVector& witness_values,
619 const InvalidWitnessTarget& invalid_witness_target)
620 {
621 auto [updated_constraint, updated_witness_values] =
622 Base::invalidate_witness(constraint, witness_values, invalid_witness_target);
623
624 // Use the full ACIR flow: constraint -> Acir::Opcode -> Acir::Circuit -> circuit_serde_to_acir_format
625 AcirFormat constraint_system = constraint_to_acir_format(updated_constraint);
626 AcirProgram program{ constraint_system, updated_witness_values };
627 auto builder = create_circuit<Builder>(program, Base::generate_metadata());
628
629 return { CircuitChecker::check(builder), builder.failed(), builder.err() };
630 }
631
640 template <typename Flavor> static size_t test_vk_independence()
641 {
644
645 size_t num_gates = 0;
646
647 // Generate the constraint system
648 AcirConstraint constraint;
649 WitnessVector witness_values;
650 Base::generate_constraints(constraint, witness_values);
651
652 // Use the full ACIR flow: constraint -> Acir::Opcode -> Acir::Circuit -> circuit_serde_to_acir_format
653 AcirFormat constraint_system = constraint_to_acir_format(constraint);
654
655 // Construct the vks
656 std::shared_ptr<VerificationKey> vk_from_witness;
657 {
658 AcirProgram program{ constraint_system, witness_values };
659 auto builder = create_circuit<Builder>(program, Base::generate_metadata());
660 num_gates = builder.get_num_finalized_gates_inefficient();
661
662 auto prover_instance = std::make_shared<ProverInstance>(builder);
663 vk_from_witness = std::make_shared<VerificationKey>(prover_instance->get_precomputed());
664
665 // Validate the builder
666 EXPECT_TRUE(CircuitChecker::check(builder));
667 EXPECT_FALSE(builder.failed());
668 }
669
670 std::shared_ptr<VerificationKey> vk_from_constraint;
671 {
672 AcirProgram program{ constraint_system, /*witness=*/{} };
673 auto builder = create_circuit<Builder>(program, Base::generate_metadata());
674 auto prover_instance = std::make_shared<ProverInstance>(builder);
675 vk_from_constraint = std::make_shared<VerificationKey>(prover_instance->get_precomputed());
676 }
677
678 EXPECT_EQ(*vk_from_witness, *vk_from_constraint) << "Mismatch in the vks";
679
680 return num_gates;
681 }
682
688 static std::vector<std::string> test_tampering()
689 {
690 std::vector<std::string> error_msgs;
691
692 // Generate the constraint system
693 AcirConstraint constraint;
694 WitnessVector witness_values;
695 Base::generate_constraints(constraint, witness_values);
696
697 for (auto [target, label] : zip_view(InvalidWitness::get_all(), InvalidWitness::get_labels())) {
698 auto [circuit_checker_result, builder_failed, builder_err] =
699 test_constraints(constraint, witness_values, target);
700 error_msgs.emplace_back(builder_err);
701
702 if (target != InvalidWitness::Target::None) {
703 bool circuit_check_failed = !circuit_checker_result;
704 bool assert_eq_error_present = (builder_err.find("assert_eq") != std::string::npos);
705 EXPECT_TRUE(circuit_check_failed || assert_eq_error_present)
706 << "Circuit checker succeeded unexpectedly and no assert_eq failure for invalid witness target " +
707 label;
708 EXPECT_TRUE(builder_failed) << "Builder succeeded for invalid witness target " + label;
709 } else {
710 EXPECT_TRUE(circuit_checker_result)
711 << "Circuit checker failed unexpectedly for invalid witness target " + label;
712 EXPECT_FALSE(builder_failed) << "Builder failed unexpectedly for invalid witness target " + label;
713 }
714 }
715
716 return error_msgs;
717 }
718};
719
720} // namespace acir_format
std::shared_ptr< Napi::ThreadSafeFunction > instance
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:135
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:227
Concept defining the requirements for the Base template parameter of TestClass.
AluTraceBuilder builder
Definition alu.test.cpp:124
AvmProvingInputs inputs
ProverInstance_< UltraKeccakFlavor > ProverInstance
AcirFormat circuit_serde_to_acir_format(Acir::Circuit const &circuit)
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.
std::vector< bb::fr > WitnessVector
Acir::Expression access_type_to_expression(AccessType access_type)
Convert an AccessType to an Acir::Expression representing the operation type.
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.
Acir::Expression witness_to_expression(uint32_t witness_index)
Convert a witness index to an Acir::Expression representing a single unscaled witness term.
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.
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< uint8_t > to_buffer(T const &value)
std::vector< Acir::FunctionInput > inputs
Definition acir.hpp:2928
Acir::FunctionInput lhs
Definition acir.hpp:2966
std::vector< Acir::FunctionInput > inputs
Definition acir.hpp:3072
std::vector< Acir::FunctionInput > inputs
Definition acir.hpp:3102
std::shared_ptr< std::array< Acir::FunctionInput, 32 > > public_key_x
Definition acir.hpp:3132
std::shared_ptr< std::array< Acir::FunctionInput, 32 > > public_key_x
Definition acir.hpp:3178
std::shared_ptr< std::array< Acir::FunctionInput, 3 > > input1
Definition acir.hpp:3262
std::shared_ptr< std::array< Acir::FunctionInput, 25 > > inputs
Definition acir.hpp:3300
std::vector< Acir::FunctionInput > points
Definition acir.hpp:3224
std::vector< Acir::FunctionInput > inputs
Definition acir.hpp:3376
Acir::FunctionInput input
Definition acir.hpp:3042
std::vector< Acir::FunctionInput > verification_key
Definition acir.hpp:3330
std::shared_ptr< std::array< Acir::FunctionInput, 16 > > inputs
Definition acir.hpp:3406
Acir::FunctionInput lhs
Definition acir.hpp:3004
std::variant< AES128Encrypt, AND, XOR, RANGE, Blake2s, Blake3, EcdsaSecp256k1, EcdsaSecp256r1, MultiScalarMul, EmbeddedCurveAdd, Keccakf1600, RecursiveAggregation, Poseidon2Permutation, Sha256Compression > value
Definition acir.hpp:3453
uint32_t value
Definition acir.hpp:3704
std::variant< Memory, CallData, ReturnData > value
Definition acir.hpp:3755
std::string function_name
Definition acir.hpp:4794
std::vector< std::tuple< std::vector< uint8_t >, Acir::Witness > > linear_combinations
Definition acir.hpp:3839
std::vector< std::tuple< std::vector< uint8_t >, Acir::Witness, Acir::Witness > > mul_terms
Definition acir.hpp:3838
std::vector< uint8_t > value
Definition acir.hpp:2808
std::variant< Constant, Witness > value
Definition acir.hpp:2843
Acir::Expression operation
Definition acir.hpp:4144
Acir::Expression value
Definition acir.hpp:4180
Acir::BlackBoxFuncCall value
Definition acir.hpp:4198
Acir::BlockId block_id
Definition acir.hpp:4246
Acir::BlockId block_id
Definition acir.hpp:4216
std::variant< AssertZero, BlackBoxFuncCall, MemoryOp, MemoryInit, BrilligCall, Call > value
Definition acir.hpp:4355
std::vector< Acir::Witness > value
Definition acir.hpp:4776
uint32_t value
Definition acir.hpp:2788
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)