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) {
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) {
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)
479{
480 return Acir::Circuit{
481 .function_name = "test_circuit",
482 .opcodes = opcodes,
483 .private_parameters = {},
484 .public_parameters = Acir::PublicInputs{ .value = {} },
485 .return_values = Acir::PublicInputs{ .value = {} },
486 .assert_messages = {},
487 };
488}
489
503template <typename ConstraintType> AcirFormat constraint_to_acir_format(const ConstraintType& constraint)
504{
505 std::vector<Acir::Opcode> opcodes;
506
507 if constexpr (is_std_vector_v<ConstraintType>) {
508 // Handle vector of constraints - collect all opcodes
509 for (const auto& c : constraint) {
510 auto c_opcodes = constraint_to_acir_opcode(c);
511 opcodes.insert(opcodes.end(), c_opcodes.begin(), c_opcodes.end());
512 }
513 } else {
514 // Handle single constraint
515 opcodes = constraint_to_acir_opcode(constraint);
516 }
517
518 Acir::Circuit circuit = build_acir_circuit(opcodes);
519 return circuit_serde_to_acir_format(circuit);
520}
521
533template <typename T>
534concept TestBase = requires {
535 // Required type aliases
536 typename T::Builder;
537 typename T::AcirConstraint;
538 typename T::InvalidWitness;
539 typename T::InvalidWitness::Target;
540
541 // Ensure InvalidWitness::Target is enum
543
544 // Ensure that InvalidWitness::Target has a None value
545 { T::InvalidWitness::Target::None };
546
547 // InvalidWitness must provide static methods for test iteration
548 { T::InvalidWitness::get_all() } -> std::same_as<std::vector<typename T::InvalidWitness::Target>>;
549 { T::InvalidWitness::get_labels() } -> std::same_as<std::vector<std::string>>;
550
551 // Required constraint manipulation methods
552 requires requires(T& instance, typename T::AcirConstraint& constraint, WitnessVector& witness_values) {
557 { T::generate_constraints(constraint, witness_values) } -> std::same_as<void>;
558
563 { T::generate_metadata() } -> std::same_as<ProgramMetadata>;
564 };
565
566 requires requires(T& instance,
567 typename T::AcirConstraint constraint,
568 WitnessVector witness_values,
569 const typename T::InvalidWitness::Target& invalid_witness_target) {
577 {
578 T::invalidate_witness(constraint, witness_values, invalid_witness_target)
580 };
581};
582
583template <TestBase Base_> class TestClass {
584 public:
585 using Base = Base_;
586 using Builder = Base::Builder;
587 using AcirConstraint = Base::AcirConstraint;
588 using InvalidWitness = Base::InvalidWitness;
589 using InvalidWitnessTarget = Base::InvalidWitness::Target;
590
606 WitnessVector& witness_values,
607 const InvalidWitnessTarget& invalid_witness_target)
608 {
609 auto [updated_constraint, updated_witness_values] =
610 Base::invalidate_witness(constraint, witness_values, invalid_witness_target);
611
612 // Use the full ACIR flow: constraint -> Acir::Opcode -> Acir::Circuit -> circuit_serde_to_acir_format
613 AcirFormat constraint_system = constraint_to_acir_format(updated_constraint);
614 AcirProgram program{ constraint_system, updated_witness_values };
615 auto builder = create_circuit<Builder>(program, Base::generate_metadata());
616
617 return { CircuitChecker::check(builder), builder.failed(), builder.err() };
618 }
619
628 template <typename Flavor> static size_t test_vk_independence()
629 {
632
633 size_t num_gates = 0;
634
635 // Generate the constraint system
636 AcirConstraint constraint;
637 WitnessVector witness_values;
638 Base::generate_constraints(constraint, witness_values);
639
640 // Use the full ACIR flow: constraint -> Acir::Opcode -> Acir::Circuit -> circuit_serde_to_acir_format
641 AcirFormat constraint_system = constraint_to_acir_format(constraint);
642
643 // Construct the vks
644 std::shared_ptr<VerificationKey> vk_from_witness;
645 {
646 AcirProgram program{ constraint_system, witness_values };
647 auto builder = create_circuit<Builder>(program, Base::generate_metadata());
648 num_gates = builder.get_num_finalized_gates_inefficient();
649
650 auto prover_instance = std::make_shared<ProverInstance>(builder);
651 vk_from_witness = std::make_shared<VerificationKey>(prover_instance->get_precomputed());
652
653 // Validate the builder
654 EXPECT_TRUE(CircuitChecker::check(builder));
655 EXPECT_FALSE(builder.failed());
656 }
657
658 std::shared_ptr<VerificationKey> vk_from_constraint;
659 {
660 AcirProgram program{ constraint_system, /*witness=*/{} };
661 auto builder = create_circuit<Builder>(program, Base::generate_metadata());
662 auto prover_instance = std::make_shared<ProverInstance>(builder);
663 vk_from_constraint = std::make_shared<VerificationKey>(prover_instance->get_precomputed());
664 }
665
666 EXPECT_EQ(*vk_from_witness, *vk_from_constraint) << "Mismatch in the vks";
667
668 return num_gates;
669 }
670
676 static std::vector<std::string> test_tampering()
677 {
678 std::vector<std::string> error_msgs;
679
680 // Generate the constraint system
681 AcirConstraint constraint;
682 WitnessVector witness_values;
683 Base::generate_constraints(constraint, witness_values);
684
685 for (auto [target, label] : zip_view(InvalidWitness::get_all(), InvalidWitness::get_labels())) {
686 auto [circuit_checker_result, builder_failed, builder_err] =
687 test_constraints(constraint, witness_values, target);
688 error_msgs.emplace_back(builder_err);
689
690 if (target != InvalidWitness::Target::None) {
691 bool circuit_check_failed = !circuit_checker_result;
692 bool assert_eq_error_present = (builder_err.find("assert_eq") != std::string::npos);
693 EXPECT_TRUE(circuit_check_failed || assert_eq_error_present)
694 << "Circuit checker succeeded unexpectedly and no assert_eq failure for invalid witness target " +
695 label;
696 EXPECT_TRUE(builder_failed) << "Builder succeeded for invalid witness target " + label;
697 } else {
698 EXPECT_TRUE(circuit_checker_result)
699 << "Circuit checker failed unexpectedly for invalid witness target " + label;
700 EXPECT_FALSE(builder_failed) << "Builder failed unexpectedly for invalid witness target " + label;
701 }
702 }
703
704 return error_msgs;
705 }
706};
707
708} // 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:172
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.
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::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:2124
Acir::FunctionInput lhs
Definition acir.hpp:2153
std::vector< Acir::FunctionInput > inputs
Definition acir.hpp:2234
std::vector< Acir::FunctionInput > inputs
Definition acir.hpp:2257
std::shared_ptr< std::array< Acir::FunctionInput, 32 > > public_key_x
Definition acir.hpp:2280
std::shared_ptr< std::array< Acir::FunctionInput, 32 > > public_key_x
Definition acir.hpp:2315
std::shared_ptr< std::array< Acir::FunctionInput, 3 > > input1
Definition acir.hpp:2379
std::shared_ptr< std::array< Acir::FunctionInput, 25 > > inputs
Definition acir.hpp:2408
std::vector< Acir::FunctionInput > points
Definition acir.hpp:2350
std::vector< Acir::FunctionInput > inputs
Definition acir.hpp:2466
Acir::FunctionInput input
Definition acir.hpp:2211
std::vector< Acir::FunctionInput > verification_key
Definition acir.hpp:2431
std::shared_ptr< std::array< Acir::FunctionInput, 16 > > inputs
Definition acir.hpp:2489
Acir::FunctionInput lhs
Definition acir.hpp:2182
std::variant< AES128Encrypt, AND, XOR, RANGE, Blake2s, Blake3, EcdsaSecp256k1, EcdsaSecp256r1, MultiScalarMul, EmbeddedCurveAdd, Keccakf1600, RecursiveAggregation, Poseidon2Permutation, Sha256Compression > value
Definition acir.hpp:2528
uint32_t value
Definition acir.hpp:2701
std::variant< Memory, CallData, ReturnData > value
Definition acir.hpp:2746
std::string function_name
Definition acir.hpp:3496
std::vector< std::tuple< std::vector< uint8_t >, Acir::Witness > > linear_combinations
Definition acir.hpp:2796
std::vector< std::tuple< std::vector< uint8_t >, Acir::Witness, Acir::Witness > > mul_terms
Definition acir.hpp:2795
std::vector< uint8_t > value
Definition acir.hpp:2038
std::variant< Constant, Witness > value
Definition acir.hpp:2069
Acir::Expression operation
Definition acir.hpp:3019
Acir::Expression value
Definition acir.hpp:3047
Acir::BlackBoxFuncCall value
Definition acir.hpp:3063
Acir::BlockId block_id
Definition acir.hpp:3102
Acir::BlockId block_id
Definition acir.hpp:3079
std::variant< AssertZero, BlackBoxFuncCall, MemoryOp, MemoryInit, BrilligCall, Call > value
Definition acir.hpp:3185
std::vector< Acir::Witness > value
Definition acir.hpp:3480
uint32_t value
Definition acir.hpp:2020
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)