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
6
7namespace bb::avm2 {
8namespace {
9
14
15void set_snapshot_in_cols(const AppendOnlyTreeSnapshot& snapshot, std::vector<std::vector<FF>>& cols, size_t row_idx)
16{
17 cols[0][row_idx] = snapshot.root;
18 cols[1][row_idx] = snapshot.nextAvailableLeafIndex;
19}
20
21void set_gas_in_cols(const Gas& gas, std::vector<std::vector<FF>>& cols, size_t row_idx)
22{
23 cols[0][row_idx] = gas.daGas;
24 cols[1][row_idx] = gas.l2Gas;
25}
26
27void set_gas_fees_in_cols(const GasFees& gas_fees, std::vector<std::vector<FF>>& cols, size_t row_idx)
28{
29 cols[0][row_idx] = gas_fees.feePerDaGas;
30 cols[1][row_idx] = gas_fees.feePerL2Gas;
31}
32
33void set_public_call_request_in_cols(const PublicCallRequest& request,
34 std::vector<std::vector<FF>>& cols,
35 size_t row_idx)
36{
37 cols[0][row_idx] = request.msgSender;
38 cols[1][row_idx] = request.contractAddress;
39 cols[2][row_idx] = static_cast<uint8_t>(request.isStaticCall);
40 cols[3][row_idx] = request.calldataHash;
41}
42
43void set_public_call_request_array_in_cols(const std::array<PublicCallRequest, MAX_ENQUEUED_CALLS_PER_TX>& requests,
44 std::vector<std::vector<FF>>& cols,
45 size_t array_start_row_idx)
46{
47 for (size_t i = 0; i < requests.size(); ++i) {
48 size_t row = array_start_row_idx + i;
49 set_public_call_request_in_cols(requests[i], cols, row);
50 }
51}
52
53template <size_t SIZE>
54void set_field_array_in_cols(const std::array<FF, SIZE>& arr,
55 std::vector<std::vector<FF>>& cols,
56 size_t array_start_row_idx)
57{
58 for (size_t i = 0; i < arr.size(); ++i) {
59 size_t row = array_start_row_idx + i;
60 cols[0][row] = arr[i];
61 }
62}
63
64template <size_t SIZE>
65void set_l2_to_l1_msg_array_in_cols(const std::array<ScopedL2ToL1Message, SIZE>& arr,
66 std::vector<std::vector<FF>>& cols,
67 size_t array_start_row_idx)
68{
69 for (size_t i = 0; i < arr.size(); ++i) {
70 size_t row = array_start_row_idx + i;
71 cols[0][row] = arr[i].message.recipient;
72 cols[1][row] = arr[i].message.content;
73 cols[2][row] = arr[i].contractAddress;
74 }
75}
76
77template <size_t SIZE>
78void set_public_logs_in_cols(const std::array<PublicLog, SIZE>& logs,
79 std::vector<std::vector<FF>>& cols,
80 size_t array_start_row_idx)
81{
82 for (size_t i = 0; i < logs.size(); ++i) {
83 size_t first_row_for_log = array_start_row_idx + (i * PUBLIC_LOG_SIZE_IN_FIELDS);
84 for (size_t j = 0; j < PUBLIC_LOG_SIZE_IN_FIELDS; ++j) {
85 // always set contract address in col 0 so that some entry in the row is always non-zero
86 cols[0][first_row_for_log + j] = logs[i].contractAddress;
87 cols[1][first_row_for_log + j] = logs[i].emittedLength;
88 // and set the actual log data entry
89 cols[2][first_row_for_log + j] = logs[i].fields[j];
90 }
91 }
92}
93
94template <size_t SIZE>
95void set_public_data_writes_in_cols(const std::array<PublicDataWrite, SIZE>& writes,
96 std::vector<std::vector<FF>>& cols,
97 size_t array_start_row_idx)
98{
99 for (size_t i = 0; i < writes.size(); ++i) {
100 size_t row = array_start_row_idx + i;
101 cols[0][row] = writes[i].leafSlot;
102 cols[1][row] = writes[i].value;
103 }
104}
105
106} // anonymous namespace
107
111
112PublicInputs PublicInputs::from(const std::vector<uint8_t>& data)
113{
114 PublicInputs inputs;
115 msgpack::unpack(reinterpret_cast<const char*>(data.data()), data.size()).get().convert(inputs);
116 return inputs;
117}
118
119AvmProvingInputs AvmProvingInputs::from(const std::vector<uint8_t>& data)
120{
121 AvmProvingInputs inputs;
122 msgpack::unpack(reinterpret_cast<const char*>(data.data()), data.size()).get().convert(inputs);
123 return inputs;
124}
125
129
130// WARNING: If updating this columns conversion, you must also update columns serialization
131// in the Noir `AvmCircuitPublicInputs` struct in avm_circuit_public_inputs.nr
133{
135 std::vector<FF>(AVM_PUBLIC_INPUTS_COLUMNS_MAX_LENGTH, FF(0)));
136
137 // Global variables
146
147 // Start tree snapshots
148 set_snapshot_in_cols(startTreeSnapshots.l1ToL2MessageTree,
149 cols,
151 set_snapshot_in_cols(
153 set_snapshot_in_cols(
155 set_snapshot_in_cols(
157
158 // Start gas used
160
161 // Gas settings
165 set_gas_fees_in_cols(
167
168 // Effective gas fees
170
171 // Fee payer
173
174 // Public Call Request Array Lengths
180 static_cast<uint8_t>(publicCallRequestArrayLengths.teardownCall);
181
182 // Setup, app logic, and teardown call requests
183 set_public_call_request_array_in_cols(
185 set_public_call_request_array_in_cols(
187 set_public_call_request_in_cols(
189
190 // Previous non-revertible accumulated data array lengths
197
198 // Previous revertible accumulated data array lengths
205
206 // Previous non-revertible accumulated data
207 set_field_array_in_cols(previousNonRevertibleAccumulatedData.noteHashes,
208 cols,
210 set_field_array_in_cols(previousNonRevertibleAccumulatedData.nullifiers,
211 cols,
213 set_l2_to_l1_msg_array_in_cols(previousNonRevertibleAccumulatedData.l2ToL1Msgs,
214 cols,
216
217 // Previous revertible accumulated data
218 set_field_array_in_cols(previousRevertibleAccumulatedData.noteHashes,
219 cols,
221 set_field_array_in_cols(previousRevertibleAccumulatedData.nullifiers,
222 cols,
224 set_l2_to_l1_msg_array_in_cols(previousRevertibleAccumulatedData.l2ToL1Msgs,
225 cols,
227
228 // End tree snapshots
229 set_snapshot_in_cols(
231 set_snapshot_in_cols(
233 set_snapshot_in_cols(
235 set_snapshot_in_cols(
237
238 // End gas used
240
241 // Accumulated Data Array Lengths
252
253 // Accumulated data
254 set_field_array_in_cols(
256 set_field_array_in_cols(
258 set_l2_to_l1_msg_array_in_cols(
260 set_public_logs_in_cols(
262 set_public_data_writes_in_cols(
264
265 // Transaction fee
267
268 // Reverted
269 cols[0][AVM_PUBLIC_INPUTS_REVERTED_ROW_IDX] = static_cast<uint8_t>(reverted);
270
271 return cols;
272}
273
274std::vector<FF> PublicInputs::columns_to_flat(std::vector<std::vector<FF>> const& columns)
275{
276 std::vector<FF> flat;
277 for (const auto& col : columns) {
278 if (col.size() != AVM_PUBLIC_INPUTS_COLUMNS_MAX_LENGTH) {
279 throw std::invalid_argument("Public inputs column size does not match the expected max length.");
280 }
281 flat.insert(flat.end(), col.begin(), col.end());
282 }
283 return flat;
284}
285
286} // 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_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 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_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_AVM_ACCUMULATED_DATA_ARRAY_LENGTHS_PUBLIC_LOGS_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 PUBLIC_LOG_SIZE_IN_FIELDS
#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< PublicLog, MAX_PUBLIC_LOGS_PER_TX > publicLogs
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
std::array< PublicCallRequest, MAX_ENQUEUED_CALLS_PER_TX > publicAppLogicCallRequests
AppendOnlyTreeSnapshot noteHashTree
AppendOnlyTreeSnapshot nullifierTree
AppendOnlyTreeSnapshot l1ToL2MessageTree
AppendOnlyTreeSnapshot publicDataTree