Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
acir_integration.test.cpp
Go to the documentation of this file.
2#ifndef __wasm__
10
11#include <filesystem>
12#include <gtest/gtest.h>
13
14// #define LOG_SIZES
15
16using namespace bb;
17class AcirIntegrationTest : public ::testing::Test {
18 public:
19 static std::vector<uint8_t> get_bytecode(const std::string& bytecodePath)
20 {
21 std::filesystem::path filePath = bytecodePath;
22 if (filePath.extension() == ".json") {
23 // Try reading json files as if they are a Nargo build artifact
24 std::string command = "jq -r '.bytecode' \"" + bytecodePath + "\" | base64 -d | gunzip -c";
25 return exec_pipe(command);
26 }
27
28 // For other extensions, assume file is a raw ACIR program
29 std::string command = "gunzip -c \"" + bytecodePath + "\"";
30 return exec_pipe(command);
31 }
32
33 // Function to check if a file exists
34 static bool file_exists(const std::string& path)
35 {
36 std::ifstream file(path);
37 return file.good();
38 }
39
40 static acir_format::AcirProgramStack get_program_stack_data_from_test_file(const std::string& test_program_name)
41 {
42 std::string base_path = "../../acir_tests/acir_tests/" + test_program_name + "/target";
43 std::string bytecode_path = base_path + "/program.json";
44 std::string witness_path = base_path + "/witness.gz";
45
46 return acir_format::get_acir_program_stack(bytecode_path, witness_path);
47 }
48
49 static acir_format::AcirProgram get_program_data_from_test_file(const std::string& test_program_name)
50 {
51 auto program_stack = get_program_stack_data_from_test_file(test_program_name);
52 BB_ASSERT_EQ(program_stack.size(),
53 static_cast<size_t>(1)); // Otherwise this method will not return full stack data
54
55 return program_stack.back();
56 }
57
59 {
60 using Prover = UltraProver_<Flavor>;
61 using Verifier = UltraVerifier_<Flavor>;
63
65 auto verification_key = std::make_shared<VerificationKey>(proving_key->get_precomputed());
66 Prover prover{ proving_key, verification_key };
67#ifdef LOG_SIZES
68 builder.blocks.summarize();
69 info("num gates = ", builder.get_estimated_num_finalized_gates());
70 info("total circuit size = ", builder.get_estimated_total_circuit_size());
71 info("circuit size = ", prover.proving_key->dyadic_size());
72 info("log circuit size = ", prover.proving_key->log_dyadic_size());
73#endif
74 auto proof = prover.construct_proof();
75
76 // Verify Honk proof
77 Verifier verifier{ verification_key };
78 bool result = verifier.template verify_proof<DefaultIO>(proof).result;
79
80 return result;
81 }
82
83 void add_some_simple_RAM_gates(auto& circuit)
84 {
85 std::array<uint32_t, 3> ram_values{ circuit.add_variable(5),
86 circuit.add_variable(10),
87 circuit.add_variable(20) };
88
89 size_t ram_id = circuit.create_RAM_array(3);
90
91 for (size_t i = 0; i < 3; ++i) {
92 circuit.init_RAM_element(ram_id, i, ram_values[i]);
93 }
94
95 auto val_idx_1 = circuit.read_RAM_array(ram_id, circuit.add_variable(1));
96 auto val_idx_2 = circuit.read_RAM_array(ram_id, circuit.add_variable(2));
97 auto val_idx_3 = circuit.read_RAM_array(ram_id, circuit.add_variable(0));
98
99 circuit.create_big_add_gate({
100 val_idx_1,
101 val_idx_2,
102 val_idx_3,
103 circuit.zero_idx,
104 1,
105 1,
106 1,
107 0,
108 -35,
109 });
110 }
111
112 protected:
114};
115
116class AcirIntegrationSingleTest : public AcirIntegrationTest, public testing::WithParamInterface<std::string> {};
117
118class AcirIntegrationFoldingTest : public AcirIntegrationTest, public testing::WithParamInterface<std::string> {
119 protected:
121};
122
123TEST_P(AcirIntegrationSingleTest, DISABLED_ProveAndVerifyProgram)
124{
125 using Flavor = UltraFlavor;
127
128 std::string test_name = GetParam();
129 info("Test: ", test_name);
130 acir_format::AcirProgram acir_program = get_program_data_from_test_file(test_name);
131
132 // Construct a bberg circuit from the acir representation
133 Builder builder = acir_format::create_circuit<Builder>(acir_program);
134
135 // Construct and verify Honk proof
136 EXPECT_TRUE(prove_and_verify_honk<Flavor>(builder));
137}
138
139// TODO(https://github.com/AztecProtocol/barretenberg/issues/994): Run all tests
142 testing::Values("a_1327_concrete_in_generic",
143 "a_1_mul",
144 "a_2_div",
145 "a_3_add",
146 "a_4_sub",
147 "a_5_over",
148 "a_6",
149 "a_6_array",
150 "a_7",
151 "a_7_function",
152 "aes128_encrypt",
153 "arithmetic_binary_operations",
154 "array_dynamic",
155 "array_dynamic_blackbox_input",
156 "array_dynamic_main_output",
157 "array_dynamic_nested_blackbox_input",
158 "array_eq",
159 "array_if_cond_simple",
160 "array_len",
161 "array_neq",
162 "array_sort",
163 "array_to_slice",
164 "array_to_slice_constant_length",
165 "assert",
166 "assert_statement",
167 "assign_ex",
168 "bigint",
169 "bit_and",
170 "bit_not",
171 "bit_shifts_comptime",
172 "bit_shifts_runtime",
173 "blake3",
174 "bool_not",
175 "bool_or",
176 "break_and_continue",
177 "brillig_acir_as_brillig",
178 "brillig_array_eq",
179 "brillig_array_to_slice",
180 "brillig_arrays",
181 "brillig_assert",
182 "brillig_bit_shifts_runtime",
183 "brillig_blake2s",
184 "brillig_blake3",
185 "brillig_calls",
186 "brillig_calls_array",
187 "brillig_calls_conditionals",
188 "brillig_conditional",
189 "brillig_cow",
190 "brillig_cow_assign",
191 "brillig_cow_regression",
192 "brillig_ecdsa_secp256k1",
193 "brillig_ecdsa_secp256r1",
194 "brillig_embedded_curve",
195 "brillig_fns_as_values",
196 "brillig_hash_to_field",
197 "brillig_identity_function",
198 "brillig_keccak",
199 "brillig_loop",
200 "brillig_nested_arrays",
201 "brillig_not",
202 "brillig_oracle",
203 "brillig_pedersen",
204 "brillig_recursion",
205 "brillig_references",
206 "brillig_schnorr",
207 "brillig_sha256",
208 "brillig_signed_cmp",
209 "brillig_signed_div",
210 "brillig_slices",
211 "brillig_to_be_bytes",
212 "brillig_to_bits",
213 "brillig_to_bytes_integration",
214 "brillig_to_le_bytes",
215 "brillig_top_level",
216 "brillig_uninitialized_arrays",
217 "brillig_wrapping",
218 "cast_bool",
219 "closures_mut_ref",
220 "conditional_1",
221 "conditional_2",
222 "conditional_regression_421",
223 "conditional_regression_547",
224 "conditional_regression_661",
225 "conditional_regression_short_circuit",
226 "conditional_regression_underflow",
227 "custom_entry",
228 "databus",
229 "debug_logs",
230 "diamond_deps_0",
231 "double_verify_nested_proof",
232 "double_verify_proof",
233 "ecdsa_secp256k1",
234 "ecdsa_secp256r1",
235 "ecdsa_secp256r1_3x",
236 "eddsa",
237 "embedded_curve_ops",
238 "field_attribute",
239 "generics",
240 "global_consts",
241 "hash_to_field",
242 "hashmap",
243 "higher_order_functions",
244 "if_else_chain",
245 "import",
246 "inline_never_basic",
247 "integer_array_indexing",
248 "keccak256",
249 "main_bool_arg",
250 "main_return",
251 "merkle_insert",
252 "missing_closure_env",
253 "modules",
254 "modules_more",
255 "modulus",
256 "nested_array_dynamic",
257 "nested_array_dynamic_simple",
258 "nested_array_in_slice",
259 "nested_arrays_from_brillig",
260 "no_predicates_basic",
261 "no_predicates_brillig",
262 "no_predicates_numeric_generic_poseidon",
263 "operator_overloading",
264 "pedersen_check",
265 "pedersen_commitment",
266 "pedersen_hash",
267 "poseidon_bn254_hash",
268 "poseidonsponge_x5_254",
269 "pred_eq",
270 "prelude",
271 "references",
272 "regression",
273 "regression_2660",
274 "regression_3051",
275 "regression_3394",
276 "regression_3607",
277 "regression_3889",
278 "regression_4088",
279 "regression_4124",
280 "regression_4202",
281 "regression_4449",
282 "regression_4709",
283 "regression_5045",
284 "regression_capacity_tracker",
285 "regression_mem_op_predicate",
286 "regression_method_cannot_be_found",
287 "regression_struct_array_conditional",
288 "schnorr",
289 "sha256",
290 "sha2_byte",
291 "side_effects_constrain_array",
292 "signed_arithmetic",
293 "signed_comparison",
294 "signed_division",
295 "simple_2d_array",
296 "simple_add_and_ret_arr",
297 "simple_array_param",
298 "simple_bitwise",
299 "simple_comparison",
300 "simple_mut",
301 "simple_not",
302 "simple_print",
303 "simple_program_addition",
304 "simple_radix",
305 "simple_shield",
306 "simple_shift_left_right",
307 "slice_coercion",
308 "slice_dynamic_index",
309 "slice_loop",
310 "slices",
311 "strings",
312 "struct",
313 "struct_array_inputs",
314 "struct_fields_ordering",
315 "struct_inputs",
316 "submodules",
317 "to_be_bytes",
318 "to_bytes_consistent",
319 "to_bytes_integration",
320 "to_le_bytes",
321 "trait_as_return_type",
322 "trait_impl_base_type",
323 "traits_in_crates_1",
324 "traits_in_crates_2",
325 "tuple_inputs",
326 "tuples",
327 "type_aliases",
328 "u128",
329 "u16_support",
330 "unconstrained_empty",
331 "unit_value",
332 "unsafe_range_constraint",
333 "witness_compression",
334 // "workspace",
335 // "workspace_default_member",
336 "xor"));
337
338TEST_P(AcirIntegrationFoldingTest, DISABLED_ProveAndVerifyProgramStack)
339{
340 using Flavor = MegaFlavor;
342
343 std::string test_name = GetParam();
344 info("Test: ", test_name);
345
346 auto program_stack = get_program_stack_data_from_test_file(test_name);
347
348 while (!program_stack.empty()) {
349 auto program = program_stack.back();
350
351 // Construct a bberg circuit from the acir representation
352 auto builder = acir_format::create_circuit<Builder>(program);
353
354 // Construct and verify Honk proof for the individidual circuit
355 EXPECT_TRUE(prove_and_verify_honk<Flavor>(builder));
356
357 program_stack.pop_back();
358 }
359}
360
363 testing::Values("fold_basic", "fold_basic_nested_call"));
364
369TEST_F(AcirIntegrationTest, DISABLED_Databus)
370{
371 using Flavor = MegaFlavor;
373
374 std::string test_name = "databus";
375 info("Test: ", test_name);
376 acir_format::AcirProgram acir_program = get_program_data_from_test_file(test_name);
377
378 // Construct a bberg circuit from the acir representation
379 Builder builder = acir_format::create_circuit<Builder>(acir_program);
380
381 // This prints a summary of the types of gates in the circuit
382 builder.blocks.summarize();
383
384 // Construct and verify Honk proof
385 EXPECT_TRUE(prove_and_verify_honk<Flavor>(builder));
386}
387
393TEST_F(AcirIntegrationTest, DISABLED_DatabusTwoCalldata)
394{
395 using Flavor = MegaFlavor;
397
398 std::string test_name = "databus_two_calldata";
399 info("Test: ", test_name);
400 acir_format::AcirProgram acir_program = get_program_data_from_test_file(test_name);
401
402 // Construct a bberg circuit from the acir representation
403 Builder builder = acir_format::create_circuit<Builder>(acir_program);
404
405 // Check that the databus columns in the builder have been populated as expected
406 const auto& calldata = builder.get_calldata();
407 const auto& secondary_calldata = builder.get_secondary_calldata();
408 const auto& return_data = builder.get_return_data();
409
410 ASSERT_EQ(calldata.size(), static_cast<size_t>(4));
411 ASSERT_EQ(secondary_calldata.size(), static_cast<size_t>(3));
412 ASSERT_EQ(return_data.size(), static_cast<size_t>(4));
413
414 // Check that return data was computed from the two calldata inputs as expected
415 ASSERT_EQ(builder.get_variable(calldata[0]) + builder.get_variable(secondary_calldata[0]),
416 builder.get_variable(return_data[0]));
417 ASSERT_EQ(builder.get_variable(calldata[1]) + builder.get_variable(secondary_calldata[1]),
418 builder.get_variable(return_data[1]));
419 ASSERT_EQ(builder.get_variable(calldata[2]) + builder.get_variable(secondary_calldata[2]),
420 builder.get_variable(return_data[2]));
421 ASSERT_EQ(builder.get_variable(calldata[3]), builder.get_variable(return_data[3]));
422
423 // Ensure that every index of each bus column was read once as expected
424 for (size_t idx = 0; idx < calldata.size(); ++idx) {
425 ASSERT_EQ(calldata.get_read_count(idx), 1);
426 }
427 for (size_t idx = 0; idx < secondary_calldata.size(); ++idx) {
428 ASSERT_EQ(secondary_calldata.get_read_count(idx), 1);
429 }
430 for (size_t idx = 0; idx < return_data.size(); ++idx) {
431 ASSERT_EQ(return_data.get_read_count(idx), 1);
432 }
433
434 // This prints a summary of the types of gates in the circuit
435 builder.blocks.summarize();
436
437 // Construct and verify Honk proof
438 EXPECT_TRUE(prove_and_verify_honk<Flavor>(builder));
439}
440
446TEST_F(AcirIntegrationTest, DISABLED_UpdateAcirCircuit)
447{
448 using Flavor = MegaFlavor;
450
451 std::string test_name = "6_array"; // arbitrary program with RAM gates
452 auto acir_program = get_program_data_from_test_file(test_name);
453
454 // Construct a bberg circuit from the acir representation
455 Builder circuit = acir_format::create_circuit<Builder>(acir_program);
456
457 EXPECT_TRUE(CircuitChecker::check(circuit));
458
459 // Now append some RAM gates onto the circuit generated from acir and confirm that its still valid. (First, check
460 // that the RAM operations constitute a valid independent circuit).
461 {
462 Builder circuit;
463 add_some_simple_RAM_gates(circuit);
464 EXPECT_TRUE(CircuitChecker::check(circuit));
465 EXPECT_TRUE(prove_and_verify_honk<Flavor>(circuit));
466 }
467
468 // Now manually append the simple RAM circuit to the circuit generated from acir
469 add_some_simple_RAM_gates(circuit);
470
471 // Confirm that the result is still valid
472 EXPECT_TRUE(CircuitChecker::check(circuit));
473 EXPECT_TRUE(prove_and_verify_honk<Flavor>(circuit));
474}
475
480TEST_F(AcirIntegrationTest, DISABLED_HonkRecursion)
481{
482 using Flavor = UltraFlavor;
484
485 std::string test_name = "verify_honk_proof"; // program that recursively verifies a honk proof
486 auto acir_program = get_program_data_from_test_file(test_name);
487
488 // Construct a bberg circuit from the acir representation
489 Builder circuit = acir_format::create_circuit<Builder>(acir_program);
490
491 EXPECT_TRUE(CircuitChecker::check(circuit));
492 EXPECT_TRUE(prove_and_verify_honk<Flavor>(circuit));
493}
494
499TEST_F(AcirIntegrationTest, DISABLED_ClientIVCMsgpackInputs)
500{
501 // NOTE: to populate the test inputs at this location, run the following commands:
502 // export AZTEC_CACHE_COMMIT=origin/master~3
503 // export FORCE_CACHE_DOWNLOAD=1
504 // yarn-project/end-to-end/bootstrap.sh build_bench
505 std::string input_path = "../../../yarn-project/end-to-end/example-app-ivc-inputs-out/"
506 "ecdsar1+transfer_0_recursions+sponsored_fpc/ivc-inputs.msgpack";
507
510
512 ClientIVC::Proof proof = ivc->prove();
513
514 EXPECT_TRUE(ivc->verify(proof));
515}
516
521TEST_F(AcirIntegrationTest, DISABLED_DummyWitnessVkConsistency)
522{
523 std::string input_path = "../../../yarn-project/end-to-end/example-app-ivc-inputs-out/"
524 "ecdsar1+transfer_0_recursions+sponsored_fpc/ivc-inputs.msgpack";
525
528
529 uint256_t recomputed_vk_hash{ 0 };
530 uint256_t computed_vk_hash{ 0 };
531
532 TraceSettings trace_settings{ AZTEC_TRACE_STRUCTURE };
533
534 for (auto [program_in, precomputed_vk, function_name] :
536
537 // Compute the VK using the program constraints but no witness (i.e. mimic the "dummy witness" case)
538 {
539 auto program = program_in;
540 program.witness = {}; // erase the witness to mimmic the "dummy witness" case
541 auto& ivc_constraints = program.constraints.pg_recursion_constraints;
542 const acir_format::ProgramMetadata metadata{
543 .ivc = ivc_constraints.empty() ? nullptr
544 : create_mock_ivc_from_constraints(ivc_constraints, trace_settings)
545 };
546
547 auto circuit = acir_format::create_circuit<MegaCircuitBuilder>(program, metadata);
548 recomputed_vk_hash = proving_key_inspector::compute_vk_hash<MegaFlavor>(circuit);
549 }
550
551 // Compute the verification key using the genuine witness
552 {
553 auto program = program_in;
554 auto& ivc_constraints = program.constraints.pg_recursion_constraints;
555 const acir_format::ProgramMetadata metadata{
556 .ivc = ivc_constraints.empty() ? nullptr
557 : create_mock_ivc_from_constraints(ivc_constraints, trace_settings)
558 };
559
560 auto circuit = acir_format::create_circuit<MegaCircuitBuilder>(program, metadata);
561 computed_vk_hash = proving_key_inspector::compute_vk_hash<MegaFlavor>(circuit);
562 }
563
564 // Check that the hashes computed from the dummy witness VK and the genuine witness VK are equal
565 EXPECT_EQ(recomputed_vk_hash, computed_vk_hash);
566 // Check that the VK hashes match the hash of the precomputed VK contained in the msgpack inputs
567 EXPECT_EQ(computed_vk_hash, precomputed_vk->hash());
568 }
569}
570#endif
INSTANTIATE_TEST_SUITE_P(AcirTests, AcirIntegrationSingleTest, testing::Values("a_1327_concrete_in_generic", "a_1_mul", "a_2_div", "a_3_add", "a_4_sub", "a_5_over", "a_6", "a_6_array", "a_7", "a_7_function", "aes128_encrypt", "arithmetic_binary_operations", "array_dynamic", "array_dynamic_blackbox_input", "array_dynamic_main_output", "array_dynamic_nested_blackbox_input", "array_eq", "array_if_cond_simple", "array_len", "array_neq", "array_sort", "array_to_slice", "array_to_slice_constant_length", "assert", "assert_statement", "assign_ex", "bigint", "bit_and", "bit_not", "bit_shifts_comptime", "bit_shifts_runtime", "blake3", "bool_not", "bool_or", "break_and_continue", "brillig_acir_as_brillig", "brillig_array_eq", "brillig_array_to_slice", "brillig_arrays", "brillig_assert", "brillig_bit_shifts_runtime", "brillig_blake2s", "brillig_blake3", "brillig_calls", "brillig_calls_array", "brillig_calls_conditionals", "brillig_conditional", "brillig_cow", "brillig_cow_assign", "brillig_cow_regression", "brillig_ecdsa_secp256k1", "brillig_ecdsa_secp256r1", "brillig_embedded_curve", "brillig_fns_as_values", "brillig_hash_to_field", "brillig_identity_function", "brillig_keccak", "brillig_loop", "brillig_nested_arrays", "brillig_not", "brillig_oracle", "brillig_pedersen", "brillig_recursion", "brillig_references", "brillig_schnorr", "brillig_sha256", "brillig_signed_cmp", "brillig_signed_div", "brillig_slices", "brillig_to_be_bytes", "brillig_to_bits", "brillig_to_bytes_integration", "brillig_to_le_bytes", "brillig_top_level", "brillig_uninitialized_arrays", "brillig_wrapping", "cast_bool", "closures_mut_ref", "conditional_1", "conditional_2", "conditional_regression_421", "conditional_regression_547", "conditional_regression_661", "conditional_regression_short_circuit", "conditional_regression_underflow", "custom_entry", "databus", "debug_logs", "diamond_deps_0", "double_verify_nested_proof", "double_verify_proof", "ecdsa_secp256k1", "ecdsa_secp256r1", "ecdsa_secp256r1_3x", "eddsa", "embedded_curve_ops", "field_attribute", "generics", "global_consts", "hash_to_field", "hashmap", "higher_order_functions", "if_else_chain", "import", "inline_never_basic", "integer_array_indexing", "keccak256", "main_bool_arg", "main_return", "merkle_insert", "missing_closure_env", "modules", "modules_more", "modulus", "nested_array_dynamic", "nested_array_dynamic_simple", "nested_array_in_slice", "nested_arrays_from_brillig", "no_predicates_basic", "no_predicates_brillig", "no_predicates_numeric_generic_poseidon", "operator_overloading", "pedersen_check", "pedersen_commitment", "pedersen_hash", "poseidon_bn254_hash", "poseidonsponge_x5_254", "pred_eq", "prelude", "references", "regression", "regression_2660", "regression_3051", "regression_3394", "regression_3607", "regression_3889", "regression_4088", "regression_4124", "regression_4202", "regression_4449", "regression_4709", "regression_5045", "regression_capacity_tracker", "regression_mem_op_predicate", "regression_method_cannot_be_found", "regression_struct_array_conditional", "schnorr", "sha256", "sha2_byte", "side_effects_constrain_array", "signed_arithmetic", "signed_comparison", "signed_division", "simple_2d_array", "simple_add_and_ret_arr", "simple_array_param", "simple_bitwise", "simple_comparison", "simple_mut", "simple_not", "simple_print", "simple_program_addition", "simple_radix", "simple_shield", "simple_shift_left_right", "slice_coercion", "slice_dynamic_index", "slice_loop", "slices", "strings", "struct", "struct_array_inputs", "struct_fields_ordering", "struct_inputs", "submodules", "to_be_bytes", "to_bytes_consistent", "to_bytes_integration", "to_le_bytes", "trait_as_return_type", "trait_impl_base_type", "traits_in_crates_1", "traits_in_crates_2", "tuple_inputs", "tuples", "type_aliases", "u128", "u16_support", "unconstrained_empty", "unit_value", "unsafe_range_constraint", "witness_compression", "xor"))
TEST_P(AcirIntegrationSingleTest, DISABLED_ProveAndVerifyProgram)
#define BB_ASSERT_EQ(actual, expected,...)
Definition assert.hpp:59
static std::vector< uint8_t > get_bytecode(const std::string &bytecodePath)
static acir_format::AcirProgramStack get_program_stack_data_from_test_file(const std::string &test_program_name)
static bool file_exists(const std::string &path)
bool prove_and_verify_honk(Flavor::CircuitBuilder &builder)
void add_some_simple_RAM_gates(auto &circuit)
static acir_format::AcirProgram get_program_data_from_test_file(const std::string &test_program_name)
The verification key is responsible for storing the commitments to the precomputed (non-witness) poly...
MegaCircuitBuilder CircuitBuilder
static bool check(const Builder &circuit)
Check the witness satisifies the circuit.
void info(Args... args)
Definition log.hpp:70
AluTraceBuilder builder
Definition alu.test.cpp:123
UltraKeccakFlavor::VerificationKey VerificationKey
AcirProgramStack get_acir_program_stack(std::string const &bytecode_path, std::string const &witness_path)
std::filesystem::path bb_crs_path()
void init_file_crs_factory(const std::filesystem::path &path)
Entry point for Barretenberg command-line interface.
TEST_F(IPATest, ChallengesAreZero)
Definition ipa.test.cpp:123
std::vector< uint8_t > exec_pipe(const std::string &command)
Definition exec_pipe.hpp:10
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
std::vector< FF > calldata
Storage for constaint_systems/witnesses for a stack of acir programs.
std::shared_ptr< ClientIVC > ivc
A full proof for the IVC scheme containing a Mega proof showing correctness of the hiding circuit (wh...
static std::vector< PrivateExecutionStepRaw > load_and_decompress(const std::filesystem::path &input_path)
std::vector< std::shared_ptr< ClientIVC::MegaVerificationKey > > precomputed_vks
std::shared_ptr< ClientIVC > accumulate()
void parse(std::vector< PrivateExecutionStepRaw > &&steps)
std::vector< acir_format::AcirProgram > folding_stack
std::vector< std::string > function_names