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
89{
90 return Acir::MemOp{
94 };
95}
96
101{
102 switch (type) {
103 case BlockType::ROM:
104 case BlockType::RAM:
105 // ROM and RAM both map to Memory in ACIR
107 case BlockType::CallData: {
108 uint32_t id = (calldata_id == CallDataType::Primary) ? 0 : 1;
110 }
113 default:
114 throw_or_abort("Unknown BlockType");
115 }
116}
117
129inline std::vector<Acir::Opcode> block_constraint_to_acir_opcodes(const BlockConstraint& constraint,
130 uint32_t block_id = 0)
131{
132 std::vector<Acir::Opcode> opcodes;
133
134 // Create the MemoryInit opcode
135 std::vector<Acir::Witness> init_witnesses;
136 init_witnesses.reserve(constraint.init.size());
137 for (const auto& init_val : constraint.init) {
138 init_witnesses.push_back(Acir::Witness{ .value = init_val });
139 }
140
142 .block_id = Acir::BlockId{ .value = block_id },
143 .init = std::move(init_witnesses),
144 .block_type = block_type_to_acir_block_type(constraint.type, constraint.calldata_id),
145 };
146 opcodes.push_back(Acir::Opcode{ .value = mem_init });
147
148 // Create MemoryOp opcodes for each operation in the trace
149 for (const auto& mem_op : constraint.trace) {
150 Acir::Opcode::MemoryOp acir_mem_op{
151 .block_id = Acir::BlockId{ .value = block_id },
152 .op = mem_op_to_acir_mem_op(mem_op),
153 };
154 opcodes.push_back(Acir::Opcode{ .value = acir_mem_op });
155 }
156
157 return opcodes;
158}
159
164inline void add_terms_to_expression(Acir::Expression& expr, const QuadConstraint& mul_quad)
165{
166 // Add multiplication term if both a and b are not constants
167 if (mul_quad.a != bb::stdlib::IS_CONSTANT && mul_quad.b != bb::stdlib::IS_CONSTANT &&
168 !mul_quad.mul_scaling.is_zero()) {
169 expr.mul_terms.push_back(std::make_tuple(mul_quad.mul_scaling.to_buffer(),
170 Acir::Witness{ .value = mul_quad.a },
171 Acir::Witness{ .value = mul_quad.b }));
172 }
173
174 // Add linear terms for each non-constant witness with non-zero scaling
175 if (mul_quad.a != bb::stdlib::IS_CONSTANT && !mul_quad.a_scaling.is_zero()) {
176 expr.linear_combinations.push_back(
177 std::make_tuple(mul_quad.a_scaling.to_buffer(), Acir::Witness{ .value = mul_quad.a }));
178 }
179 if (mul_quad.b != bb::stdlib::IS_CONSTANT && !mul_quad.b_scaling.is_zero()) {
180 expr.linear_combinations.push_back(
181 std::make_tuple(mul_quad.b_scaling.to_buffer(), Acir::Witness{ .value = mul_quad.b }));
182 }
183 if (mul_quad.c != bb::stdlib::IS_CONSTANT && !mul_quad.c_scaling.is_zero()) {
184 expr.linear_combinations.push_back(
185 std::make_tuple(mul_quad.c_scaling.to_buffer(), Acir::Witness{ .value = mul_quad.c }));
186 }
187 if (mul_quad.d != bb::stdlib::IS_CONSTANT && !mul_quad.d_scaling.is_zero()) {
188 expr.linear_combinations.push_back(
189 std::make_tuple(mul_quad.d_scaling.to_buffer(), Acir::Witness{ .value = mul_quad.d }));
190 }
191}
192
204template <typename ConstraintType> std::vector<Acir::Opcode> constraint_to_acir_opcode(const ConstraintType& constraint)
205{
207 // LogicConstraint maps to either AND or XOR BlackBoxFuncCall
208 if (constraint.is_xor_gate) {
209 return { Acir::Opcode{
213 .rhs = witness_or_constant_to_function_input(constraint.b),
214 .num_bits = constraint.num_bits,
215 .output = Acir::Witness{ .value = constraint.result },
216 } } } } };
217 }
218 return { Acir::Opcode{
222 .rhs = witness_or_constant_to_function_input(constraint.b),
223 .num_bits = constraint.num_bits,
224 .output = Acir::Witness{ .value = constraint.result },
225 } } } } };
227 return { Acir::Opcode{
230 .input = witness_to_function_input(constraint.witness),
231 .num_bits = constraint.num_bits,
232 } } } } };
234 std::vector<Acir::FunctionInput> inputs;
235 for (const auto& input : constraint.inputs) {
237 }
239 for (size_t i = 0; i < 16; ++i) {
240 (*iv)[i] = witness_or_constant_to_function_input(constraint.iv[i]);
241 }
243 for (size_t i = 0; i < 16; ++i) {
244 (*key)[i] = witness_or_constant_to_function_input(constraint.key[i]);
245 }
246 std::vector<Acir::Witness> outputs;
247 for (const auto& out : constraint.outputs) {
248 outputs.push_back(Acir::Witness{ .value = out });
249 }
253 .iv = iv,
254 .key = key,
255 .outputs = std::move(outputs),
256 } } } } };
259 for (size_t i = 0; i < 16; ++i) {
260 (*inputs)[i] = witness_or_constant_to_function_input(constraint.inputs[i]);
261 }
263 for (size_t i = 0; i < 8; ++i) {
264 (*hash_values)[i] = witness_or_constant_to_function_input(constraint.hash_values[i]);
265 }
267 for (size_t i = 0; i < 8; ++i) {
268 (*outputs)[i] = Acir::Witness{ .value = constraint.result[i] };
269 }
272 .inputs = inputs,
273 .hash_values = hash_values,
274 .outputs = outputs,
275 } } } } };
278 for (size_t i = 0; i < 32; ++i) {
279 (*hashed_message)[i] = witness_to_function_input(constraint.hashed_message[i]);
280 }
282 for (size_t i = 0; i < 64; ++i) {
283 (*signature)[i] = witness_to_function_input(constraint.signature[i]);
284 }
286 for (size_t i = 0; i < 32; ++i) {
287 (*public_key_x)[i] = witness_to_function_input(constraint.pub_x_indices[i]);
288 }
290 for (size_t i = 0; i < 32; ++i) {
291 (*public_key_y)[i] = witness_to_function_input(constraint.pub_y_indices[i]);
292 }
293 auto predicate = witness_or_constant_to_function_input(constraint.predicate);
294 if (constraint.type == bb::CurveType::SECP256K1) {
295 return { Acir::Opcode{
298 .public_key_x = public_key_x,
299 .public_key_y = public_key_y,
300 .signature = signature,
301 .hashed_message = hashed_message,
302 .predicate = predicate,
303 .output = Acir::Witness{ .value = constraint.result },
304 } } } } };
305 }
306 return { Acir::Opcode{
309 .public_key_x = public_key_x,
310 .public_key_y = public_key_y,
311 .signature = signature,
312 .hashed_message = hashed_message,
313 .predicate = predicate,
314 .output = Acir::Witness{ .value = constraint.result },
315 } } } } };
317 std::vector<Acir::FunctionInput> inputs;
318 for (const auto& input : constraint.inputs) {
319 inputs.push_back(witness_or_constant_to_function_input(input.blackbox_input));
320 }
322 for (size_t i = 0; i < 32; ++i) {
323 (*outputs)[i] = Acir::Witness{ .value = constraint.result[i] };
324 }
328 .outputs = outputs,
329 } } } } };
331 std::vector<Acir::FunctionInput> inputs;
332 for (const auto& input : constraint.inputs) {
333 inputs.push_back(witness_or_constant_to_function_input(input.blackbox_input));
334 }
336 for (size_t i = 0; i < 32; ++i) {
337 (*outputs)[i] = Acir::Witness{ .value = constraint.result[i] };
338 }
342 .outputs = outputs,
343 } } } } };
344 } else if constexpr (std::is_same_v<ConstraintType, Keccakf1600>) {
346 for (size_t i = 0; i < 25; ++i) {
347 (*inputs)[i] = witness_or_constant_to_function_input(constraint.state[i]);
348 }
350 for (size_t i = 0; i < 25; ++i) {
351 (*outputs)[i] = Acir::Witness{ .value = constraint.result[i] };
352 }
355 .inputs = inputs,
356 .outputs = outputs,
357 } } } } };
359 std::vector<Acir::FunctionInput> inputs;
360 for (const auto& input : constraint.state) {
362 }
363 std::vector<Acir::Witness> outputs;
364 for (const auto& out : constraint.result) {
365 outputs.push_back(Acir::Witness{ .value = out });
366 }
367 return { Acir::Opcode{
371 .outputs = std::move(outputs),
372 } } } } };
374 std::vector<Acir::FunctionInput> points;
375 for (const auto& pt : constraint.points) {
376 points.push_back(witness_or_constant_to_function_input(pt));
377 }
378 std::vector<Acir::FunctionInput> scalars;
379 for (const auto& sc : constraint.scalars) {
380 scalars.push_back(witness_or_constant_to_function_input(sc));
381 }
383 (*outputs)[0] = Acir::Witness{ .value = constraint.out_point_x };
384 (*outputs)[1] = Acir::Witness{ .value = constraint.out_point_y };
385 (*outputs)[2] = Acir::Witness{ .value = constraint.out_point_is_infinite };
389 .points = std::move(points),
390 .scalars = std::move(scalars),
391 .predicate = witness_or_constant_to_function_input(constraint.predicate),
392 .outputs = outputs,
393 } } } } };
394 } else if constexpr (std::is_same_v<ConstraintType, EcAdd>) {
396 (*input1)[0] = witness_or_constant_to_function_input(constraint.input1_x);
397 (*input1)[1] = witness_or_constant_to_function_input(constraint.input1_y);
398 (*input1)[2] = witness_or_constant_to_function_input(constraint.input1_infinite);
400 (*input2)[0] = witness_or_constant_to_function_input(constraint.input2_x);
401 (*input2)[1] = witness_or_constant_to_function_input(constraint.input2_y);
402 (*input2)[2] = witness_or_constant_to_function_input(constraint.input2_infinite);
404 (*outputs)[0] = Acir::Witness{ .value = constraint.result_x };
405 (*outputs)[1] = Acir::Witness{ .value = constraint.result_y };
406 (*outputs)[2] = Acir::Witness{ .value = constraint.result_infinite };
410 .input1 = input1,
411 .input2 = input2,
412 .predicate = witness_or_constant_to_function_input(constraint.predicate),
413 .outputs = outputs,
414 } } } } };
416 std::vector<Acir::FunctionInput> verification_key;
417 for (const auto& key_idx : constraint.key) {
418 verification_key.push_back(witness_to_function_input(key_idx));
419 }
420 std::vector<Acir::FunctionInput> proof;
421 for (const auto& proof_idx : constraint.proof) {
422 proof.push_back(witness_to_function_input(proof_idx));
423 }
424 std::vector<Acir::FunctionInput> public_inputs;
425 for (const auto& pub_input_idx : constraint.public_inputs) {
426 public_inputs.push_back(witness_to_function_input(pub_input_idx));
427 }
431 .verification_key = std::move(verification_key),
432 .proof = std::move(proof),
433 .public_inputs = std::move(public_inputs),
434 .key_hash = witness_to_function_input(constraint.key_hash),
435 .proof_type = constraint.proof_type,
436 .predicate = witness_or_constant_to_function_input(constraint.predicate),
437 } } } } };
439 return block_constraint_to_acir_opcodes(constraint);
441 // Convert a single mul_quad_ to an AssertZero opcode
442 Acir::Expression expr{
443 .mul_terms = {},
444 .linear_combinations = {},
445 .q_c = constraint.const_scaling.to_buffer(),
446 };
447
448 add_terms_to_expression(expr, constraint);
449
450 return { Acir::Opcode{ .value = Acir::Opcode::AssertZero{ .value = expr } } };
452 // Convert a vector of mul_quad_ (big_quad_constraints) to an AssertZero opcode
453 Acir::Expression expr{
454 .mul_terms = {},
455 .linear_combinations = {},
456 .q_c = constraint[0].const_scaling.to_buffer(),
457 };
458
459 for (const auto& mul_quad : constraint) {
460 add_terms_to_expression(expr, mul_quad);
461 }
462
463 return { Acir::Opcode{ .value = Acir::Opcode::AssertZero{ .value = expr } } };
464 } else {
465 throw_or_abort("Unsupported constraint type");
466 }
467}
468
478inline Acir::Circuit build_acir_circuit(const std::vector<Acir::Opcode>& opcodes, uint32_t max_witness_index)
479{
480 return Acir::Circuit{
481 .function_name = "test_circuit",
482 .current_witness_index = max_witness_index,
483 .opcodes = opcodes,
484 .private_parameters = {},
485 .public_parameters = Acir::PublicInputs{ .value = {} },
486 .return_values = Acir::PublicInputs{ .value = {} },
487 .assert_messages = {},
488 };
489}
490
505template <typename ConstraintType>
506AcirFormat constraint_to_acir_format(const ConstraintType& constraint, uint32_t varnum)
507{
508 std::vector<Acir::Opcode> opcodes;
509
510 if constexpr (is_std_vector_v<ConstraintType>) {
511 // Handle vector of constraints - collect all opcodes
512 for (const auto& c : constraint) {
513 auto c_opcodes = constraint_to_acir_opcode(c);
514 opcodes.insert(opcodes.end(), c_opcodes.begin(), c_opcodes.end());
515 }
516 } else {
517 // Handle single constraint
518 opcodes = constraint_to_acir_opcode(constraint);
519 }
520
521 Acir::Circuit circuit = build_acir_circuit(opcodes, varnum);
522 return circuit_serde_to_acir_format(circuit);
523}
524
536template <typename T>
537concept TestBase = requires {
538 // Required type aliases
539 typename T::Builder;
540 typename T::AcirConstraint;
541 typename T::InvalidWitness;
542 typename T::InvalidWitness::Target;
543
544 // Ensure InvalidWitness::Target is enum
546
547 // Ensure that InvalidWitness::Target has a None value
548 { T::InvalidWitness::Target::None };
549
550 // InvalidWitness must provide static methods for test iteration
551 { T::InvalidWitness::get_all() } -> std::same_as<std::vector<typename T::InvalidWitness::Target>>;
552 { T::InvalidWitness::get_labels() } -> std::same_as<std::vector<std::string>>;
553
554 // Required constraint manipulation methods
555 requires requires(T& instance, typename T::AcirConstraint& constraint, WitnessVector& witness_values) {
560 { T::generate_constraints(constraint, witness_values) } -> std::same_as<void>;
561
566 { T::generate_metadata() } -> std::same_as<ProgramMetadata>;
567 };
568
569 requires requires(T& instance,
570 typename T::AcirConstraint constraint,
571 WitnessVector witness_values,
572 const typename T::InvalidWitness::Target& invalid_witness_target) {
580 {
581 T::invalidate_witness(constraint, witness_values, invalid_witness_target)
583 };
584};
585
586template <TestBase Base_> class TestClass {
587 public:
588 using Base = Base_;
589 using Builder = Base::Builder;
590 using AcirConstraint = Base::AcirConstraint;
591 using InvalidWitness = Base::InvalidWitness;
592 using InvalidWitnessTarget = Base::InvalidWitness::Target;
593
609 WitnessVector& witness_values,
610 const InvalidWitnessTarget& invalid_witness_target)
611 {
612 auto [updated_constraint, updated_witness_values] =
613 Base::invalidate_witness(constraint, witness_values, invalid_witness_target);
614
615 // Use the full ACIR flow: constraint -> Acir::Opcode -> Acir::Circuit -> circuit_serde_to_acir_format
616 AcirFormat constraint_system = constraint_to_acir_format(
617 updated_constraint, /*max_witness_index=*/static_cast<uint32_t>(updated_witness_values.size()) - 1);
618 AcirProgram program{ constraint_system, updated_witness_values };
619 auto builder = create_circuit<Builder>(program, Base::generate_metadata());
620
621 return { CircuitChecker::check(builder), builder.failed(), builder.err() };
622 }
623
632 template <typename Flavor> static size_t test_vk_independence()
633 {
636
637 size_t num_gates = 0;
638
639 // Generate the constraint system
640 AcirConstraint constraint;
641 WitnessVector witness_values;
642 Base::generate_constraints(constraint, witness_values);
643
644 // Use the full ACIR flow: constraint -> Acir::Opcode -> Acir::Circuit -> circuit_serde_to_acir_format
645 AcirFormat constraint_system = constraint_to_acir_format(
646 constraint, /*max_witness_index=*/static_cast<uint32_t>(witness_values.size()) - 1);
647
648 // Construct the vks
649 std::shared_ptr<VerificationKey> vk_from_witness;
650 {
651 AcirProgram program{ constraint_system, witness_values };
652 auto builder = create_circuit<Builder>(program, Base::generate_metadata());
653 num_gates = builder.get_num_finalized_gates_inefficient();
654
655 auto prover_instance = std::make_shared<ProverInstance>(builder);
656 vk_from_witness = std::make_shared<VerificationKey>(prover_instance->get_precomputed());
657
658 // Validate the builder
659 EXPECT_TRUE(CircuitChecker::check(builder));
660 EXPECT_FALSE(builder.failed());
661 }
662
663 std::shared_ptr<VerificationKey> vk_from_constraint;
664 {
665 AcirProgram program{ constraint_system, /*witness=*/{} };
666 auto builder = create_circuit<Builder>(program, Base::generate_metadata());
667 auto prover_instance = std::make_shared<ProverInstance>(builder);
668 vk_from_constraint = std::make_shared<VerificationKey>(prover_instance->get_precomputed());
669 }
670
671 EXPECT_EQ(*vk_from_witness, *vk_from_constraint) << "Mismatch in the vks";
672
673 return num_gates;
674 }
675
681 static std::vector<std::string> test_tampering()
682 {
683 std::vector<std::string> error_msgs;
684
685 // Generate the constraint system
686 AcirConstraint constraint;
687 WitnessVector witness_values;
688 Base::generate_constraints(constraint, witness_values);
689
690 for (auto [target, label] : zip_view(InvalidWitness::get_all(), InvalidWitness::get_labels())) {
691 auto [circuit_checker_result, builder_failed, builder_err] =
692 test_constraints(constraint, witness_values, target);
693 error_msgs.emplace_back(builder_err);
694
695 if (target != InvalidWitness::Target::None) {
696 bool circuit_check_failed = !circuit_checker_result;
697 bool assert_eq_error_present = (builder_err.find("assert_eq") != std::string::npos);
698 EXPECT_TRUE(circuit_check_failed || assert_eq_error_present)
699 << "Circuit checker succeeded unexpectedly and no assert_eq failure for invalid witness target " +
700 label;
701 EXPECT_TRUE(builder_failed) << "Builder succeeded for invalid witness target " + label;
702 } else {
703 EXPECT_TRUE(circuit_checker_result)
704 << "Circuit checker failed unexpectedly for invalid witness target " + label;
705 EXPECT_FALSE(builder_failed) << "Builder failed unexpectedly for invalid witness target " + label;
706 }
707 }
708
709 return error_msgs;
710 }
711};
712
713} // 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.
The verification key is responsible for storing the commitments to the precomputed (non-witnessk) pol...
Base Native verification key class.
Definition flavor.hpp:141
A ProverInstance is normally constructed from a finalized circuit and it contains all the information...
static bool check(const Builder &circuit)
Check the witness satisifies the circuit.
Concept defining the requirements for the Base template parameter of TestClass.
AluTraceBuilder builder
Definition alu.test.cpp:124
AvmProvingInputs inputs
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.
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.
AcirFormat constraint_to_acir_format(const ConstraintType &constraint, uint32_t varnum)
Convert an AcirConstraint (single or vector) to AcirFormat by going through the full ACIR serde flow.
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, uint32_t max_witness_index)
Build an Acir::Circuit from opcodes and witness count.
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:3049
Acir::FunctionInput lhs
Definition acir.hpp:3089
std::vector< Acir::FunctionInput > inputs
Definition acir.hpp:3201
std::vector< Acir::FunctionInput > inputs
Definition acir.hpp:3233
std::shared_ptr< std::array< Acir::FunctionInput, 32 > > public_key_x
Definition acir.hpp:3265
std::shared_ptr< std::array< Acir::FunctionInput, 32 > > public_key_x
Definition acir.hpp:3313
std::shared_ptr< std::array< Acir::FunctionInput, 3 > > input1
Definition acir.hpp:3401
std::shared_ptr< std::array< Acir::FunctionInput, 25 > > inputs
Definition acir.hpp:3441
std::vector< Acir::FunctionInput > points
Definition acir.hpp:3361
std::vector< Acir::FunctionInput > inputs
Definition acir.hpp:3521
Acir::FunctionInput input
Definition acir.hpp:3169
std::vector< Acir::FunctionInput > verification_key
Definition acir.hpp:3473
std::shared_ptr< std::array< Acir::FunctionInput, 16 > > inputs
Definition acir.hpp:3553
Acir::FunctionInput lhs
Definition acir.hpp:3129
std::variant< AES128Encrypt, AND, XOR, RANGE, Blake2s, Blake3, EcdsaSecp256k1, EcdsaSecp256r1, MultiScalarMul, EmbeddedCurveAdd, Keccakf1600, RecursiveAggregation, Poseidon2Permutation, Sha256Compression > value
Definition acir.hpp:3602
uint32_t value
Definition acir.hpp:3855
std::variant< Memory, CallData, ReturnData > value
Definition acir.hpp:3914
std::string function_name
Definition acir.hpp:5003
std::vector< std::tuple< std::vector< uint8_t >, Acir::Witness > > linear_combinations
Definition acir.hpp:4000
std::vector< std::tuple< std::vector< uint8_t >, Acir::Witness, Acir::Witness > > mul_terms
Definition acir.hpp:3999
std::vector< uint8_t > value
Definition acir.hpp:2923
std::variant< Constant, Witness > value
Definition acir.hpp:2962
Acir::Expression operation
Definition acir.hpp:4321
Acir::Expression value
Definition acir.hpp:4359
Acir::BlackBoxFuncCall value
Definition acir.hpp:4379
Acir::BlockId block_id
Definition acir.hpp:4431
Acir::BlockId block_id
Definition acir.hpp:4399
std::variant< AssertZero, BlackBoxFuncCall, MemoryOp, MemoryInit, BrilligCall, Call > value
Definition acir.hpp:4546
std::vector< Acir::Witness > value
Definition acir.hpp:4983
uint32_t value
Definition acir.hpp:2901
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 and value store the index of the memory location, and value is the value to b...
WitnessOrConstant< bb::fr > index
WitnessOrConstant< bb::fr > value
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)