Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
avm_io.cpp
Go to the documentation of this file.
2
3#include <vector>
4
5#include "barretenberg/aztec/aztec_constants.hpp"
7
8namespace bb::avm2 {
9namespace {
10
15
16void set_snapshot_in_cols(const AppendOnlyTreeSnapshot& snapshot, std::vector<std::vector<FF>>& cols, size_t row_idx)
17{
18 cols[0][row_idx] = snapshot.root;
19 cols[1][row_idx] = snapshot.next_available_leaf_index;
20}
21
22void set_gas_in_cols(const Gas& gas, std::vector<std::vector<FF>>& cols, size_t row_idx)
23{
24 cols[0][row_idx] = gas.da_gas;
25 cols[1][row_idx] = gas.l2_gas;
26}
27
28void set_gas_fees_in_cols(const GasFees& gas_fees, std::vector<std::vector<FF>>& cols, size_t row_idx)
29{
30 cols[0][row_idx] = gas_fees.fee_per_da_gas;
31 cols[1][row_idx] = gas_fees.fee_per_l2_gas;
32}
33
34void set_public_call_request_in_cols(const PublicCallRequest& request,
35 std::vector<std::vector<FF>>& cols,
36 size_t row_idx)
37{
38 cols[0][row_idx] = request.msg_sender;
39 cols[1][row_idx] = request.contract_address;
40 cols[2][row_idx] = static_cast<uint8_t>(request.is_static_call);
41 cols[3][row_idx] = request.calldata_hash;
42}
43
44void set_public_call_request_array_in_cols(const std::array<PublicCallRequest, MAX_ENQUEUED_CALLS_PER_TX>& requests,
45 std::vector<std::vector<FF>>& cols,
46 size_t array_start_row_idx)
47{
48 for (size_t i = 0; i < requests.size(); ++i) {
49 size_t row = array_start_row_idx + i;
50 set_public_call_request_in_cols(requests[i], cols, row);
51 }
52}
53
54template <size_t SIZE>
55void set_field_array_in_cols(const std::array<FF, SIZE>& arr,
56 std::vector<std::vector<FF>>& cols,
57 size_t array_start_row_idx)
58{
59 for (size_t i = 0; i < arr.size(); ++i) {
60 size_t row = array_start_row_idx + i;
61 cols[0][row] = arr[i];
62 }
63}
64
65template <size_t SIZE>
66void set_l2_to_l1_msg_array_in_cols(const std::array<ScopedL2ToL1Message, SIZE>& arr,
67 std::vector<std::vector<FF>>& cols,
68 size_t array_start_row_idx)
69{
70 for (size_t i = 0; i < arr.size(); ++i) {
71 size_t row = array_start_row_idx + i;
72 cols[0][row] = arr[i].message.recipient;
73 cols[1][row] = arr[i].message.content;
74 cols[2][row] = arr[i].contract_address;
75 }
76}
77
78void set_public_logs_in_cols(const PublicLogs& public_logs,
79 std::vector<std::vector<FF>>& cols,
80 size_t array_start_row_idx)
81{
82 // Header
83 cols[0][array_start_row_idx] = public_logs.length;
84 // Payload
85 for (size_t i = 0; i < public_logs.length; ++i) {
86 cols[0][array_start_row_idx + i + FLAT_PUBLIC_LOGS_HEADER_LENGTH] = public_logs.payload[i];
87 }
88}
89
90template <size_t SIZE>
91void set_public_data_writes_in_cols(const std::array<PublicDataWrite, SIZE>& writes,
92 std::vector<std::vector<FF>>& cols,
93 size_t array_start_row_idx)
94{
95 for (size_t i = 0; i < writes.size(); ++i) {
96 size_t row = array_start_row_idx + i;
97 cols[0][row] = writes[i].leaf_slot;
98 cols[1][row] = writes[i].value;
99 }
100}
101
102void set_protocol_contracts_in_cols(const ProtocolContracts& protocol_contracts,
103 std::vector<std::vector<FF>>& cols,
104 size_t protocol_contracts_start_row_idx)
105{
106 set_field_array_in_cols(protocol_contracts.derived_addresses, cols, protocol_contracts_start_row_idx);
107}
108
109} // anonymous namespace
110
114
115PublicInputs PublicInputs::from(const std::vector<uint8_t>& data)
116{
118 msgpack::unpack(reinterpret_cast<const char*>(data.data()), data.size()).get().convert(inputs);
119 return inputs;
120}
121
122AvmProvingInputs AvmProvingInputs::from(const std::vector<uint8_t>& data)
123{
125 msgpack::unpack(reinterpret_cast<const char*>(data.data()), data.size()).get().convert(inputs);
126 return inputs;
127}
128
130{
132 msgpack::unpack(reinterpret_cast<const char*>(data.data()), data.size()).get().convert(inputs);
133 return inputs;
134}
135
139
140// WARNING: If updating this columns conversion, you must also update columns serialization
141// in the Noir `AvmCircuitPublicInputs` struct in avm_circuit_public_inputs.nr
143{
145 cols.reserve(AVM_NUM_PUBLIC_INPUT_COLUMNS);
146 for (size_t i = 0; i < AVM_NUM_PUBLIC_INPUT_COLUMNS; ++i) {
147 cols.emplace_back(AVM_PUBLIC_INPUTS_COLUMN_LENGTHS[i], FF(0));
148 }
149
150 // Global variables
151 cols[0][AVM_PUBLIC_INPUTS_GLOBAL_VARIABLES_CHAIN_ID_ROW_IDX] = global_variables.chain_id;
152 cols[0][AVM_PUBLIC_INPUTS_GLOBAL_VARIABLES_VERSION_ROW_IDX] = global_variables.version;
153 cols[0][AVM_PUBLIC_INPUTS_GLOBAL_VARIABLES_BLOCK_NUMBER_ROW_IDX] = global_variables.block_number;
154 cols[0][AVM_PUBLIC_INPUTS_GLOBAL_VARIABLES_SLOT_NUMBER_ROW_IDX] = global_variables.slot_number;
155 cols[0][AVM_PUBLIC_INPUTS_GLOBAL_VARIABLES_TIMESTAMP_ROW_IDX] = global_variables.timestamp;
156 cols[0][AVM_PUBLIC_INPUTS_GLOBAL_VARIABLES_COINBASE_ROW_IDX] = global_variables.coinbase;
157 cols[0][AVM_PUBLIC_INPUTS_GLOBAL_VARIABLES_FEE_RECIPIENT_ROW_IDX] = global_variables.fee_recipient;
158 set_gas_fees_in_cols(global_variables.gas_fees, cols, AVM_PUBLIC_INPUTS_GLOBAL_VARIABLES_GAS_FEES_ROW_IDX);
159
160 // Protocol contracts
161 set_protocol_contracts_in_cols(protocol_contracts, cols, AVM_PUBLIC_INPUTS_PROTOCOL_CONTRACTS_ROW_IDX);
162
163 // Start tree snapshots
164 set_snapshot_in_cols(start_tree_snapshots.l1_to_l2_message_tree,
165 cols,
166 AVM_PUBLIC_INPUTS_START_TREE_SNAPSHOTS_L1_TO_L2_MESSAGE_TREE_ROW_IDX);
167 set_snapshot_in_cols(
168 start_tree_snapshots.note_hash_tree, cols, AVM_PUBLIC_INPUTS_START_TREE_SNAPSHOTS_NOTE_HASH_TREE_ROW_IDX);
169 set_snapshot_in_cols(
170 start_tree_snapshots.nullifier_tree, cols, AVM_PUBLIC_INPUTS_START_TREE_SNAPSHOTS_NULLIFIER_TREE_ROW_IDX);
171 set_snapshot_in_cols(
172 start_tree_snapshots.public_data_tree, cols, AVM_PUBLIC_INPUTS_START_TREE_SNAPSHOTS_PUBLIC_DATA_TREE_ROW_IDX);
173
174 // Start gas used
175 set_gas_in_cols(start_gas_used, cols, AVM_PUBLIC_INPUTS_START_GAS_USED_ROW_IDX);
176
177 // Gas settings
178 set_gas_in_cols(gas_settings.gas_limits, cols, AVM_PUBLIC_INPUTS_GAS_SETTINGS_GAS_LIMITS_ROW_IDX);
179 set_gas_in_cols(gas_settings.teardown_gas_limits, cols, AVM_PUBLIC_INPUTS_GAS_SETTINGS_TEARDOWN_GAS_LIMITS_ROW_IDX);
180 set_gas_fees_in_cols(gas_settings.max_fees_per_gas, cols, AVM_PUBLIC_INPUTS_GAS_SETTINGS_MAX_FEES_PER_GAS_ROW_IDX);
181 set_gas_fees_in_cols(
182 gas_settings.max_priority_fees_per_gas, cols, AVM_PUBLIC_INPUTS_GAS_SETTINGS_MAX_PRIORITY_FEES_PER_GAS_ROW_IDX);
183
184 // Effective gas fees
185 set_gas_fees_in_cols(effective_gas_fees, cols, AVM_PUBLIC_INPUTS_EFFECTIVE_GAS_FEES_ROW_IDX);
186
187 // Fee payer
188 cols[0][AVM_PUBLIC_INPUTS_FEE_PAYER_ROW_IDX] = fee_payer;
189
190 // Prover id
191 cols[0][AVM_PUBLIC_INPUTS_PROVER_ID_ROW_IDX] = prover_id;
192
193 // Public Call Request Array Lengths
194 cols[0][AVM_PUBLIC_INPUTS_PUBLIC_CALL_REQUEST_ARRAY_LENGTHS_SETUP_CALLS_ROW_IDX] =
196 cols[0][AVM_PUBLIC_INPUTS_PUBLIC_CALL_REQUEST_ARRAY_LENGTHS_APP_LOGIC_CALLS_ROW_IDX] =
198 cols[0][AVM_PUBLIC_INPUTS_PUBLIC_CALL_REQUEST_ARRAY_LENGTHS_TEARDOWN_CALL_ROW_IDX] =
200
201 // Setup, app logic, and teardown call requests
202 set_public_call_request_array_in_cols(
203 public_setup_call_requests, cols, AVM_PUBLIC_INPUTS_PUBLIC_SETUP_CALL_REQUESTS_ROW_IDX);
204 set_public_call_request_array_in_cols(
205 public_app_logic_call_requests, cols, AVM_PUBLIC_INPUTS_PUBLIC_APP_LOGIC_CALL_REQUESTS_ROW_IDX);
206 set_public_call_request_in_cols(
207 public_teardown_call_request, cols, AVM_PUBLIC_INPUTS_PUBLIC_TEARDOWN_CALL_REQUEST_ROW_IDX);
208
209 // Previous non-revertible accumulated data array lengths
210 cols[0][AVM_PUBLIC_INPUTS_PREVIOUS_NON_REVERTIBLE_ACCUMULATED_DATA_ARRAY_LENGTHS_NOTE_HASHES_ROW_IDX] =
212 cols[0][AVM_PUBLIC_INPUTS_PREVIOUS_NON_REVERTIBLE_ACCUMULATED_DATA_ARRAY_LENGTHS_NULLIFIERS_ROW_IDX] =
214 cols[0][AVM_PUBLIC_INPUTS_PREVIOUS_NON_REVERTIBLE_ACCUMULATED_DATA_ARRAY_LENGTHS_L2_TO_L1_MSGS_ROW_IDX] =
216
217 // Previous revertible accumulated data array lengths
218 cols[0][AVM_PUBLIC_INPUTS_PREVIOUS_REVERTIBLE_ACCUMULATED_DATA_ARRAY_LENGTHS_NOTE_HASHES_ROW_IDX] =
220 cols[0][AVM_PUBLIC_INPUTS_PREVIOUS_REVERTIBLE_ACCUMULATED_DATA_ARRAY_LENGTHS_NULLIFIERS_ROW_IDX] =
222 cols[0][AVM_PUBLIC_INPUTS_PREVIOUS_REVERTIBLE_ACCUMULATED_DATA_ARRAY_LENGTHS_L2_TO_L1_MSGS_ROW_IDX] =
224
225 // Previous non-revertible accumulated data
227 cols,
228 AVM_PUBLIC_INPUTS_PREVIOUS_NON_REVERTIBLE_ACCUMULATED_DATA_NOTE_HASHES_ROW_IDX);
230 cols,
231 AVM_PUBLIC_INPUTS_PREVIOUS_NON_REVERTIBLE_ACCUMULATED_DATA_NULLIFIERS_ROW_IDX);
232 set_l2_to_l1_msg_array_in_cols(previous_non_revertible_accumulated_data.l2_to_l1_msgs,
233 cols,
234 AVM_PUBLIC_INPUTS_PREVIOUS_NON_REVERTIBLE_ACCUMULATED_DATA_L2_TO_L1_MSGS_ROW_IDX);
235
236 // Previous revertible accumulated data
238 cols,
239 AVM_PUBLIC_INPUTS_PREVIOUS_REVERTIBLE_ACCUMULATED_DATA_NOTE_HASHES_ROW_IDX);
240 set_field_array_in_cols(previous_revertible_accumulated_data.nullifiers,
241 cols,
242 AVM_PUBLIC_INPUTS_PREVIOUS_REVERTIBLE_ACCUMULATED_DATA_NULLIFIERS_ROW_IDX);
243 set_l2_to_l1_msg_array_in_cols(previous_revertible_accumulated_data.l2_to_l1_msgs,
244 cols,
245 AVM_PUBLIC_INPUTS_PREVIOUS_REVERTIBLE_ACCUMULATED_DATA_L2_TO_L1_MSGS_ROW_IDX);
246
247 // End tree snapshots
248 set_snapshot_in_cols(end_tree_snapshots.l1_to_l2_message_tree,
249 cols,
250 AVM_PUBLIC_INPUTS_END_TREE_SNAPSHOTS_L1_TO_L2_MESSAGE_TREE_ROW_IDX);
251 set_snapshot_in_cols(
252 end_tree_snapshots.note_hash_tree, cols, AVM_PUBLIC_INPUTS_END_TREE_SNAPSHOTS_NOTE_HASH_TREE_ROW_IDX);
253 set_snapshot_in_cols(
254 end_tree_snapshots.nullifier_tree, cols, AVM_PUBLIC_INPUTS_END_TREE_SNAPSHOTS_NULLIFIER_TREE_ROW_IDX);
255 set_snapshot_in_cols(
256 end_tree_snapshots.public_data_tree, cols, AVM_PUBLIC_INPUTS_END_TREE_SNAPSHOTS_PUBLIC_DATA_TREE_ROW_IDX);
257
258 // End gas used
259 set_gas_in_cols(end_gas_used, cols, AVM_PUBLIC_INPUTS_END_GAS_USED_ROW_IDX);
260
261 // Accumulated Data Array Lengths
262 cols[0][AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_ARRAY_LENGTHS_NOTE_HASHES_ROW_IDX] =
264 cols[0][AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_ARRAY_LENGTHS_NULLIFIERS_ROW_IDX] =
266 cols[0][AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_ARRAY_LENGTHS_L2_TO_L1_MSGS_ROW_IDX] =
268 cols[0][AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_ARRAY_LENGTHS_PUBLIC_DATA_WRITES_ROW_IDX] =
270
271 // Accumulated data
272 set_field_array_in_cols(
273 accumulated_data.note_hashes, cols, AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_NOTE_HASHES_ROW_IDX);
274 set_field_array_in_cols(
275 accumulated_data.nullifiers, cols, AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_NULLIFIERS_ROW_IDX);
276 set_l2_to_l1_msg_array_in_cols(
277 accumulated_data.l2_to_l1_msgs, cols, AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_L2_TO_L1_MSGS_ROW_IDX);
278 set_public_logs_in_cols(
279 accumulated_data.public_logs, cols, AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_PUBLIC_LOGS_ROW_IDX);
280 set_public_data_writes_in_cols(
281 accumulated_data.public_data_writes, cols, AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_PUBLIC_DATA_WRITES_ROW_IDX);
282
283 // Transaction fee
284 cols[0][AVM_PUBLIC_INPUTS_TRANSACTION_FEE_ROW_IDX] = transaction_fee;
285
286 // Reverted
287 cols[0][AVM_PUBLIC_INPUTS_REVERTED_ROW_IDX] = static_cast<uint8_t>(reverted);
288
289 return cols;
290}
291
292std::vector<FF> PublicInputs::columns_to_flat(std::vector<std::vector<FF>> const& columns)
293{
294 if (columns.size() != AVM_NUM_PUBLIC_INPUT_COLUMNS) {
295 throw std::invalid_argument("Public inputs columns count does not match the expected number of columns.");
296 }
297 std::vector<FF> flat;
298 flat.reserve(AVM_PUBLIC_INPUTS_COLUMNS_COMBINED_LENGTH);
299 for (size_t i = 0; i < AVM_NUM_PUBLIC_INPUT_COLUMNS; ++i) {
300 if (columns[i].size() != AVM_PUBLIC_INPUTS_COLUMN_LENGTHS[i]) {
301 throw std::invalid_argument("Public inputs column size does not match the expected per-column length.");
302 }
303 flat.insert(flat.end(), columns[i].begin(), columns[i].end());
304 }
305 return flat;
306}
307
308} // namespace bb::avm2
AvmProvingInputs inputs
AvmFlavorSettings::FF FF
Definition field.hpp:10
constexpr std::array< std::size_t, AVM_NUM_PUBLIC_INPUT_COLUMNS > AVM_PUBLIC_INPUTS_COLUMN_LENGTHS
Definition constants.hpp:19
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
std::byte * data
std::array< FF, MAX_NULLIFIERS_PER_TX > nullifiers
std::array< PublicDataWrite, MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX > public_data_writes
std::array< ScopedL2ToL1Message, MAX_L2_TO_L1_MSGS_PER_TX > l2_to_l1_msgs
std::array< FF, MAX_NOTE_HASHES_PER_TX > note_hashes
static AvmFastSimulationInputs from(const std::vector< uint8_t > &data)
Definition avm_io.cpp:129
static AvmProvingInputs from(const std::vector< uint8_t > &data)
Definition avm_io.cpp:122
std::array< FF, MAX_NOTE_HASHES_PER_TX > note_hashes
std::array< ScopedL2ToL1Message, MAX_L2_TO_L1_MSGS_PER_TX > l2_to_l1_msgs
std::array< FF, MAX_NULLIFIERS_PER_TX > nullifiers
PublicCallRequest public_teardown_call_request
Definition avm_io.hpp:41
PrivateToAvmAccumulatedDataArrayLengths previous_non_revertible_accumulated_data_array_lengths
Definition avm_io.hpp:42
static std::vector< FF > columns_to_flat(std::vector< std::vector< FF > > const &columns)
Definition avm_io.cpp:292
TreeSnapshots end_tree_snapshots
Definition avm_io.hpp:48
PrivateToAvmAccumulatedData previous_non_revertible_accumulated_data
Definition avm_io.hpp:44
std::vector< std::vector< FF > > to_columns() const
Serialization to columns.
Definition avm_io.cpp:142
GasSettings gas_settings
Definition avm_io.hpp:34
GlobalVariables global_variables
Definition avm_io.hpp:30
static PublicInputs from(const std::vector< uint8_t > &data)
Msgpack deserialization.
Definition avm_io.cpp:115
GasFees effective_gas_fees
Definition avm_io.hpp:35
PublicCallRequestArrayLengths public_call_request_array_lengths
Definition avm_io.hpp:38
AztecAddress fee_payer
Definition avm_io.hpp:36
TreeSnapshots start_tree_snapshots
Definition avm_io.hpp:32
std::array< PublicCallRequest, MAX_ENQUEUED_CALLS_PER_TX > public_app_logic_call_requests
Definition avm_io.hpp:40
ProtocolContracts protocol_contracts
Definition avm_io.hpp:31
AvmAccumulatedDataArrayLengths accumulated_data_array_lengths
Definition avm_io.hpp:50
PrivateToAvmAccumulatedDataArrayLengths previous_revertible_accumulated_data_array_lengths
Definition avm_io.hpp:43
std::array< PublicCallRequest, MAX_ENQUEUED_CALLS_PER_TX > public_setup_call_requests
Definition avm_io.hpp:39
AvmAccumulatedData accumulated_data
Definition avm_io.hpp:51
PrivateToAvmAccumulatedData previous_revertible_accumulated_data
Definition avm_io.hpp:45
AppendOnlyTreeSnapshot public_data_tree
AppendOnlyTreeSnapshot l1_to_l2_message_tree
AppendOnlyTreeSnapshot nullifier_tree
AppendOnlyTreeSnapshot note_hash_tree