Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
ultra_execution_trace.hpp
Go to the documentation of this file.
1// === AUDIT STATUS ===
2// internal: { status: Complete, auditors: [Luke, Raju], commit: }
3// external_1: { status: not started, auditors: [], commit: }
4// external_2: { status: not started, auditors: [], commit: }
5// =====================
6
7#pragma once
8
15
16namespace bb {
17
18class UltraTraceBlock : public ExecutionTraceBlock<fr, 4> {
19 public:
20 virtual Selector<fr>& q_lookup() { return zero_selectors[0]; };
21 virtual Selector<fr>& q_arith() { return zero_selectors[1]; }
22 virtual Selector<fr>& q_delta_range() { return zero_selectors[2]; }
23 virtual Selector<fr>& q_elliptic() { return zero_selectors[3]; }
24 virtual Selector<fr>& q_memory() { return zero_selectors[4]; }
25 virtual Selector<fr>& q_nnf() { return zero_selectors[5]; }
28
30 {
31 return RefVector{ q_m(),
32 q_c(),
33 q_1(),
34 q_2(),
35 q_3(),
36 q_4(),
37 q_lookup(),
38 q_arith(),
40 q_elliptic(),
41 q_memory(),
42 q_nnf(),
45 }
46
50 virtual void set_gate_selector([[maybe_unused]] const fr& value) {}
51
52 private:
54};
55
57
59 public:
60 SelectorType& q_lookup() override { return gate_selector; }
61
62 void set_gate_selector(const fr& value) override
63 {
64 gate_selector.emplace_back(value);
65 q_arith().emplace_back(0);
66 q_delta_range().emplace_back(0);
67 q_elliptic().emplace_back(0);
68 q_memory().emplace_back(0);
69 q_nnf().emplace_back(0);
70 q_poseidon2_external().emplace_back(0);
71 q_poseidon2_internal().emplace_back(0);
72 }
73
74 private:
76};
77
79 public:
80 SelectorType& q_arith() override { return gate_selector; }
81
82 void set_gate_selector(const fr& value) override
83 {
84 q_lookup().emplace_back(0);
85 gate_selector.emplace_back(value);
86 q_delta_range().emplace_back(0);
87 q_elliptic().emplace_back(0);
88 q_memory().emplace_back(0);
89 q_nnf().emplace_back(0);
90 q_poseidon2_external().emplace_back(0);
91 q_poseidon2_internal().emplace_back(0);
92 }
93
94 private:
96};
97
99 public:
101
102 void set_gate_selector(const fr& value) override
103 {
104 q_lookup().emplace_back(0);
105 q_arith().emplace_back(0);
106 gate_selector.emplace_back(value);
107 q_elliptic().emplace_back(0);
108 q_memory().emplace_back(0);
109 q_nnf().emplace_back(0);
110 q_poseidon2_external().emplace_back(0);
111 q_poseidon2_internal().emplace_back(0);
112 }
113
114 private:
116};
117
119 public:
120 SelectorType& q_elliptic() override { return gate_selector; }
121
122 void set_gate_selector(const fr& value) override
123 {
124 q_lookup().emplace_back(0);
125 q_arith().emplace_back(0);
126 q_delta_range().emplace_back(0);
127 gate_selector.emplace_back(value);
128 q_memory().emplace_back(0);
129 q_nnf().emplace_back(0);
130 q_poseidon2_external().emplace_back(0);
131 q_poseidon2_internal().emplace_back(0);
132 }
133
134 private:
136};
137
139 public:
140 SelectorType& q_memory() override { return gate_selector; }
141
142 void set_gate_selector(const fr& value) override
143 {
144 q_lookup().emplace_back(0);
145 q_arith().emplace_back(0);
146 q_delta_range().emplace_back(0);
147 q_elliptic().emplace_back(0);
148 gate_selector.emplace_back(value);
149 q_nnf().emplace_back(0);
150 q_poseidon2_external().emplace_back(0);
151 q_poseidon2_internal().emplace_back(0);
152 }
153
154 private:
156};
157
159 public:
160 SelectorType& q_nnf() override { return gate_selector; }
161
162 void set_gate_selector(const fr& value) override
163 {
164 q_lookup().emplace_back(0);
165 q_arith().emplace_back(0);
166 q_delta_range().emplace_back(0);
167 q_elliptic().emplace_back(0);
168 q_memory().emplace_back(0);
169 gate_selector.emplace_back(value);
170 q_poseidon2_external().emplace_back(0);
171 q_poseidon2_internal().emplace_back(0);
172 }
173
174 private:
176};
177
179 public:
181
182 void set_gate_selector(const fr& value) override
183 {
184 q_lookup().emplace_back(0);
185 q_arith().emplace_back(0);
186 q_delta_range().emplace_back(0);
187 q_elliptic().emplace_back(0);
188 q_memory().emplace_back(0);
189 q_nnf().emplace_back(0);
190 gate_selector.emplace_back(value);
191 q_poseidon2_internal().emplace_back(0);
192 }
193
194 private:
196};
197
199 public:
201
202 void set_gate_selector(const fr& value) override
203 {
204 q_lookup().emplace_back(0);
205 q_arith().emplace_back(0);
206 q_delta_range().emplace_back(0);
207 q_elliptic().emplace_back(0);
208 q_memory().emplace_back(0);
209 q_nnf().emplace_back(0);
210 q_poseidon2_external().emplace_back(0);
211 gate_selector.emplace_back(value);
212 }
213
214 private:
216};
217
276
278
279 public:
280 static constexpr size_t NUM_WIRES = UltraTraceBlock::NUM_WIRES;
281 // The number of rows reserved at the top of the trace for row-disabling / ZK masking.
282 static constexpr size_t TRACE_OFFSET = NUM_DISABLED_ROWS_IN_SUMCHECK;
283 using FF = fr;
284
286
287 void compute_offsets(size_t trace_offset = TRACE_OFFSET)
288 {
289 uint32_t offset = static_cast<uint32_t>(trace_offset + NUM_ZERO_ROWS);
290 for (auto& block : this->get()) {
291 block.trace_offset_ = offset;
292 offset += static_cast<uint32_t>(block.size());
293 }
294 }
295
296 void summarize() const
297 {
298 info("Gate blocks summary:");
299 info("pub inputs :\t", this->pub_inputs.size());
300 info("lookups :\t", this->lookup.size());
301 info("arithmetic :\t", this->arithmetic.size());
302 info("delta range:\t", this->delta_range.size());
303 info("elliptic :\t", this->elliptic.size());
304 info("memory :\t", this->memory.size());
305 info("nnf :\t", this->nnf.size());
306 info("poseidon ext :\t", this->poseidon2_external.size());
307 info("poseidon int :\t", this->poseidon2_internal.size());
308 }
309
310 // Get cumulative size of all blocks
312 {
313 size_t total_size(0);
314 for (const auto& block : this->get()) {
315 total_size += block.size();
316 }
317 return total_size;
318 }
319
320 bool operator==(const UltraExecutionTraceBlocks& other) const = default;
321};
322
323} // namespace bb
Basic structure for storing gate data in a builder.
A template class for a reference array. Behaves as if std::array<T&, N> was possible.
Definition ref_array.hpp:22
A template class for a reference vector. Behaves as if std::vector<T&> was possible.
Abstract interface for a generic selector.
Selector backed by a slab allocator vector.
bool operator==(const UltraExecutionTraceBlocks &other) const =default
void compute_offsets(size_t trace_offset=TRACE_OFFSET)
SlabVectorSelector< fr > gate_selector
void set_gate_selector(const fr &value) override
Default implementation does nothing.
SelectorType & q_arith() override
virtual Selector< fr > & q_lookup()
virtual Selector< fr > & q_poseidon2_internal()
virtual Selector< fr > & q_elliptic()
RefVector< Selector< fr > > get_selectors() override
virtual void set_gate_selector(const fr &value)
Default implementation does nothing.
virtual Selector< fr > & q_arith()
virtual Selector< fr > & q_poseidon2_external()
virtual Selector< fr > & q_nnf()
virtual Selector< fr > & q_delta_range()
std::array< ZeroSelector< fr >, 8 > zero_selectors
virtual Selector< fr > & q_memory()
SlabVectorSelector< fr > gate_selector
SelectorType & q_delta_range() override
void set_gate_selector(const fr &value) override
Default implementation does nothing.
void set_gate_selector(const fr &value) override
Default implementation does nothing.
SlabVectorSelector< fr > gate_selector
SelectorType & q_elliptic() override
SelectorType & q_lookup() override
void set_gate_selector(const fr &value) override
Default implementation does nothing.
SlabVectorSelector< fr > gate_selector
void set_gate_selector(const fr &value) override
Default implementation does nothing.
SelectorType & q_memory() override
SlabVectorSelector< fr > gate_selector
void set_gate_selector(const fr &value) override
Default implementation does nothing.
void set_gate_selector(const fr &value) override
Default implementation does nothing.
void set_gate_selector(const fr &value) override
Default implementation does nothing.
#define info(...)
Definition log.hpp:93
ssize_t offset
Definition engine.cpp:62
Entry point for Barretenberg command-line interface.
Definition api.hpp:5
field< Bn254FrParams > fr
Definition fr.hpp:155
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
Defines the circuit block types for the Ultra arithmetization.
UltraTracePublicInputBlock pub_inputs
UltraTraceDeltaRangeBlock delta_range
UltraTraceArithmeticBlock arithmetic
UltraTraceNonNativeFieldBlock nnf
UltraTraceEllipticBlock elliptic
static constexpr size_t NUM_BLOCKS
UltraTracePoseidon2ExternalBlock poseidon2_external
bool operator==(const UltraTraceBlockData &other) const =default
UltraTracePoseidon2InternalBlock poseidon2_internal