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
35
39inline Acir::FunctionInput witness_to_function_input(uint32_t witness_index)
40{
41 return Acir::FunctionInput{ .value =
42 Acir::FunctionInput::Witness{ .value = Acir::Witness{ .value = witness_index } } };
43}
44
52{
54 .mul_terms = {},
55 .linear_combinations = {},
56 .q_c = bb::fr::zero().to_buffer(),
57 };
58
59 if (input.is_constant) {
60 expr.q_c = input.value.to_buffer();
61 } else {
62 // Linear term with coefficient 1
63 expr.linear_combinations.push_back(
64 std::make_tuple(bb::fr::one().to_buffer(), Acir::Witness{ .value = input.index }));
65 }
66
67 return expr;
68}
69
74{
75 return Acir::MemOp{
76 // Acir::MemOp::read is the serialized MemOpKind bool: false = Read, true = Write.
77 .read = (mem_op.access_type == AccessType::Write),
78 .index = Acir::Witness{ .value = mem_op.index },
79 .value = Acir::Witness{ .value = mem_op.value },
80 };
81}
82
87{
88 switch (type) {
89 case BlockType::ROM:
90 case BlockType::RAM:
91 // ROM and RAM both map to Memory in ACIR
94 uint32_t id = static_cast<uint32_t>(calldata_id);
96 }
99 default:
100 throw_or_abort("Unknown BlockType");
101 }
102}
103
115inline std::vector<Acir::Opcode> block_constraint_to_acir_opcodes(const BlockConstraint& constraint,
116 uint32_t block_id = 0)
117{
118 std::vector<Acir::Opcode> opcodes;
119
120 // Create the MemoryInit opcode
121 std::vector<Acir::Witness> init_witnesses;
122 init_witnesses.reserve(constraint.init.size());
123 for (const auto& init_val : constraint.init) {
124 init_witnesses.push_back(Acir::Witness{ .value = init_val });
125 }
126
128 .block_id = Acir::BlockId{ .value = block_id },
129 .init = std::move(init_witnesses),
130 .block_type = block_type_to_acir_block_type(constraint.type, constraint.calldata_id),
131 };
132 opcodes.push_back(Acir::Opcode{ .value = mem_init });
133
134 // Create MemoryOp opcodes for each operation in the trace
135 for (const auto& mem_op : constraint.trace) {
136 Acir::Opcode::MemoryOp acir_mem_op{
137 .block_id = Acir::BlockId{ .value = block_id },
138 .op = mem_op_to_acir_mem_op(mem_op),
139 };
140 opcodes.push_back(Acir::Opcode{ .value = acir_mem_op });
141 }
142
143 return opcodes;
144}
145
150inline void add_terms_to_expression(Acir::Expression& expr, const QuadConstraint& mul_quad)
151{
152 // Add multiplication term if both a and b are not constants
153 if (mul_quad.a != bb::stdlib::IS_CONSTANT && mul_quad.b != bb::stdlib::IS_CONSTANT &&
154 !mul_quad.mul_scaling.is_zero()) {
155 expr.mul_terms.push_back(std::make_tuple(mul_quad.mul_scaling.to_buffer(),
156 Acir::Witness{ .value = mul_quad.a },
157 Acir::Witness{ .value = mul_quad.b }));
158 }
159
160 // Add linear terms for each non-constant witness with non-zero scaling
161 if (mul_quad.a != bb::stdlib::IS_CONSTANT && !mul_quad.a_scaling.is_zero()) {
162 expr.linear_combinations.push_back(
163 std::make_tuple(mul_quad.a_scaling.to_buffer(), Acir::Witness{ .value = mul_quad.a }));
164 }
165 if (mul_quad.b != bb::stdlib::IS_CONSTANT && !mul_quad.b_scaling.is_zero()) {
166 expr.linear_combinations.push_back(
167 std::make_tuple(mul_quad.b_scaling.to_buffer(), Acir::Witness{ .value = mul_quad.b }));
168 }
169 if (mul_quad.c != bb::stdlib::IS_CONSTANT && !mul_quad.c_scaling.is_zero()) {
170 expr.linear_combinations.push_back(
171 std::make_tuple(mul_quad.c_scaling.to_buffer(), Acir::Witness{ .value = mul_quad.c }));
172 }
173 if (mul_quad.d != bb::stdlib::IS_CONSTANT && !mul_quad.d_scaling.is_zero()) {
174 expr.linear_combinations.push_back(
175 std::make_tuple(mul_quad.d_scaling.to_buffer(), Acir::Witness{ .value = mul_quad.d }));
176 }
177}
178
190template <typename ConstraintType> std::vector<Acir::Opcode> constraint_to_acir_opcode(const ConstraintType& constraint)
191{
193 // LogicConstraint maps to either AND or XOR BlackBoxFuncCall
194 if (constraint.is_xor_gate) {
195 return { Acir::Opcode{
199 .rhs = witness_or_constant_to_function_input(constraint.b),
200 .num_bits = constraint.num_bits,
201 .output = Acir::Witness{ .value = constraint.result },
202 } } } } };
203 }
204 return { Acir::Opcode{
208 .rhs = witness_or_constant_to_function_input(constraint.b),
209 .num_bits = constraint.num_bits,
210 .output = Acir::Witness{ .value = constraint.result },
211 } } } } };
213 return { Acir::Opcode{
216 .input = witness_to_function_input(constraint.witness),
217 .num_bits = constraint.num_bits,
218 } } } } };
220 std::vector<Acir::FunctionInput> inputs;
221 for (const auto& input : constraint.inputs) {
223 }
225 for (size_t i = 0; i < 16; ++i) {
226 (*iv)[i] = witness_or_constant_to_function_input(constraint.iv[i]);
227 }
229 for (size_t i = 0; i < 16; ++i) {
230 (*key)[i] = witness_or_constant_to_function_input(constraint.key[i]);
231 }
232 std::vector<Acir::Witness> outputs;
233 for (const auto& out : constraint.outputs) {
234 outputs.push_back(Acir::Witness{ .value = out });
235 }
239 .iv = iv,
240 .key = key,
241 .outputs = std::move(outputs),
242 } } } } };
245 for (size_t i = 0; i < 16; ++i) {
246 (*inputs)[i] = witness_or_constant_to_function_input(constraint.inputs[i]);
247 }
249 for (size_t i = 0; i < 8; ++i) {
250 (*hash_values)[i] = witness_or_constant_to_function_input(constraint.hash_values[i]);
251 }
253 for (size_t i = 0; i < 8; ++i) {
254 (*outputs)[i] = Acir::Witness{ .value = constraint.result[i] };
255 }
258 .inputs = inputs,
259 .hash_values = hash_values,
260 .outputs = outputs,
261 } } } } };
264 for (size_t i = 0; i < 32; ++i) {
265 (*hashed_message)[i] = witness_to_function_input(constraint.hashed_message[i]);
266 }
268 for (size_t i = 0; i < 64; ++i) {
269 (*signature)[i] = witness_to_function_input(constraint.signature[i]);
270 }
272 for (size_t i = 0; i < 32; ++i) {
273 (*public_key_x)[i] = witness_to_function_input(constraint.pub_x_indices[i]);
274 }
276 for (size_t i = 0; i < 32; ++i) {
277 (*public_key_y)[i] = witness_to_function_input(constraint.pub_y_indices[i]);
278 }
279 auto predicate = witness_or_constant_to_function_input(constraint.predicate);
280 if (constraint.type == bb::CurveType::SECP256K1) {
281 return { Acir::Opcode{
284 .public_key_x = public_key_x,
285 .public_key_y = public_key_y,
286 .signature = signature,
287 .hashed_message = hashed_message,
288 .predicate = predicate,
289 .output = Acir::Witness{ .value = constraint.result },
290 } } } } };
291 }
292 return { Acir::Opcode{
295 .public_key_x = public_key_x,
296 .public_key_y = public_key_y,
297 .signature = signature,
298 .hashed_message = hashed_message,
299 .predicate = predicate,
300 .output = Acir::Witness{ .value = constraint.result },
301 } } } } };
303 std::vector<Acir::FunctionInput> inputs;
304 for (const auto& input : constraint.inputs) {
306 }
308 for (size_t i = 0; i < 32; ++i) {
309 (*outputs)[i] = Acir::Witness{ .value = constraint.result[i] };
310 }
314 .outputs = outputs,
315 } } } } };
317 std::vector<Acir::FunctionInput> inputs;
318 for (const auto& input : constraint.inputs) {
320 }
322 for (size_t i = 0; i < 32; ++i) {
323 (*outputs)[i] = Acir::Witness{ .value = constraint.result[i] };
324 }
328 .outputs = outputs,
329 } } } } };
330 } else if constexpr (std::is_same_v<ConstraintType, Keccakf1600>) {
332 for (size_t i = 0; i < 25; ++i) {
333 (*inputs)[i] = witness_or_constant_to_function_input(constraint.state[i]);
334 }
336 for (size_t i = 0; i < 25; ++i) {
337 (*outputs)[i] = Acir::Witness{ .value = constraint.result[i] };
338 }
341 .inputs = inputs,
342 .outputs = outputs,
343 } } } } };
345 std::vector<Acir::FunctionInput> inputs;
346 for (const auto& input : constraint.state) {
348 }
349 std::vector<Acir::Witness> outputs;
350 for (const auto& out : constraint.result) {
351 outputs.push_back(Acir::Witness{ .value = out });
352 }
353 return { Acir::Opcode{
357 .outputs = std::move(outputs),
358 } } } } };
360 std::vector<Acir::FunctionInput> points;
361 for (const auto& pt : constraint.points) {
362 points.push_back(witness_or_constant_to_function_input(pt));
363 }
364 std::vector<Acir::FunctionInput> scalars;
365 for (const auto& sc : constraint.scalars) {
366 scalars.push_back(witness_or_constant_to_function_input(sc));
367 }
369 (*outputs)[0] = Acir::Witness{ .value = constraint.out_point_x };
370 (*outputs)[1] = Acir::Witness{ .value = constraint.out_point_y };
374 .points = std::move(points),
375 .scalars = std::move(scalars),
376 .predicate = witness_or_constant_to_function_input(constraint.predicate),
377 .outputs = outputs,
378 } } } } };
379 } else if constexpr (std::is_same_v<ConstraintType, EcAdd>) {
381 (*input1)[0] = witness_or_constant_to_function_input(constraint.input1_x);
382 (*input1)[1] = witness_or_constant_to_function_input(constraint.input1_y);
384 (*input2)[0] = witness_or_constant_to_function_input(constraint.input2_x);
385 (*input2)[1] = witness_or_constant_to_function_input(constraint.input2_y);
387 (*outputs)[0] = Acir::Witness{ .value = constraint.result_x };
388 (*outputs)[1] = Acir::Witness{ .value = constraint.result_y };
392 .input1 = input1,
393 .input2 = input2,
394 .predicate = witness_or_constant_to_function_input(constraint.predicate),
395 .outputs = outputs,
396 } } } } };
398 std::vector<Acir::FunctionInput> verification_key;
399 for (const auto& key_idx : constraint.key) {
400 verification_key.push_back(witness_to_function_input(key_idx));
401 }
402 std::vector<Acir::FunctionInput> proof;
403 for (const auto& proof_idx : constraint.proof) {
404 proof.push_back(witness_to_function_input(proof_idx));
405 }
406 std::vector<Acir::FunctionInput> public_inputs;
407 for (const auto& pub_input_idx : constraint.public_inputs) {
408 public_inputs.push_back(witness_to_function_input(pub_input_idx));
409 }
413 .verification_key = std::move(verification_key),
414 .proof = std::move(proof),
415 .public_inputs = std::move(public_inputs),
416 .key_hash = witness_to_function_input(constraint.key_hash),
417 .proof_type = constraint.proof_type,
418 .predicate = witness_or_constant_to_function_input(constraint.predicate),
419 } } } } };
421 return block_constraint_to_acir_opcodes(constraint);
423 // Convert a single mul_quad_ to an AssertZero opcode
424 Acir::Expression expr{
425 .mul_terms = {},
426 .linear_combinations = {},
427 .q_c = constraint.const_scaling.to_buffer(),
428 };
429
430 add_terms_to_expression(expr, constraint);
431
432 return { Acir::Opcode{ .value = Acir::Opcode::AssertZero{ .value = expr } } };
434 // Convert a vector of mul_quad_ (big_quad_constraints) to an AssertZero opcode
435 Acir::Expression expr{
436 .mul_terms = {},
437 .linear_combinations = {},
438 .q_c = constraint[0].const_scaling.to_buffer(),
439 };
440
441 for (const auto& mul_quad : constraint) {
442 add_terms_to_expression(expr, mul_quad);
443 }
444
445 return { Acir::Opcode{ .value = Acir::Opcode::AssertZero{ .value = expr } } };
446 } else {
447 throw_or_abort("Unsupported constraint type");
448 }
449}
450
460inline Acir::Circuit build_acir_circuit(const std::vector<Acir::Opcode>& opcodes)
461{
462 return Acir::Circuit{
463 .function_name = "test_circuit",
464 .opcodes = opcodes,
465 .private_parameters = {},
466 .public_parameters = Acir::PublicInputs{ .value = {} },
467 .return_values = Acir::PublicInputs{ .value = {} },
468 .assert_messages = {},
469 };
470}
471
485template <typename ConstraintType> AcirFormat constraint_to_acir_format(const ConstraintType& constraint)
486{
487 std::vector<Acir::Opcode> opcodes;
488
489 if constexpr (is_std_vector_v<ConstraintType>) {
490 // Handle vector of constraints - collect all opcodes
491 for (const auto& c : constraint) {
492 auto c_opcodes = constraint_to_acir_opcode(c);
493 opcodes.insert(opcodes.end(), c_opcodes.begin(), c_opcodes.end());
494 }
495 } else {
496 // Handle single constraint
497 opcodes = constraint_to_acir_opcode(constraint);
498 }
499
500 Acir::Circuit circuit = build_acir_circuit(opcodes);
501 return circuit_serde_to_acir_format(circuit);
502}
503
515template <typename T>
516concept TestBase = requires {
517 // Required type aliases
518 typename T::Builder;
519 typename T::AcirConstraint;
520 typename T::InvalidWitness;
521 typename T::InvalidWitness::Target;
522
523 // Ensure InvalidWitness::Target is enum
525
526 // Ensure that InvalidWitness::Target has a None value
527 { T::InvalidWitness::Target::None };
528
529 // InvalidWitness must provide static methods for test iteration
530 { T::InvalidWitness::get_all() } -> std::same_as<std::vector<typename T::InvalidWitness::Target>>;
531 { T::InvalidWitness::get_labels() } -> std::same_as<std::vector<std::string>>;
532
533 // Required constraint manipulation methods
534 requires requires(T& instance, typename T::AcirConstraint& constraint, WitnessVector& witness_values) {
539 { T::generate_constraints(constraint, witness_values) } -> std::same_as<void>;
540
545 { T::generate_metadata() } -> std::same_as<ProgramMetadata>;
546 };
547
548 requires requires(T& instance,
549 typename T::AcirConstraint constraint,
550 WitnessVector witness_values,
551 const typename T::InvalidWitness::Target& invalid_witness_target) {
559 {
560 T::invalidate_witness(constraint, witness_values, invalid_witness_target)
562 };
563};
564
565template <TestBase Base_> class TestClass {
566 public:
567 using Base = Base_;
568 using Builder = Base::Builder;
569 using AcirConstraint = Base::AcirConstraint;
570 using InvalidWitness = Base::InvalidWitness;
571 using InvalidWitnessTarget = Base::InvalidWitness::Target;
572
588 WitnessVector& witness_values,
589 const InvalidWitnessTarget& invalid_witness_target)
590 {
591 auto [updated_constraint, updated_witness_values] =
592 Base::invalidate_witness(constraint, witness_values, invalid_witness_target);
593
594 // Use the full ACIR flow: constraint -> Acir::Opcode -> Acir::Circuit -> circuit_serde_to_acir_format
595 AcirFormat constraint_system = constraint_to_acir_format(updated_constraint);
596 AcirProgram program{ constraint_system, updated_witness_values };
597 auto builder = create_circuit<Builder>(program, Base::generate_metadata());
598
599 return { CircuitChecker::check(builder), builder.failed(), builder.err() };
600 }
601
610 template <typename Flavor> static size_t test_vk_independence()
611 {
614
615 size_t num_gates = 0;
616
617 // Generate the constraint system
618 AcirConstraint constraint;
619 WitnessVector witness_values;
620 Base::generate_constraints(constraint, witness_values);
621
622 // Use the full ACIR flow: constraint -> Acir::Opcode -> Acir::Circuit -> circuit_serde_to_acir_format
623 AcirFormat constraint_system = constraint_to_acir_format(constraint);
624
625 // Construct the vks
626 std::shared_ptr<VerificationKey> vk_from_witness;
627 {
628 AcirProgram program{ constraint_system, witness_values };
629 auto builder = create_circuit<Builder>(program, Base::generate_metadata());
630 num_gates = builder.get_num_finalized_gates_inefficient();
631
632 auto prover_instance = std::make_shared<ProverInstance>(builder);
633 vk_from_witness = std::make_shared<VerificationKey>(prover_instance->get_precomputed());
634
635 // Validate the builder
636 EXPECT_TRUE(CircuitChecker::check(builder));
637 EXPECT_FALSE(builder.failed());
638 }
639
640 std::shared_ptr<VerificationKey> vk_from_constraint;
641 {
642 AcirProgram program{ constraint_system, /*witness=*/{} };
643 auto builder = create_circuit<Builder>(program, Base::generate_metadata());
644 auto prover_instance = std::make_shared<ProverInstance>(builder);
645 vk_from_constraint = std::make_shared<VerificationKey>(prover_instance->get_precomputed());
646 }
647
648 EXPECT_EQ(*vk_from_witness, *vk_from_constraint) << "Mismatch in the vks";
649
650 return num_gates;
651 }
652
658 static std::vector<std::string> test_tampering()
659 {
660 std::vector<std::string> error_msgs;
661
662 // Generate the constraint system
663 AcirConstraint constraint;
664 WitnessVector witness_values;
665 Base::generate_constraints(constraint, witness_values);
666
667 for (auto [target, label] : zip_view(InvalidWitness::get_all(), InvalidWitness::get_labels())) {
668 auto [circuit_checker_result, builder_failed, builder_err] =
669 test_constraints(constraint, witness_values, target);
670 error_msgs.emplace_back(builder_err);
671
672 if (target != InvalidWitness::Target::None) {
673 bool circuit_check_failed = !circuit_checker_result;
674 bool assert_eq_error_present = (builder_err.find("assert_eq") != std::string::npos);
675 EXPECT_TRUE(circuit_check_failed || assert_eq_error_present)
676 << "Circuit checker succeeded unexpectedly and no assert_eq failure for invalid witness target " +
677 label;
678 EXPECT_TRUE(builder_failed) << "Builder succeeded for invalid witness target " + label;
679 } else {
680 EXPECT_TRUE(circuit_checker_result)
681 << "Circuit checker failed unexpectedly for invalid witness target " + label;
682 EXPECT_FALSE(builder_failed) << "Builder failed unexpectedly for invalid witness target " + label;
683 }
684 }
685
686 return error_msgs;
687 }
688};
689
690} // 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:137
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
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::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: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)