From ff121a8c395d37f654c75f9f610f6d6755939584 Mon Sep 17 00:00:00 2001 From: federicobarbacovi <171914500+federicobarbacovi@users.noreply.github.com> Date: Tue, 16 Sep 2025 10:37:51 +0000 Subject: [PATCH 1/6] Remove references to tube --- barretenberg/acir_tests/bootstrap.sh | 3 - .../acir_tests/scripts/bb_tube_prove.sh | 16 --- .../cpp/src/barretenberg/api/prove_tube.cpp | 99 --------------- .../cpp/src/barretenberg/api/prove_tube.hpp | 14 --- barretenberg/cpp/src/barretenberg/bb/cli.cpp | 38 ------ .../barretenberg/bbapi/bbapi_ultra_honk.cpp | 3 +- .../client_ivc_recursive_verifier.test.cpp | 118 ------------------ 7 files changed, 1 insertion(+), 290 deletions(-) delete mode 100755 barretenberg/acir_tests/scripts/bb_tube_prove.sh delete mode 100644 barretenberg/cpp/src/barretenberg/api/prove_tube.cpp delete mode 100644 barretenberg/cpp/src/barretenberg/api/prove_tube.hpp diff --git a/barretenberg/acir_tests/bootstrap.sh b/barretenberg/acir_tests/bootstrap.sh index ea3ad95182f5..321d89b93e35 100755 --- a/barretenberg/acir_tests/bootstrap.sh +++ b/barretenberg/acir_tests/bootstrap.sh @@ -176,9 +176,6 @@ function test_cmds { # the prove then verify flow for UltraHonk. This makes sure we have the same circuit for different witness inputs. echo "$tests_hash $scripts/bbjs_prove.sh a_6_array" - # Fold and verify an ACIR program stack using ClientIVC, recursively verify as part of the Tube circuit and produce and verify a Honk proof - echo "$tests_hash $scripts/bb_tube_prove.sh a_6_array" - for t in $non_recursive_tests; do echo "$tests_hash $scripts/bb_prove.sh $(basename $t)" done diff --git a/barretenberg/acir_tests/scripts/bb_tube_prove.sh b/barretenberg/acir_tests/scripts/bb_tube_prove.sh deleted file mode 100755 index 80cd0dfa61fc..000000000000 --- a/barretenberg/acir_tests/scripts/bb_tube_prove.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env bash -source $(git rev-parse --show-toplevel)/ci3/source - -export HARDWARE_CONCURRENCY=8 - -cd ../acir_tests/$1 - -mkdir -p output-$$ -trap "rm -rf output-$$" EXIT - -bb=$(../../../cpp/scripts/find-bb) -# TODO(https://github.com/AztecProtocol/barretenberg/issues/1252): deprecate in favor of normal proving flow -$bb OLD_API write_arbitrary_valid_client_ivc_proof_and_vk_to_file -v -o output-$$ -$bb prove_tube -v -k output-$$/vk -o output-$$ -# TODO(https://github.com/AztecProtocol/barretenberg/issues/1322): Just call verify. -$bb verify_tube -v -o output-$$ diff --git a/barretenberg/cpp/src/barretenberg/api/prove_tube.cpp b/barretenberg/cpp/src/barretenberg/api/prove_tube.cpp deleted file mode 100644 index 230f795073ed..000000000000 --- a/barretenberg/cpp/src/barretenberg/api/prove_tube.cpp +++ /dev/null @@ -1,99 +0,0 @@ -#include "prove_tube.hpp" -#include "barretenberg/api/file_io.hpp" -#include "barretenberg/common/map.hpp" -#include "barretenberg/common/serialize.hpp" -#include "barretenberg/honk/proof_system/types/proof.hpp" -#include "barretenberg/stdlib/client_ivc_verifier/client_ivc_recursive_verifier.hpp" -#include "barretenberg/stdlib/special_public_inputs/special_public_inputs.hpp" -#include - -namespace bb { -/** - * @brief Creates a Honk Proof for the Tube circuit responsible for recursively verifying a ClientIVC proof. - * - * @param output_path the working directory from which the proof and verification data are read - * @param num_unused_public_inputs - */ -void prove_tube(const std::string& output_path, const std::string& vk_path) -{ - using namespace stdlib::recursion::honk; - - using Builder = UltraCircuitBuilder; - using StdlibProof = ClientIVCRecursiveVerifier::StdlibProof; - using HidingKernelIO = stdlib::recursion::honk::HidingKernelIO; - using RollupIO = stdlib::recursion::honk::RollupIO; - - std::string proof_path = output_path + "/proof"; - - // Read the proof and verification data from given files - auto proof = ClientIVC::Proof::from_file_msgpack(proof_path); - auto vk = from_buffer(read_file(vk_path)); - - Builder builder; - ClientIVCRecursiveVerifier verifier{ &builder, vk.mega }; - - StdlibProof stdlib_proof(builder, proof); - ClientIVCRecursiveVerifier::Output client_ivc_rec_verifier_output = verifier.verify(stdlib_proof); - - // The public inputs in the proof are propagated to the base rollup by making them public inputs of this circuit. - // Exclude the public inputs of the Hiding Kernel: the pairing points are handled separately, the ecc op tables are - // not needed after this point - auto num_inner_public_inputs = vk.mega->num_public_inputs - HidingKernelIO::PUBLIC_INPUTS_SIZE; - for (size_t i = 0; i < num_inner_public_inputs; i++) { - stdlib_proof.mega_proof[i].set_public(); - } - - // IO - RollupIO inputs; - inputs.pairing_inputs = client_ivc_rec_verifier_output.points_accumulator; - inputs.ipa_claim = client_ivc_rec_verifier_output.opening_claim; - inputs.set_public(); - - // The tube only calls an IPA recursive verifier once, so we can just add this IPA proof - builder.ipa_proof = client_ivc_rec_verifier_output.ipa_proof.get_value(); - BB_ASSERT_EQ(builder.ipa_proof.size(), IPA_PROOF_LENGTH, "IPA proof should be set."); - - using Prover = UltraProver_; - using Verifier = UltraVerifier_; - auto prover_instance = std::make_shared>(builder); - // TODO(https://github.com/AztecProtocol/barretenberg/issues/1201): Precompute tube vk and pass it in. - info("WARNING: computing tube vk in prove_tube, but a precomputed vk should be passed in."); - auto tube_verification_key = - std::make_shared(prover_instance->get_precomputed()); - - Prover tube_prover{ prover_instance, tube_verification_key }; - auto tube_proof = tube_prover.construct_proof(); - std::string tubePublicInputsPath = output_path + "/public_inputs"; - std::string tubeProofPath = output_path + "/proof"; - PublicInputsAndProof public_inputs_and_proof{ - PublicInputsVector(tube_proof.begin(), - tube_proof.begin() + static_cast(num_inner_public_inputs)), - HonkProof(tube_proof.begin() + static_cast(num_inner_public_inputs), tube_proof.end()) - }; - write_file(tubePublicInputsPath, to_buffer(public_inputs_and_proof.public_inputs)); - write_file(tubeProofPath, to_buffer(public_inputs_and_proof.proof)); - - std::string tubeVkPath = output_path + "/vk"; - write_file(tubeVkPath, to_buffer(tube_verification_key)); - - info("Native verification of the tube_proof"); - VerifierCommitmentKey ipa_verification_key(1 << CONST_ECCVM_LOG_N); - Verifier tube_verifier(tube_verification_key, ipa_verification_key); - - // Break up the tube proof into the honk portion and the ipa portion - const size_t HONK_PROOF_LENGTH_WITHOUT_INNER_PUB_INPUTS = - UltraRollupFlavor::PROOF_LENGTH_WITHOUT_PUB_INPUTS() + RollupIO::PUBLIC_INPUTS_SIZE; - // The extra calculation is for the IPA proof length. - BB_ASSERT_EQ(tube_proof.size(), - HONK_PROOF_LENGTH_WITHOUT_INNER_PUB_INPUTS + num_inner_public_inputs, - "In prove_tube, tube proof length is incorrect."); - // split out the ipa proof - const std::ptrdiff_t honk_proof_with_pub_inputs_length = static_cast( - HONK_PROOF_LENGTH_WITHOUT_INNER_PUB_INPUTS - IPA_PROOF_LENGTH + num_inner_public_inputs); - auto ipa_proof = HonkProof(tube_proof.begin() + honk_proof_with_pub_inputs_length, tube_proof.end()); - auto tube_honk_proof = HonkProof(tube_proof.begin(), tube_proof.end() + honk_proof_with_pub_inputs_length); - bool verified = tube_verifier.template verify_proof(tube_honk_proof, ipa_proof).result; - info("Tube proof verification: ", verified); -} - -} // namespace bb diff --git a/barretenberg/cpp/src/barretenberg/api/prove_tube.hpp b/barretenberg/cpp/src/barretenberg/api/prove_tube.hpp deleted file mode 100644 index 0e01546b6436..000000000000 --- a/barretenberg/cpp/src/barretenberg/api/prove_tube.hpp +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once -#include - -namespace bb { -/** - * @brief Creates a Honk Proof for the Tube circuit responsible for recursively verifying a ClientIVC proof. - * - * @param output_path the working directory from which the proof is read and output is written - * @param vk_path the path to the verification key data to use when proving (this is the one of two ClientIVC VKs, - * public or private tail) - */ -void prove_tube(const std::string& output_path, const std::string& vk_path); - -} // namespace bb diff --git a/barretenberg/cpp/src/barretenberg/bb/cli.cpp b/barretenberg/cpp/src/barretenberg/bb/cli.cpp index 953f291dd09f..51c05a45f574 100644 --- a/barretenberg/cpp/src/barretenberg/bb/cli.cpp +++ b/barretenberg/cpp/src/barretenberg/bb/cli.cpp @@ -19,7 +19,6 @@ #include "barretenberg/api/api_msgpack.hpp" #include "barretenberg/api/api_ultra_honk.hpp" #include "barretenberg/api/file_io.hpp" -#include "barretenberg/api/prove_tube.hpp" #include "barretenberg/bb/cli11_formatter.hpp" #include "barretenberg/bbapi/bbapi.hpp" #include "barretenberg/bbapi/bbapi_ultra_honk.hpp" @@ -521,30 +520,6 @@ int parse_and_run_cli_command(int argc, char* argv[]) msgpack_run_command->add_option( "-i,--input", msgpack_input_file, "Input file containing msgpack buffers (defaults to stdin)"); - /*************************************************************************************************************** - * Subcommand: prove_tube - ***************************************************************************************************************/ - CLI ::App* prove_tube_command = app.add_subcommand("prove_tube", ""); - prove_tube_command->group(""); // hide from list of subcommands - add_verbose_flag(prove_tube_command); - add_debug_flag(prove_tube_command); - add_crs_path_option(prove_tube_command); - add_vk_path_option(prove_tube_command); - std::string prove_tube_output_path{ "./target" }; - add_output_path_option(prove_tube_command, prove_tube_output_path); - - /*************************************************************************************************************** - * Subcommand: verify_tube - ***************************************************************************************************************/ - CLI::App* verify_tube_command = app.add_subcommand("verify_tube", ""); - verify_tube_command->group(""); // hide from list of subcommands - add_verbose_flag(verify_tube_command); - add_debug_flag(verify_tube_command); - add_crs_path_option(verify_tube_command); - // doesn't make sense that this is set by -o but that's how it was - std::string tube_proof_and_vk_path{ "./target" }; - add_output_path_option(verify_tube_command, tube_proof_and_vk_path); - /*************************************************************************************************************** * Build the CLI11 App ***************************************************************************************************************/ @@ -614,19 +589,6 @@ int parse_and_run_cli_command(int argc, char* argv[]) if (msgpack_run_command->parsed()) { return execute_msgpack_run(msgpack_input_file); } - // TUBE - if (prove_tube_command->parsed()) { - // TODO(https://github.com/AztecProtocol/barretenberg/issues/1201): Potentially remove this extra logic. - prove_tube(prove_tube_output_path, vk_path); - } else if (verify_tube_command->parsed()) { - // TODO(https://github.com/AztecProtocol/barretenberg/issues/1322): Remove verify_tube logic. - auto tube_public_inputs_path = tube_proof_and_vk_path + "/public_inputs"; - auto tube_proof_path = tube_proof_and_vk_path + "/proof"; - auto tube_vk_path = tube_proof_and_vk_path + "/vk"; - UltraHonkAPI api; - return api.verify({ .ipa_accumulation = true }, tube_public_inputs_path, tube_proof_path, tube_vk_path) ? 0 - : 1; - } // AVM #ifndef DISABLE_AZTEC_VM else if (avm_prove_command->parsed()) { diff --git a/barretenberg/cpp/src/barretenberg/bbapi/bbapi_ultra_honk.cpp b/barretenberg/cpp/src/barretenberg/bbapi/bbapi_ultra_honk.cpp index beea41bcb7cd..24e6e6fbecbf 100644 --- a/barretenberg/cpp/src/barretenberg/bbapi/bbapi_ultra_honk.cpp +++ b/barretenberg/cpp/src/barretenberg/bbapi/bbapi_ultra_honk.cpp @@ -177,8 +177,7 @@ bool _verify(const bool ipa_accumulation, const std::ptrdiff_t honk_proof_with_pub_inputs_length = static_cast(HONK_PROOF_LENGTH + num_public_inputs); auto ipa_proof = Proof(complete_proof.begin() + honk_proof_with_pub_inputs_length, complete_proof.end()); - auto tube_honk_proof = - Proof(complete_proof.begin(), complete_proof.begin() + honk_proof_with_pub_inputs_length); + auto honk_proof = Proof(complete_proof.begin(), complete_proof.begin() + honk_proof_with_pub_inputs_length); verified = verifier.template verify_proof(complete_proof, ipa_proof).result; } else { verified = verifier.template verify_proof(complete_proof).result; diff --git a/barretenberg/cpp/src/barretenberg/stdlib/client_ivc_verifier/client_ivc_recursive_verifier.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/client_ivc_verifier/client_ivc_recursive_verifier.test.cpp index 5ba1ce47fa74..9760bbf6454d 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/client_ivc_verifier/client_ivc_recursive_verifier.test.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/client_ivc_verifier/client_ivc_recursive_verifier.test.cpp @@ -85,122 +85,4 @@ TEST_F(ClientIVCRecursionTests, Basic) // Print the number of gates post finalization info("Recursive Verifier: finalized num gates = ", builder.num_gates); } - -TEST_F(ClientIVCRecursionTests, ClientTubeBase) -{ - using CIVCRecVerifierOutput = ClientIVCRecursiveVerifier::Output; - - // Generate a genuine ClientIVC prover output - auto [proof, vk] = construct_client_ivc_prover_output(); - - // Construct the ClientIVC recursive verifier - Builder tube_builder; - ClientIVCVerifier verifier{ &tube_builder, vk.mega }; - - // Generate the recursive verification circuit - StdlibProof stdlib_proof(tube_builder, proof); - CIVCRecVerifierOutput client_ivc_rec_verifier_output = verifier.verify(stdlib_proof); - - { - // IO - RollupIO inputs; - inputs.pairing_inputs = client_ivc_rec_verifier_output.points_accumulator; - inputs.ipa_claim = client_ivc_rec_verifier_output.opening_claim; - inputs.set_public(); - } - - // The tube only calls an IPA recursive verifier once, so we can just add this IPA proof - tube_builder.ipa_proof = client_ivc_rec_verifier_output.ipa_proof.get_value(); - - info("ClientIVC Recursive Verifier: num prefinalized gates = ", tube_builder.num_gates); - - EXPECT_EQ(tube_builder.failed(), false) << tube_builder.err(); - - // EXPECT_TRUE(CircuitChecker::check(tube_builder)); - - // Construct and verify a proof for the ClientIVC Recursive Verifier circuit - auto prover_instance = std::make_shared>(tube_builder); - auto native_vk_with_ipa = std::make_shared(prover_instance->get_precomputed()); - UltraProver_ tube_prover{ prover_instance, native_vk_with_ipa }; - // Prove the CIVCRecursiveVerifier circuit - auto native_tube_proof = tube_prover.construct_proof(); - - // Natively verify the tube proof - VerifierCommitmentKey ipa_verification_key(1 << CONST_ECCVM_LOG_N); - UltraVerifier_ native_verifier(native_vk_with_ipa, ipa_verification_key); - bool native_result = - native_verifier.template verify_proof(native_tube_proof, tube_prover.prover_instance->ipa_proof) - .result; - EXPECT_TRUE(native_result); - - // Construct a base rollup circuit that recursively verifies the tube proof and forwards the IPA proof. - Builder base_builder; - auto tube_vk = std::make_shared(prover_instance->get_precomputed()); - auto stdlib_tube_vk_and_hash = std::make_shared(base_builder, tube_vk); - stdlib::Proof base_tube_proof(base_builder, native_tube_proof); - UltraRecursiveVerifier base_verifier{ &base_builder, stdlib_tube_vk_and_hash }; - UltraRecursiveVerifierOutput output = base_verifier.template verify_proof(base_tube_proof); - info("Tube UH Recursive Verifier: num prefinalized gates = ", base_builder.num_gates); - - { - // IO - RollupIO inputs; - inputs.pairing_inputs = output.points_accumulator; - inputs.ipa_claim = output.ipa_claim; - inputs.set_public(); - } - - base_builder.ipa_proof = tube_prover.prover_instance->ipa_proof; - EXPECT_EQ(base_builder.failed(), false) << base_builder.err(); - EXPECT_TRUE(CircuitChecker::check(base_builder)); - - // Natively verify the IPA proof for the base rollup circuit - auto base_prover_instance = std::make_shared>(base_builder); - auto ipa_transcript = std::make_shared(); - ipa_transcript->load_proof(base_prover_instance->ipa_proof); - IPA::reduce_verify( - ipa_verification_key, output.ipa_claim.get_native_opening_claim(), ipa_transcript); -} - -// Ensure that the Client IVC Recursive Verifier Circuit does not depend on the Client IVC input -TEST_F(ClientIVCRecursionTests, TubeVKIndependentOfInputCircuits) -{ - // Retrieves the trace blocks (each consisting of a specific gate) from the recursive verifier circuit - auto get_blocks = [](size_t num_app_circuits) - -> std::tuple> { - auto [proof, ivc_vk] = construct_client_ivc_prover_output(num_app_circuits); - - Builder tube_builder; - ClientIVCVerifier verifier{ &tube_builder, ivc_vk.mega }; - - StdlibProof stdlib_proof(tube_builder, proof); - auto client_ivc_rec_verifier_output = verifier.verify(stdlib_proof); - - // IO - RollupIO inputs; - inputs.pairing_inputs = client_ivc_rec_verifier_output.points_accumulator; - inputs.ipa_claim = client_ivc_rec_verifier_output.opening_claim; - inputs.set_public(); - - // The tube only calls an IPA recursive verifier once, so we can just add this IPA proof - tube_builder.ipa_proof = client_ivc_rec_verifier_output.ipa_proof.get_value(); - - info("ClientIVC Recursive Verifier: num prefinalized gates = ", tube_builder.num_gates); - - EXPECT_EQ(tube_builder.failed(), false) << tube_builder.err(); - - // Construct and verify a proof for the ClientIVC Recursive Verifier circuit - auto prover_instance = std::make_shared>(tube_builder); - - auto tube_vk = std::make_shared(prover_instance->get_precomputed()); - - return { tube_builder.blocks, tube_vk }; - }; - - auto [blocks_4, verification_key_4] = get_blocks(/*num_app_circuits=*/1); - auto [blocks_5, verification_key_5] = get_blocks(/*num_app_circuits=*/2); - - compare_ultra_blocks_and_verification_keys({ blocks_4, blocks_5 }, - { verification_key_4, verification_key_5 }); -} } // namespace bb::stdlib::recursion::honk From de0fa547776c3cbf8126dfe882e312793207e13e Mon Sep 17 00:00:00 2001 From: federicobarbacovi <171914500+federicobarbacovi@users.noreply.github.com> Date: Tue, 16 Sep 2025 11:04:45 +0000 Subject: [PATCH 2/6] Update assertions in acir format --- .../src/barretenberg/dsl/acir_format/acir_format.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_format/acir_format.cpp b/barretenberg/cpp/src/barretenberg/dsl/acir_format/acir_format.cpp index fe244f8b9fbf..6168a57a9cc9 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_format/acir_format.cpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_format/acir_format.cpp @@ -303,14 +303,20 @@ void build_constraints(Builder& builder, AcirProgram& program, const ProgramMeta bool has_pairing_points = has_honk_recursion_constraints || has_civc_recursion_constraints || has_avm_recursion_constraints; - // TODO(https://github.com/AztecProtocol/barretenberg/issues/1523): Only handle either HONK or CIVC + AVM and - // fail fast otherwise + // We only handle: + // - CIVC recursion constraints (Private Base Rollup) + // - HONK + AVM recursion constraints (Public Base Rollup) + // - HONK recursion constraints + // - AVM recursion constraints BB_ASSERT_EQ(has_pg_recursion_constraints, false, "Invalid circuit: pg recursion constraints are present with UltraBuilder."); - BB_ASSERT_EQ(!(has_honk_recursion_constraints && has_civc_recursion_constraints), + BB_ASSERT_EQ(!(has_civc_recursion_constraints && has_honk_recursion_constraints), true, "Invalid circuit: both honk and civc recursion constraints are present."); + BB_ASSERT_EQ(!(has_civc_recursion_constraints && has_avm_recursion_constraints), + true, + "Invalid circuit: both civc and avm recursion constraints are present."); BB_ASSERT_EQ( !(has_honk_recursion_constraints || has_civc_recursion_constraints || has_avm_recursion_constraints) || is_recursive_circuit, From 0b982869e971f454b3c93edcd685b713673af972 Mon Sep 17 00:00:00 2001 From: federicobarbacovi <171914500+federicobarbacovi@users.noreply.github.com> Date: Tue, 16 Sep 2025 13:43:09 +0000 Subject: [PATCH 3/6] Turn assert into vinfo --- .../cpp/src/barretenberg/dsl/acir_format/acir_format.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_format/acir_format.cpp b/barretenberg/cpp/src/barretenberg/dsl/acir_format/acir_format.cpp index 6168a57a9cc9..da51a131d386 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_format/acir_format.cpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_format/acir_format.cpp @@ -308,20 +308,23 @@ void build_constraints(Builder& builder, AcirProgram& program, const ProgramMeta // - HONK + AVM recursion constraints (Public Base Rollup) // - HONK recursion constraints // - AVM recursion constraints + // However, as mock protocol circuits use CIVC + AVM (mock Public Base Rollup), instead of throwing an assert we + // return a vinfo for the case of CIVC + AVM BB_ASSERT_EQ(has_pg_recursion_constraints, false, "Invalid circuit: pg recursion constraints are present with UltraBuilder."); BB_ASSERT_EQ(!(has_civc_recursion_constraints && has_honk_recursion_constraints), true, "Invalid circuit: both honk and civc recursion constraints are present."); - BB_ASSERT_EQ(!(has_civc_recursion_constraints && has_avm_recursion_constraints), - true, - "Invalid circuit: both civc and avm recursion constraints are present."); BB_ASSERT_EQ( !(has_honk_recursion_constraints || has_civc_recursion_constraints || has_avm_recursion_constraints) || is_recursive_circuit, true, "Invalid circuit: honk, civc, or avm recursion constraints present but the circuit is not recursive."); + if (has_civc_recursion_constraints && has_avm_recursion_constraints) { + vinfo("WARNING: both civc and avm recursion constraints are present. This should only happen in a mock " + "circuit."); + } // Container for data to be propagated HonkRecursionConstraintsOutput honk_output; From d1b416760afcff893204126fb30d8522ff5c4c19 Mon Sep 17 00:00:00 2001 From: federicobarbacovi <171914500+federicobarbacovi@users.noreply.github.com> Date: Tue, 16 Sep 2025 13:50:41 +0000 Subject: [PATCH 4/6] Update warning message --- .../cpp/src/barretenberg/dsl/acir_format/acir_format.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_format/acir_format.cpp b/barretenberg/cpp/src/barretenberg/dsl/acir_format/acir_format.cpp index da51a131d386..29531fd68d71 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_format/acir_format.cpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_format/acir_format.cpp @@ -322,7 +322,8 @@ void build_constraints(Builder& builder, AcirProgram& program, const ProgramMeta true, "Invalid circuit: honk, civc, or avm recursion constraints present but the circuit is not recursive."); if (has_civc_recursion_constraints && has_avm_recursion_constraints) { - vinfo("WARNING: both civc and avm recursion constraints are present. This should only happen in a mock " + vinfo("WARNING: both civc and avm recursion constraints are present. While we support this combination, we " + "expect to see it only in a mock " "circuit."); } From f128754677933897062ad0ed5ed5cbb7d00ce95a Mon Sep 17 00:00:00 2001 From: federicobarbacovi <171914500+federicobarbacovi@users.noreply.github.com> Date: Wed, 17 Sep 2025 10:41:54 +0000 Subject: [PATCH 5/6] Trigger CI From aae44548656f1c46c55172026fc67beeb2a28aba Mon Sep 17 00:00:00 2001 From: federicobarbacovi <171914500+federicobarbacovi@users.noreply.github.com> Date: Fri, 19 Sep 2025 07:56:51 +0000 Subject: [PATCH 6/6] Trigger CI