1#include <gmock/gmock.h>
2#include <gtest/gtest.h>
9#include "barretenberg/aztec/aztec_constants.hpp"
16using ::testing::SizeIs;
18TEST(AvmInputsTest, Deserialization)
21 auto data =
read_file(
"../src/barretenberg/vm2/testing/avm_inputs.testdata.bin");
30TEST(AvmInputsTest, FormatTransformations)
32 using ::testing::AllOf;
33 using ::testing::ElementsAre;
36 auto as_cols = pi.to_columns();
40 EXPECT_THAT(as_cols, SizeIs(AVM_NUM_PUBLIC_INPUT_COLUMNS));
41 for (
size_t i = 0; i < AVM_NUM_PUBLIC_INPUT_COLUMNS; ++i) {
44 EXPECT_THAT(flattened, SizeIs(AVM_PUBLIC_INPUTS_COLUMNS_COMBINED_LENGTH));
46 EXPECT_EQ(as_cols, unflattened);
49TEST(AvmInputsTest, ValuesInColumns)
55 pi.global_variables.chain_id = 123;
56 pi.global_variables.version = 456;
57 pi.global_variables.block_number = 12345;
58 pi.global_variables.slot_number = 67890;
59 pi.global_variables.timestamp = 789000;
60 pi.global_variables.coinbase = 123123;
61 pi.global_variables.fee_recipient = 9876;
64 pi.global_variables.gas_fees.fee_per_da_gas = 111;
65 pi.global_variables.gas_fees.fee_per_l2_gas = 222;
68 pi.start_tree_snapshots.l1_to_l2_message_tree.root = 1000;
69 pi.start_tree_snapshots.l1_to_l2_message_tree.next_available_leaf_index = 2000;
70 pi.start_tree_snapshots.note_hash_tree.root = 3000;
71 pi.start_tree_snapshots.note_hash_tree.next_available_leaf_index = 4000;
72 pi.start_tree_snapshots.nullifier_tree.root = 5000;
73 pi.start_tree_snapshots.nullifier_tree.next_available_leaf_index = 6000;
74 pi.start_tree_snapshots.public_data_tree.root = 7000;
75 pi.start_tree_snapshots.public_data_tree.next_available_leaf_index = 8000;
78 pi.start_gas_used.da_gas = 100;
79 pi.start_gas_used.l2_gas = 200;
82 pi.gas_settings.gas_limits.da_gas = 1234;
83 pi.gas_settings.gas_limits.l2_gas = 5678;
84 pi.gas_settings.teardown_gas_limits.da_gas = 9012;
85 pi.gas_settings.teardown_gas_limits.l2_gas = 3456;
86 pi.gas_settings.max_fees_per_gas.fee_per_da_gas = 7890;
87 pi.gas_settings.max_fees_per_gas.fee_per_l2_gas = 1234;
88 pi.gas_settings.max_priority_fees_per_gas.fee_per_da_gas = 5678;
89 pi.gas_settings.max_priority_fees_per_gas.fee_per_l2_gas = 9012;
95 pi.public_call_request_array_lengths.setup_calls = 2;
96 pi.public_call_request_array_lengths.app_logic_calls = 3;
97 pi.public_call_request_array_lengths.teardown_call =
true;
100 pi.public_setup_call_requests[0].msg_sender = 1111;
101 pi.public_setup_call_requests[0].contract_address = 2222;
102 pi.public_setup_call_requests[0].is_static_call =
true;
103 pi.public_setup_call_requests[0].calldata_hash = 3333;
105 pi.public_app_logic_call_requests[1].msg_sender = 4444;
106 pi.public_app_logic_call_requests[1].contract_address = 5555;
107 pi.public_app_logic_call_requests[1].is_static_call =
false;
108 pi.public_app_logic_call_requests[1].calldata_hash = 6666;
110 pi.public_teardown_call_request.msg_sender = 7777;
111 pi.public_teardown_call_request.contract_address = 8888;
112 pi.public_teardown_call_request.is_static_call =
true;
113 pi.public_teardown_call_request.calldata_hash = 9999;
116 pi.previous_non_revertible_accumulated_data_array_lengths.note_hashes = 10;
117 pi.previous_non_revertible_accumulated_data_array_lengths.nullifiers = 20;
118 pi.previous_non_revertible_accumulated_data_array_lengths.l2_to_l1_msgs = 30;
120 pi.previous_revertible_accumulated_data_array_lengths.note_hashes = 40;
121 pi.previous_revertible_accumulated_data_array_lengths.nullifiers = 50;
122 pi.previous_revertible_accumulated_data_array_lengths.l2_to_l1_msgs = 60;
125 pi.previous_non_revertible_accumulated_data.l2_to_l1_msgs[0].message.recipient = 1234;
126 pi.previous_non_revertible_accumulated_data.l2_to_l1_msgs[0].message.content = 1357;
127 pi.previous_non_revertible_accumulated_data.l2_to_l1_msgs[0].contract_address = 3579;
130 pi.accumulated_data.note_hashes[2] = 54321;
131 pi.accumulated_data.nullifiers[3] = 98765;
134 pi.accumulated_data.l2_to_l1_msgs[1].message.recipient = 3333;
135 pi.accumulated_data.l2_to_l1_msgs[1].message.content = 7531;
136 pi.accumulated_data.l2_to_l1_msgs[1].contract_address = 9753;
139 std::vector<FF> public_log_fields;
140 public_log_fields.reserve(3);
141 for (
size_t j = 0; j < 3; ++j) {
142 public_log_fields.push_back(10000 + j);
144 pi.accumulated_data.public_logs.add_log({
145 .fields = public_log_fields,
146 .contract_address = 11223,
150 pi.accumulated_data.public_data_writes[1].leaf_slot = 5555;
151 pi.accumulated_data.public_data_writes[1].value = 6666;
154 pi.end_gas_used.da_gas = 5000;
155 pi.end_gas_used.l2_gas = 7000;
158 pi.end_tree_snapshots.l1_to_l2_message_tree.root = 10000;
159 pi.end_tree_snapshots.l1_to_l2_message_tree.next_available_leaf_index = 20000;
160 pi.end_tree_snapshots.note_hash_tree.root = 30000;
161 pi.end_tree_snapshots.note_hash_tree.next_available_leaf_index = 40000;
162 pi.end_tree_snapshots.nullifier_tree.root = 50000;
163 pi.end_tree_snapshots.nullifier_tree.next_available_leaf_index = 60000;
164 pi.end_tree_snapshots.public_data_tree.root = 70000;
165 pi.end_tree_snapshots.public_data_tree.next_available_leaf_index = 80000;
168 pi.transaction_fee = 9876;
171 pi.accumulated_data_array_lengths.note_hashes = 3;
172 pi.accumulated_data_array_lengths.nullifiers = 4;
173 pi.accumulated_data_array_lengths.l2_to_l1_msgs = 2;
174 pi.accumulated_data_array_lengths.public_data_writes = 5;
180 auto columns = pi.to_columns();
184 EXPECT_THAT(flat, SizeIs(AVM_PUBLIC_INPUTS_COLUMNS_COMBINED_LENGTH));
187 const size_t col0_offset = 0;
195 EXPECT_EQ(flat[col0_offset + AVM_PUBLIC_INPUTS_GLOBAL_VARIABLES_CHAIN_ID_ROW_IDX], pi.global_variables.chain_id);
196 EXPECT_EQ(flat[col0_offset + AVM_PUBLIC_INPUTS_GLOBAL_VARIABLES_VERSION_ROW_IDX], pi.global_variables.version);
197 EXPECT_EQ(flat[col0_offset + AVM_PUBLIC_INPUTS_GLOBAL_VARIABLES_BLOCK_NUMBER_ROW_IDX],
198 pi.global_variables.block_number);
199 EXPECT_EQ(flat[col0_offset + AVM_PUBLIC_INPUTS_GLOBAL_VARIABLES_SLOT_NUMBER_ROW_IDX],
200 pi.global_variables.slot_number);
201 EXPECT_EQ(flat[col0_offset + AVM_PUBLIC_INPUTS_GLOBAL_VARIABLES_TIMESTAMP_ROW_IDX], pi.global_variables.timestamp);
202 EXPECT_EQ(flat[col0_offset + AVM_PUBLIC_INPUTS_GLOBAL_VARIABLES_FEE_RECIPIENT_ROW_IDX],
203 pi.global_variables.fee_recipient);
204 EXPECT_EQ(flat[col0_offset + AVM_PUBLIC_INPUTS_GLOBAL_VARIABLES_GAS_FEES_ROW_IDX],
205 pi.global_variables.gas_fees.fee_per_da_gas);
206 EXPECT_EQ(flat[col1_offset + AVM_PUBLIC_INPUTS_GLOBAL_VARIABLES_GAS_FEES_ROW_IDX],
207 pi.global_variables.gas_fees.fee_per_l2_gas);
208 EXPECT_EQ(flat[col0_offset + AVM_PUBLIC_INPUTS_GLOBAL_VARIABLES_COINBASE_ROW_IDX], pi.global_variables.coinbase);
211 EXPECT_EQ(flat[col0_offset + AVM_PUBLIC_INPUTS_START_TREE_SNAPSHOTS_L1_TO_L2_MESSAGE_TREE_ROW_IDX],
212 pi.start_tree_snapshots.l1_to_l2_message_tree.root);
213 EXPECT_EQ(flat[col1_offset + AVM_PUBLIC_INPUTS_START_TREE_SNAPSHOTS_L1_TO_L2_MESSAGE_TREE_ROW_IDX],
214 pi.start_tree_snapshots.l1_to_l2_message_tree.next_available_leaf_index);
215 EXPECT_EQ(flat[col0_offset + AVM_PUBLIC_INPUTS_START_TREE_SNAPSHOTS_NOTE_HASH_TREE_ROW_IDX],
216 pi.start_tree_snapshots.note_hash_tree.root);
217 EXPECT_EQ(flat[col1_offset + AVM_PUBLIC_INPUTS_START_TREE_SNAPSHOTS_NOTE_HASH_TREE_ROW_IDX],
218 pi.start_tree_snapshots.note_hash_tree.next_available_leaf_index);
219 EXPECT_EQ(flat[col0_offset + AVM_PUBLIC_INPUTS_START_TREE_SNAPSHOTS_NULLIFIER_TREE_ROW_IDX],
220 pi.start_tree_snapshots.nullifier_tree.root);
221 EXPECT_EQ(flat[col1_offset + AVM_PUBLIC_INPUTS_START_TREE_SNAPSHOTS_NULLIFIER_TREE_ROW_IDX],
222 pi.start_tree_snapshots.nullifier_tree.next_available_leaf_index);
223 EXPECT_EQ(flat[col0_offset + AVM_PUBLIC_INPUTS_START_TREE_SNAPSHOTS_PUBLIC_DATA_TREE_ROW_IDX],
224 pi.start_tree_snapshots.public_data_tree.root);
225 EXPECT_EQ(flat[col1_offset + AVM_PUBLIC_INPUTS_START_TREE_SNAPSHOTS_PUBLIC_DATA_TREE_ROW_IDX],
226 pi.start_tree_snapshots.public_data_tree.next_available_leaf_index);
229 EXPECT_EQ(flat[col0_offset + AVM_PUBLIC_INPUTS_START_GAS_USED_ROW_IDX], pi.start_gas_used.da_gas);
230 EXPECT_EQ(flat[col1_offset + AVM_PUBLIC_INPUTS_START_GAS_USED_ROW_IDX], pi.start_gas_used.l2_gas);
233 EXPECT_EQ(flat[col0_offset + AVM_PUBLIC_INPUTS_GAS_SETTINGS_GAS_LIMITS_ROW_IDX], pi.gas_settings.gas_limits.da_gas);
234 EXPECT_EQ(flat[col1_offset + AVM_PUBLIC_INPUTS_GAS_SETTINGS_GAS_LIMITS_ROW_IDX], pi.gas_settings.gas_limits.l2_gas);
235 EXPECT_EQ(flat[col0_offset + AVM_PUBLIC_INPUTS_GAS_SETTINGS_TEARDOWN_GAS_LIMITS_ROW_IDX],
236 pi.gas_settings.teardown_gas_limits.da_gas);
237 EXPECT_EQ(flat[col1_offset + AVM_PUBLIC_INPUTS_GAS_SETTINGS_TEARDOWN_GAS_LIMITS_ROW_IDX],
238 pi.gas_settings.teardown_gas_limits.l2_gas);
239 EXPECT_EQ(flat[col0_offset + AVM_PUBLIC_INPUTS_GAS_SETTINGS_MAX_FEES_PER_GAS_ROW_IDX],
240 pi.gas_settings.max_fees_per_gas.fee_per_da_gas);
241 EXPECT_EQ(flat[col1_offset + AVM_PUBLIC_INPUTS_GAS_SETTINGS_MAX_FEES_PER_GAS_ROW_IDX],
242 pi.gas_settings.max_fees_per_gas.fee_per_l2_gas);
243 EXPECT_EQ(flat[col0_offset + AVM_PUBLIC_INPUTS_GAS_SETTINGS_MAX_PRIORITY_FEES_PER_GAS_ROW_IDX],
244 pi.gas_settings.max_priority_fees_per_gas.fee_per_da_gas);
245 EXPECT_EQ(flat[col1_offset + AVM_PUBLIC_INPUTS_GAS_SETTINGS_MAX_PRIORITY_FEES_PER_GAS_ROW_IDX],
246 pi.gas_settings.max_priority_fees_per_gas.fee_per_l2_gas);
249 EXPECT_EQ(flat[col0_offset + AVM_PUBLIC_INPUTS_FEE_PAYER_ROW_IDX], pi.fee_payer);
252 EXPECT_EQ(flat[col0_offset + AVM_PUBLIC_INPUTS_PUBLIC_CALL_REQUEST_ARRAY_LENGTHS_SETUP_CALLS_ROW_IDX],
253 pi.public_call_request_array_lengths.setup_calls);
254 EXPECT_EQ(flat[col0_offset + AVM_PUBLIC_INPUTS_PUBLIC_CALL_REQUEST_ARRAY_LENGTHS_APP_LOGIC_CALLS_ROW_IDX],
255 pi.public_call_request_array_lengths.app_logic_calls);
256 EXPECT_EQ(flat[col0_offset + AVM_PUBLIC_INPUTS_PUBLIC_CALL_REQUEST_ARRAY_LENGTHS_TEARDOWN_CALL_ROW_IDX],
257 static_cast<uint8_t
>(pi.public_call_request_array_lengths.teardown_call));
260 size_t setup_row = AVM_PUBLIC_INPUTS_PUBLIC_SETUP_CALL_REQUESTS_ROW_IDX;
261 EXPECT_EQ(flat[col0_offset + setup_row], pi.public_setup_call_requests[0].msg_sender);
262 EXPECT_EQ(flat[col1_offset + setup_row], pi.public_setup_call_requests[0].contract_address);
263 EXPECT_EQ(flat[col2_offset + setup_row],
static_cast<uint8_t
>(pi.public_setup_call_requests[0].is_static_call));
264 EXPECT_EQ(flat[col3_offset + setup_row], pi.public_setup_call_requests[0].calldata_hash);
266 size_t app_logic_row = AVM_PUBLIC_INPUTS_PUBLIC_APP_LOGIC_CALL_REQUESTS_ROW_IDX + 1;
267 EXPECT_EQ(flat[col0_offset + app_logic_row], pi.public_app_logic_call_requests[1].msg_sender);
268 EXPECT_EQ(flat[col1_offset + app_logic_row], pi.public_app_logic_call_requests[1].contract_address);
269 EXPECT_EQ(flat[col2_offset + app_logic_row],
270 static_cast<uint8_t
>(pi.public_app_logic_call_requests[1].is_static_call));
271 EXPECT_EQ(flat[col3_offset + app_logic_row], pi.public_app_logic_call_requests[1].calldata_hash);
273 size_t teardown_row = AVM_PUBLIC_INPUTS_PUBLIC_TEARDOWN_CALL_REQUEST_ROW_IDX;
274 EXPECT_EQ(flat[col0_offset + teardown_row], pi.public_teardown_call_request.msg_sender);
275 EXPECT_EQ(flat[col1_offset + teardown_row], pi.public_teardown_call_request.contract_address);
276 EXPECT_EQ(flat[col2_offset + teardown_row],
static_cast<uint8_t
>(pi.public_teardown_call_request.is_static_call));
277 EXPECT_EQ(flat[col3_offset + teardown_row], pi.public_teardown_call_request.calldata_hash);
280 EXPECT_EQ(flat[col0_offset +
281 AVM_PUBLIC_INPUTS_PREVIOUS_NON_REVERTIBLE_ACCUMULATED_DATA_ARRAY_LENGTHS_NOTE_HASHES_ROW_IDX],
282 pi.previous_non_revertible_accumulated_data_array_lengths.note_hashes);
284 flat[col0_offset + AVM_PUBLIC_INPUTS_PREVIOUS_NON_REVERTIBLE_ACCUMULATED_DATA_ARRAY_LENGTHS_NULLIFIERS_ROW_IDX],
285 pi.previous_non_revertible_accumulated_data_array_lengths.nullifiers);
286 EXPECT_EQ(flat[col0_offset +
287 AVM_PUBLIC_INPUTS_PREVIOUS_NON_REVERTIBLE_ACCUMULATED_DATA_ARRAY_LENGTHS_L2_TO_L1_MSGS_ROW_IDX],
288 pi.previous_non_revertible_accumulated_data_array_lengths.l2_to_l1_msgs);
292 flat[col0_offset + AVM_PUBLIC_INPUTS_PREVIOUS_REVERTIBLE_ACCUMULATED_DATA_ARRAY_LENGTHS_NOTE_HASHES_ROW_IDX],
293 pi.previous_revertible_accumulated_data_array_lengths.note_hashes);
295 flat[col0_offset + AVM_PUBLIC_INPUTS_PREVIOUS_REVERTIBLE_ACCUMULATED_DATA_ARRAY_LENGTHS_NULLIFIERS_ROW_IDX],
296 pi.previous_revertible_accumulated_data_array_lengths.nullifiers);
298 flat[col0_offset + AVM_PUBLIC_INPUTS_PREVIOUS_REVERTIBLE_ACCUMULATED_DATA_ARRAY_LENGTHS_L2_TO_L1_MSGS_ROW_IDX],
299 pi.previous_revertible_accumulated_data_array_lengths.l2_to_l1_msgs);
302 EXPECT_EQ(flat[col0_offset + AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_ARRAY_LENGTHS_NOTE_HASHES_ROW_IDX],
303 pi.accumulated_data_array_lengths.note_hashes);
304 EXPECT_EQ(flat[col0_offset + AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_ARRAY_LENGTHS_NULLIFIERS_ROW_IDX],
305 pi.accumulated_data_array_lengths.nullifiers);
306 EXPECT_EQ(flat[col0_offset + AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_ARRAY_LENGTHS_L2_TO_L1_MSGS_ROW_IDX],
307 pi.accumulated_data_array_lengths.l2_to_l1_msgs);
308 EXPECT_EQ(flat[col0_offset + AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_ARRAY_LENGTHS_PUBLIC_DATA_WRITES_ROW_IDX],
309 pi.accumulated_data_array_lengths.public_data_writes);
312 size_t l2_to_l1_msg_row = AVM_PUBLIC_INPUTS_PREVIOUS_NON_REVERTIBLE_ACCUMULATED_DATA_L2_TO_L1_MSGS_ROW_IDX;
313 EXPECT_EQ(flat[col0_offset + l2_to_l1_msg_row],
314 pi.previous_non_revertible_accumulated_data.l2_to_l1_msgs[0].message.recipient);
315 EXPECT_EQ(flat[col1_offset + l2_to_l1_msg_row],
316 pi.previous_non_revertible_accumulated_data.l2_to_l1_msgs[0].message.content);
317 EXPECT_EQ(flat[col2_offset + l2_to_l1_msg_row],
318 pi.previous_non_revertible_accumulated_data.l2_to_l1_msgs[0].contract_address);
321 EXPECT_EQ(flat[col0_offset + AVM_PUBLIC_INPUTS_END_TREE_SNAPSHOTS_L1_TO_L2_MESSAGE_TREE_ROW_IDX],
322 pi.end_tree_snapshots.l1_to_l2_message_tree.root);
323 EXPECT_EQ(flat[col1_offset + AVM_PUBLIC_INPUTS_END_TREE_SNAPSHOTS_L1_TO_L2_MESSAGE_TREE_ROW_IDX],
324 pi.end_tree_snapshots.l1_to_l2_message_tree.next_available_leaf_index);
325 EXPECT_EQ(flat[col0_offset + AVM_PUBLIC_INPUTS_END_TREE_SNAPSHOTS_NOTE_HASH_TREE_ROW_IDX],
326 pi.end_tree_snapshots.note_hash_tree.root);
327 EXPECT_EQ(flat[col1_offset + AVM_PUBLIC_INPUTS_END_TREE_SNAPSHOTS_NOTE_HASH_TREE_ROW_IDX],
328 pi.end_tree_snapshots.note_hash_tree.next_available_leaf_index);
331 EXPECT_EQ(flat[col0_offset + AVM_PUBLIC_INPUTS_END_GAS_USED_ROW_IDX], pi.end_gas_used.da_gas);
332 EXPECT_EQ(flat[col1_offset + AVM_PUBLIC_INPUTS_END_GAS_USED_ROW_IDX], pi.end_gas_used.l2_gas);
335 EXPECT_EQ(flat[col0_offset + AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_NOTE_HASHES_ROW_IDX + 2],
336 pi.accumulated_data.note_hashes[2]);
337 EXPECT_EQ(flat[col0_offset + AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_NULLIFIERS_ROW_IDX + 3],
338 pi.accumulated_data.nullifiers[3]);
341 size_t acc_l2_to_l1_msg_row = AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_L2_TO_L1_MSGS_ROW_IDX + 1;
342 EXPECT_EQ(flat[col0_offset + acc_l2_to_l1_msg_row], pi.accumulated_data.l2_to_l1_msgs[1].message.recipient);
343 EXPECT_EQ(flat[col1_offset + acc_l2_to_l1_msg_row], pi.accumulated_data.l2_to_l1_msgs[1].message.content);
344 EXPECT_EQ(flat[col2_offset + acc_l2_to_l1_msg_row], pi.accumulated_data.l2_to_l1_msgs[1].contract_address);
347 size_t public_logs_row = AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_PUBLIC_LOGS_ROW_IDX;
349 EXPECT_EQ(flat[col0_offset + public_logs_row], pi.accumulated_data.public_logs.length);
351 for (
size_t j = 0; j < 3; ++j) {
352 EXPECT_EQ(flat[col0_offset + public_logs_row + FLAT_PUBLIC_LOGS_HEADER_LENGTH + j],
353 pi.accumulated_data.public_logs.payload[j]);
357 size_t public_data_write_row = AVM_PUBLIC_INPUTS_AVM_ACCUMULATED_DATA_PUBLIC_DATA_WRITES_ROW_IDX + 1;
358 EXPECT_EQ(flat[col0_offset + public_data_write_row], pi.accumulated_data.public_data_writes[1].leaf_slot);
359 EXPECT_EQ(flat[col1_offset + public_data_write_row], pi.accumulated_data.public_data_writes[1].value);
362 EXPECT_EQ(flat[col0_offset + AVM_PUBLIC_INPUTS_TRANSACTION_FEE_ROW_IDX], pi.transaction_fee);
365 EXPECT_EQ(flat[col0_offset + AVM_PUBLIC_INPUTS_REVERTED_ROW_IDX],
static_cast<uint8_t
>(pi.reverted));
370TEST(AvmInputsTest, ToColumnsPerColumnLengthsAreTight)
374 pi.accumulated_data.public_data_writes.back().value = 0xdead;
375 pi.accumulated_data.l2_to_l1_msgs.back().contract_address = 0xbeef;
376 pi.public_teardown_call_request.calldata_hash = 0xcafe;
378 auto cols = pi.to_columns();
380 for (
size_t i = 0; i < AVM_NUM_PUBLIC_INPUT_COLUMNS; ++i) {
383 EXPECT_NE(cols[i].back(),
FF(0)) <<
"column " << i <<
" last row is unexpectedly zero";
std::pair< tracegen::TraceContainer, PublicInputs > get_minimal_trace_with_pi()
constexpr std::array< std::size_t, AVM_NUM_PUBLIC_INPUT_COLUMNS > AVM_PUBLIC_INPUTS_COLUMN_LENGTHS
std::vector< uint8_t > read_file(const std::string &filename, size_t bytes=0)
TEST(BoomerangMegaCircuitBuilder, BasicCircuit)