Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
avm_inputs.cpp
Go to the documentation of this file.
2
3#include <vector>
4
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.nextAvailableLeafIndex;
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.daGas;
25 cols[1][row_idx] = gas.l2Gas;
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.feePerDaGas;
31 cols[1][row_idx] = gas_fees.feePerL2Gas;
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.msgSender;
39 cols[1][row_idx] = request.contractAddress;
40 cols[2][row_idx] = static_cast<uint8_t>(request.isStaticCall);
41 cols[3][row_idx] = request.calldataHash;
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].contractAddress;
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].leafSlot;
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.derivedAddresses, cols, protocol_contracts_start_row_idx);
107}
108
109} // anonymous namespace
110
114
115PublicInputs PublicInputs::from(const std::vector<uint8_t>& data)
116{
117 PublicInputs inputs;
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{
124 AvmProvingInputs inputs;
125 msgpack::unpack(reinterpret_cast<const char*>(data.data()), data.size()).get().convert(inputs);
126 return inputs;
127}
128
132
133// WARNING: If updating this columns conversion, you must also update columns serialization
134// in the Noir `AvmCircuitPublicInputs` struct in avm_circuit_public_inputs.nr
136{
138 std::vector<FF>(AVM_PUBLIC_INPUTS_COLUMNS_MAX_LENGTH, FF(0)));
139
140 // Global variables
149
150 // Protocol contracts
151 set_protocol_contracts_in_cols(protocolContracts, cols, AVM_PUBLIC_INPUTS_PROTOCOL_CONTRACTS_ROW_IDX);
152
153 // Start tree snapshots
154 set_snapshot_in_cols(startTreeSnapshots.l1ToL2MessageTree,
155 cols,
157 set_snapshot_in_cols(
159 set_snapshot_in_cols(
161 set_snapshot_in_cols(
163
164 // Start gas used
166
167 // Gas settings
171 set_gas_fees_in_cols(
173
174 // Effective gas fees
176
177 // Fee payer
179
180 // Prover id
182
183 // Public Call Request Array Lengths
189 static_cast<uint8_t>(publicCallRequestArrayLengths.teardownCall);
190
191 // Setup, app logic, and teardown call requests
192 set_public_call_request_array_in_cols(
194 set_public_call_request_array_in_cols(
196 set_public_call_request_in_cols(
198
199 // Previous non-revertible accumulated data array lengths
206
207 // Previous revertible accumulated data array lengths
214
215 // Previous non-revertible accumulated data
216 set_field_array_in_cols(previousNonRevertibleAccumulatedData.noteHashes,
217 cols,
219 set_field_array_in_cols(previousNonRevertibleAccumulatedData.nullifiers,
220 cols,
222 set_l2_to_l1_msg_array_in_cols(previousNonRevertibleAccumulatedData.l2ToL1Msgs,
223 cols,
225
226 // Previous revertible accumulated data
227 set_field_array_in_cols(previousRevertibleAccumulatedData.noteHashes,
228 cols,
230 set_field_array_in_cols(previousRevertibleAccumulatedData.nullifiers,
231 cols,
233 set_l2_to_l1_msg_array_in_cols(previousRevertibleAccumulatedData.l2ToL1Msgs,
234 cols,
236
237 // End tree snapshots
238 set_snapshot_in_cols(
240 set_snapshot_in_cols(
242 set_snapshot_in_cols(
244 set_snapshot_in_cols(
246
247 // End gas used
249
250 // Accumulated Data Array Lengths
259
260 // Accumulated data
261 set_field_array_in_cols(
263 set_field_array_in_cols(
265 set_l2_to_l1_msg_array_in_cols(
267 set_public_logs_in_cols(
269 set_public_data_writes_in_cols(
271
272 // Transaction fee
274
275 // Reverted
276 cols[0][AVM_PUBLIC_INPUTS_REVERTED_ROW_IDX] = static_cast<uint8_t>(reverted);
277
278 return cols;
279}
280
281std::vector<FF> PublicInputs::columns_to_flat(std::vector<std::vector<FF>> const& columns)
282{
283 std::vector<FF> flat;
284 for (const auto& col : columns) {
285 if (col.size() != AVM_PUBLIC_INPUTS_COLUMNS_MAX_LENGTH) {
286 throw std::invalid_argument("Public inputs column size does not match the expected max length.");
287 }
288 flat.insert(flat.end(), col.begin(), col.end());
289 }
290 return flat;
291}
292
293} // namespace bb::avm2
#define AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_ARRAY_LENGTHS_NOTE_HASHES_ROW_IDX
#define AVM_PUBLIC_INPUTS_PUBLIC_APP_LOGIC_CALL_REQUESTS_ROW_IDX
#define AVM_PUBLIC_INPUTS_GLOBAL_VARIABLES_GAS_FEES_ROW_IDX
#define AVM_PUBLIC_INPUTS_END_TREE_SNAPSHOTS_L1_TO_L2_MESSAGE_TREE_ROW_IDX
#define AVM_PUBLIC_INPUTS_EFFECTIVE_GAS_FEES_ROW_IDX
#define AVM_PUBLIC_INPUTS_PUBLIC_TEARDOWN_CALL_REQUEST_ROW_IDX
#define AVM_PUBLIC_INPUTS_FEE_PAYER_ROW_IDX
#define AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_L2_TO_L1_MSGS_ROW_IDX
#define AVM_PUBLIC_INPUTS_GLOBAL_VARIABLES_FEE_RECIPIENT_ROW_IDX
#define AVM_PUBLIC_INPUTS_PREVIOUS_NON_REVERTIBLE_ACCUMULATED_DATA_NULLIFIERS_ROW_IDX
#define AVM_PUBLIC_INPUTS_PROTOCOL_CONTRACTS_ROW_IDX
#define AVM_PUBLIC_INPUTS_PREVIOUS_REVERTIBLE_ACCUMULATED_DATA_ARRAY_LENGTHS_NULLIFIERS_ROW_IDX
#define AVM_PUBLIC_INPUTS_PREVIOUS_REVERTIBLE_ACCUMULATED_DATA_ARRAY_LENGTHS_NOTE_HASHES_ROW_IDX
#define AVM_PUBLIC_INPUTS_PREVIOUS_REVERTIBLE_ACCUMULATED_DATA_ARRAY_LENGTHS_L2_TO_L1_MSGS_ROW_IDX
#define AVM_PUBLIC_INPUTS_GLOBAL_VARIABLES_COINBASE_ROW_IDX
#define AVM_PUBLIC_INPUTS_PREVIOUS_NON_REVERTIBLE_ACCUMULATED_DATA_L2_TO_L1_MSGS_ROW_IDX
#define AVM_PUBLIC_INPUTS_GAS_SETTINGS_TEARDOWN_GAS_LIMITS_ROW_IDX
#define FLAT_PUBLIC_LOGS_HEADER_LENGTH
#define AVM_PUBLIC_INPUTS_TRANSACTION_FEE_ROW_IDX
#define AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_NULLIFIERS_ROW_IDX
#define AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_ARRAY_LENGTHS_L2_TO_L1_MSGS_ROW_IDX
#define AVM_PUBLIC_INPUTS_END_GAS_USED_ROW_IDX
#define AVM_PUBLIC_INPUTS_PREVIOUS_REVERTIBLE_ACCUMULATED_DATA_L2_TO_L1_MSGS_ROW_IDX
#define AVM_PUBLIC_INPUTS_PREVIOUS_NON_REVERTIBLE_ACCUMULATED_DATA_NOTE_HASHES_ROW_IDX
#define AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_ARRAY_LENGTHS_NULLIFIERS_ROW_IDX
#define AVM_PUBLIC_INPUTS_PROVER_ID_ROW_IDX
#define AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_ARRAY_LENGTHS_PUBLIC_DATA_WRITES_ROW_IDX
#define AVM_PUBLIC_INPUTS_START_TREE_SNAPSHOTS_L1_TO_L2_MESSAGE_TREE_ROW_IDX
#define AVM_PUBLIC_INPUTS_GLOBAL_VARIABLES_BLOCK_NUMBER_ROW_IDX
#define AVM_PUBLIC_INPUTS_PUBLIC_SETUP_CALL_REQUESTS_ROW_IDX
#define AVM_PUBLIC_INPUTS_END_TREE_SNAPSHOTS_NULLIFIER_TREE_ROW_IDX
#define AVM_PUBLIC_INPUTS_PUBLIC_CALL_REQUEST_ARRAY_LENGTHS_APP_LOGIC_CALLS_ROW_IDX
#define AVM_PUBLIC_INPUTS_PREVIOUS_NON_REVERTIBLE_ACCUMULATED_DATA_ARRAY_LENGTHS_NULLIFIERS_ROW_IDX
#define AVM_PUBLIC_INPUTS_START_TREE_SNAPSHOTS_NOTE_HASH_TREE_ROW_IDX
#define AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_NOTE_HASHES_ROW_IDX
#define AVM_PUBLIC_INPUTS_END_TREE_SNAPSHOTS_NOTE_HASH_TREE_ROW_IDX
#define AVM_PUBLIC_INPUTS_GLOBAL_VARIABLES_SLOT_NUMBER_ROW_IDX
#define AVM_PUBLIC_INPUTS_GLOBAL_VARIABLES_VERSION_ROW_IDX
#define AVM_PUBLIC_INPUTS_START_TREE_SNAPSHOTS_PUBLIC_DATA_TREE_ROW_IDX
#define AVM_PUBLIC_INPUTS_REVERTED_ROW_IDX
#define AVM_PUBLIC_INPUTS_PUBLIC_CALL_REQUEST_ARRAY_LENGTHS_TEARDOWN_CALL_ROW_IDX
#define AVM_PUBLIC_INPUTS_GLOBAL_VARIABLES_TIMESTAMP_ROW_IDX
#define AVM_PUBLIC_INPUTS_PREVIOUS_NON_REVERTIBLE_ACCUMULATED_DATA_ARRAY_LENGTHS_L2_TO_L1_MSGS_ROW_IDX
#define AVM_PUBLIC_INPUTS_GAS_SETTINGS_MAX_FEES_PER_GAS_ROW_IDX
#define AVM_PUBLIC_INPUTS_START_TREE_SNAPSHOTS_NULLIFIER_TREE_ROW_IDX
#define AVM_PUBLIC_INPUTS_START_GAS_USED_ROW_IDX
#define AVM_PUBLIC_INPUTS_PUBLIC_CALL_REQUEST_ARRAY_LENGTHS_SETUP_CALLS_ROW_IDX
#define AVM_PUBLIC_INPUTS_PREVIOUS_NON_REVERTIBLE_ACCUMULATED_DATA_ARRAY_LENGTHS_NOTE_HASHES_ROW_IDX
#define AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_PUBLIC_DATA_WRITES_ROW_IDX
#define AVM_PUBLIC_INPUTS_GLOBAL_VARIABLES_CHAIN_ID_ROW_IDX
#define AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_PUBLIC_LOGS_ROW_IDX
#define AVM_NUM_PUBLIC_INPUT_COLUMNS
#define AVM_PUBLIC_INPUTS_GAS_SETTINGS_GAS_LIMITS_ROW_IDX
#define AVM_PUBLIC_INPUTS_GAS_SETTINGS_MAX_PRIORITY_FEES_PER_GAS_ROW_IDX
#define AVM_PUBLIC_INPUTS_PREVIOUS_REVERTIBLE_ACCUMULATED_DATA_NOTE_HASHES_ROW_IDX
#define AVM_PUBLIC_INPUTS_PREVIOUS_REVERTIBLE_ACCUMULATED_DATA_NULLIFIERS_ROW_IDX
#define AVM_PUBLIC_INPUTS_COLUMNS_MAX_LENGTH
#define AVM_PUBLIC_INPUTS_END_TREE_SNAPSHOTS_PUBLIC_DATA_TREE_ROW_IDX
const std::vector< FF > data
AvmFlavorSettings::FF FF
Definition field.hpp:10
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
std::array< FF, MAX_NULLIFIERS_PER_TX > nullifiers
std::array< PublicDataWrite, MAX_TOTAL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX > publicDataWrites
std::array< ScopedL2ToL1Message, MAX_L2_TO_L1_MSGS_PER_TX > l2ToL1Msgs
std::array< FF, MAX_NOTE_HASHES_PER_TX > noteHashes
static AvmProvingInputs from(const std::vector< uint8_t > &data)
std::array< ScopedL2ToL1Message, MAX_L2_TO_L1_MSGS_PER_TX > l2ToL1Msgs
std::array< FF, MAX_NULLIFIERS_PER_TX > nullifiers
std::array< FF, MAX_NOTE_HASHES_PER_TX > noteHashes
GlobalVariables globalVariables
static std::vector< FF > columns_to_flat(std::vector< std::vector< FF > > const &columns)
TreeSnapshots startTreeSnapshots
PrivateToAvmAccumulatedData previousRevertibleAccumulatedData
PublicCallRequestArrayLengths publicCallRequestArrayLengths
PrivateToAvmAccumulatedData previousNonRevertibleAccumulatedData
TreeSnapshots endTreeSnapshots
AvmAccumulatedDataArrayLengths accumulatedDataArrayLengths
std::vector< std::vector< FF > > to_columns() const
Serialization to columns.
static PublicInputs from(const std::vector< uint8_t > &data)
Msgpack deserialization.
PublicCallRequest publicTeardownCallRequest
std::array< PublicCallRequest, MAX_ENQUEUED_CALLS_PER_TX > publicSetupCallRequests
PrivateToAvmAccumulatedDataArrayLengths previousNonRevertibleAccumulatedDataArrayLengths
AvmAccumulatedData accumulatedData
PrivateToAvmAccumulatedDataArrayLengths previousRevertibleAccumulatedDataArrayLengths
ProtocolContracts protocolContracts
std::array< PublicCallRequest, MAX_ENQUEUED_CALLS_PER_TX > publicAppLogicCallRequests
AppendOnlyTreeSnapshot noteHashTree
AppendOnlyTreeSnapshot nullifierTree
AppendOnlyTreeSnapshot l1ToL2MessageTree
AppendOnlyTreeSnapshot publicDataTree