Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
acir_format.hpp
Go to the documentation of this file.
1// === AUDIT STATUS ===
2// internal: { status: not started, auditors: [], date: YYYY-MM-DD }
3// external_1: { status: not started, auditors: [], date: YYYY-MM-DD }
4// external_2: { status: not started, auditors: [], date: YYYY-MM-DD }
5// =====================
6
7#pragma once
11
16#include "blake3_constraint.hpp"
17#include "block_constraint.hpp"
19#include "ec_operations.hpp"
20#include "ecdsa_constraints.hpp"
23#include "keccak_constraint.hpp"
24#include "logic_constraint.hpp"
25#include "multi_scalar_mul.hpp"
27#include "range_constraint.hpp"
29#include "sha256_constraint.hpp"
30#include <cstdint>
31#include <utility>
32#include <vector>
33
34namespace acir_format {
35
37using WitnessVector = std::vector<bb::fr>;
38
46 std::vector<size_t> logic_constraints;
47 std::vector<size_t> range_constraints;
48 std::vector<size_t> aes128_constraints;
49 std::vector<size_t> sha256_compression;
50 std::vector<size_t> ecdsa_k1_constraints;
51 std::vector<size_t> ecdsa_r1_constraints;
52 std::vector<size_t> blake2s_constraints;
53 std::vector<size_t> blake3_constraints;
54 std::vector<size_t> keccak_permutations;
55 std::vector<size_t> poseidon2_constraints;
56 std::vector<size_t> multi_scalar_mul_constraints;
57 std::vector<size_t> ec_add_constraints;
58 std::vector<size_t> honk_recursion_constraints;
59 std::vector<size_t> avm_recursion_constraints;
60 std::vector<size_t> hn_recursion_constraints;
61 std::vector<size_t> chonk_recursion_constraints;
62 std::vector<size_t> arithmetic_triple_constraints;
63 std::vector<size_t> quad_constraints;
64 std::vector<size_t> big_quad_constraints;
65 // Multiple opcode indices per block:
67
69 AcirFormatOriginalOpcodeIndices const& rhs) = default;
70};
71
72struct AcirFormat {
73 uint32_t max_witness_index = 0;
75
76 std::vector<uint32_t> public_inputs;
77
94 std::vector<QuadConstraints> quad_constraints; // Standard honk arithmetic constraint of width 4
95 // A vector of vector of mul_quad gates (i.e arithmetic constraints of width 4)
96 // Each vector of gates represente a 'big' expression (a polynomial of degree 1 or 2 which does not fit inside one
97 // mul_gate) that has been splitted into multiple mul_gates, using w4_shift (the 4th wire of the next gate), to
98 // reduce the number of intermediate variables.
101
102 // Number of gates added to the circuit per original opcode.
103 // Has length equal to num_acir_opcodes.
104 std::vector<size_t> gates_per_opcode;
105
106 // Indices of the original opcode that originated each constraint in AcirFormat.
108
109 // For serialization, update with any new fields
130
131 friend bool operator==(AcirFormat const& lhs, AcirFormat const& rhs) = default;
132};
133
138
140 // An IVC instance; needed to construct a circuit from IVC recursion constraints
141 std::shared_ptr<bb::IVCBase> ivc = nullptr;
142
144 false; // Boolean describing whether the circuit should propagate an IPA claim or not. If `True`, the circuit
145 // should propagate an IPA claim. In our codebase, circuits that propagate IPA claims are the ones whose
146 // proof is constructed/verified using Rollup flavors.
148 size_t size_hint = 0;
149};
150
151// TODO(https://github.com/AztecProtocol/barretenberg/issues/1161) Refactor this function
152template <typename Builder>
154
155template <typename Builder>
156void build_constraints(Builder& builder, AcirFormat& constraints, const ProgramMetadata& metadata);
157
162template <typename Builder> class GateCounter {
163 public:
168
170 {
172 return 0;
173 }
174 size_t new_gate_count = builder->get_num_finalized_gates_inefficient(/*ensure_nonzero=*/false);
175 size_t diff = new_gate_count - prev_gate_count;
176 prev_gate_count = new_gate_count;
177 return diff;
178 }
179
180 void track_diff(std::vector<size_t>& gates_per_opcode, size_t opcode_index)
181 {
183 gates_per_opcode[opcode_index] = compute_diff();
184 }
185 }
186
187 private:
191};
192} // namespace acir_format
Utility class for tracking the gate count of acir constraints.
void track_diff(std::vector< size_t > &gates_per_opcode, size_t opcode_index)
GateCounter(Builder *builder, bool collect_gates_per_opcode)
AluTraceBuilder builder
Definition alu.test.cpp:124
std::vector< bb::fr > WitnessVector
void build_constraints(Builder &builder, AcirFormat &constraints, const ProgramMetadata &metadata)
UltraCircuitBuilder create_circuit(AcirProgram &program, const ProgramMetadata &metadata)
Specialization for creating an Ultra circuit from an acir program.
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
std::vector< MultiScalarMul > multi_scalar_mul_constraints
std::vector< Blake2sConstraint > blake2s_constraints
friend bool operator==(AcirFormat const &lhs, AcirFormat const &rhs)=default
std::vector< Sha256Compression > sha256_compression
std::vector< Poseidon2Constraint > poseidon2_constraints
std::vector< LogicConstraint > logic_constraints
std::vector< QuadConstraints > quad_constraints
std::vector< EcAdd > ec_add_constraints
std::vector< Keccakf1600 > keccak_permutations
MSGPACK_FIELDS(public_inputs, logic_constraints, range_constraints, aes128_constraints, sha256_compression, ecdsa_k1_constraints, ecdsa_r1_constraints, blake2s_constraints, blake3_constraints, keccak_permutations, poseidon2_constraints, multi_scalar_mul_constraints, ec_add_constraints, honk_recursion_constraints, avm_recursion_constraints, hn_recursion_constraints, chonk_recursion_constraints, quad_constraints, big_quad_constraints, block_constraints)
std::vector< RecursionConstraint > honk_recursion_constraints
std::vector< Blake3Constraint > blake3_constraints
std::vector< EcdsaConstraint > ecdsa_r1_constraints
std::vector< RangeConstraint > range_constraints
std::vector< AES128Constraint > aes128_constraints
AcirFormatOriginalOpcodeIndices original_opcode_indices
std::vector< BlockConstraint > block_constraints
std::vector< EcdsaConstraint > ecdsa_k1_constraints
std::vector< RecursionConstraint > hn_recursion_constraints
std::vector< uint32_t > public_inputs
std::vector< size_t > gates_per_opcode
std::vector< RecursionConstraint > avm_recursion_constraints
std::vector< RecursionConstraint > chonk_recursion_constraints
std::vector< std::vector< QuadConstraints > > big_quad_constraints
Indices of the original opcode that originated each constraint in AcirFormat.
std::vector< std::vector< size_t > > block_constraints
std::vector< size_t > arithmetic_triple_constraints
friend bool operator==(AcirFormatOriginalOpcodeIndices const &lhs, AcirFormatOriginalOpcodeIndices const &rhs)=default
std::shared_ptr< bb::IVCBase > ivc