From 8d09c517a0c1cc9cfc7ad40aa3d79aee4a960eba Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Wed, 9 Apr 2025 23:39:31 +0000 Subject: [PATCH 1/7] quick attempt at making ipa claim public component --- .../barretenberg/commitment_schemes/claim.hpp | 33 ++++++++++ .../ultra_recursive_verifier.cpp | 61 +++++++++++-------- 2 files changed, 67 insertions(+), 27 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/claim.hpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/claim.hpp index 97a1e51e4187..105990032613 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/claim.hpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/claim.hpp @@ -51,11 +51,44 @@ template class OpeningClaim { using Fr = typename Curve::ScalarField; public: + using Builder = + std::conditional_t>, UltraCircuitBuilder, void>; // (challenge r, evaluation v = p(r)) OpeningPair opening_pair; // commitment to univariate polynomial p(X) Commitment commitment; + // WORKTODO: Number of bb::fr field elements used to represent a claim over Grumpkin + static constexpr size_t PUBLIC_INPUTS_SIZE = 10; + + uint32_t set_public() + requires(std::is_same_v>) + { + uint32_t start_idx = opening_pair.challenge.set_public(); + opening_pair.evaluation.set_public(); + commitment.set_public(); + return start_idx; + } + + static OpeningClaim reconstruct_from_public( + const std::span, PUBLIC_INPUTS_SIZE>& limbs) + requires(std::is_same_v>) + { + OpeningClaim claim; + // using BaseField = typename Curve::BaseField; + const size_t SFS_PER_BF = 4; + std::span, SFS_PER_BF> challenge_limbs{ limbs.data(), SFS_PER_BF }; + std::span, SFS_PER_BF> evaluation_limbs{ limbs.data() + SFS_PER_BF, SFS_PER_BF }; + claim.opening_pair.challenge = Fr::reconstruct_from_public(challenge_limbs); + claim.opening_pair.evaluation = Fr::reconstruct_from_public(evaluation_limbs); + + claim.commitment = { limbs.back() - 1, limbs.back(), false }; + // const size_t BFS_PER_BF = 1; + // BaseField x{ limbs.data() + 2 * SFS_PER_BF, BFS_PER_BF }; + // BaseField y{ limbs.data() + 2 * SFS_PER_BF + BFS_PER_BF, BFS_PER_BF }; + return claim; + } + IPAClaimIndices get_witness_indices() const requires(std::is_same_v>) { diff --git a/barretenberg/cpp/src/barretenberg/stdlib/honk_verifier/ultra_recursive_verifier.cpp b/barretenberg/cpp/src/barretenberg/stdlib/honk_verifier/ultra_recursive_verifier.cpp index 700c0640bbca..66d38655c7e6 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/honk_verifier/ultra_recursive_verifier.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/honk_verifier/ultra_recursive_verifier.cpp @@ -137,35 +137,42 @@ UltraRecursiveVerifier_::Output UltraRecursiveVerifier_::verify_ // Extract the IPA claim from the public inputs // Parse out the nested IPA claim using key->ipa_claim_public_input_indices and run the native IPA verifier. if constexpr (HasIPAAccumulator) { - const auto recover_fq_from_public_inputs = [](std::array& limbs) { - for (size_t k = 0; k < Curve::BaseField::NUM_LIMBS; k++) { - limbs[k].create_range_constraint(Curve::BaseField::NUM_LIMB_BITS, "limb_" + std::to_string(k)); - } - return Curve::BaseField::unsafe_construct_from_limbs(limbs[0], limbs[1], limbs[2], limbs[3], false); - }; + using PublicIpaClaim = PublicInputComponent>>; + + // const auto recover_fq_from_public_inputs = [](std::array& limbs) { + // for (size_t k = 0; k < Curve::BaseField::NUM_LIMBS; k++) { + // limbs[k].create_range_constraint(Curve::BaseField::NUM_LIMB_BITS, "limb_" + std::to_string(k)); + // } + // return Curve::BaseField::unsafe_construct_from_limbs(limbs[0], limbs[1], limbs[2], limbs[3], false); + // }; if (verification_key->verification_key->contains_ipa_claim) { - OpeningClaim> ipa_claim; - std::array challenge_bigfield_limbs; - for (size_t k = 0; k < Curve::BaseField::NUM_LIMBS; k++) { - challenge_bigfield_limbs[k] = - verification_key - ->public_inputs[verification_key->verification_key->ipa_claim_public_input_indices[k]]; - } - std::array evaluation_bigfield_limbs; - for (size_t k = 0; k < Curve::BaseField::NUM_LIMBS; k++) { - evaluation_bigfield_limbs[k] = - verification_key - ->public_inputs[verification_key->verification_key - ->ipa_claim_public_input_indices[Curve::BaseField::NUM_LIMBS + k]]; - } - ipa_claim.opening_pair.challenge = recover_fq_from_public_inputs(challenge_bigfield_limbs); - ipa_claim.opening_pair.evaluation = recover_fq_from_public_inputs(evaluation_bigfield_limbs); - ipa_claim.commitment = { - verification_key->public_inputs[verification_key->verification_key->ipa_claim_public_input_indices[8]], - verification_key->public_inputs[verification_key->verification_key->ipa_claim_public_input_indices[9]], - false - }; + PublicComponentKey ipa_claim_key{ verification_key->verification_key->ipa_claim_public_input_indices[0], + true }; + OpeningClaim> ipa_claim = + PublicIpaClaim::reconstruct(verification_key->public_inputs, ipa_claim_key); + + // OpeningClaim> ipa_claim; + // std::array challenge_bigfield_limbs; + // for (size_t k = 0; k < Curve::BaseField::NUM_LIMBS; k++) { + // challenge_bigfield_limbs[k] = + // verification_key + // ->public_inputs[verification_key->verification_key->ipa_claim_public_input_indices[k]]; + // } + // std::array evaluation_bigfield_limbs; + // for (size_t k = 0; k < Curve::BaseField::NUM_LIMBS; k++) { + // evaluation_bigfield_limbs[k] = + // verification_key + // ->public_inputs[verification_key->verification_key + // ->ipa_claim_public_input_indices[Curve::BaseField::NUM_LIMBS + k]]; + // } + // ipa_claim.opening_pair.challenge = recover_fq_from_public_inputs(challenge_bigfield_limbs); + // ipa_claim.opening_pair.evaluation = recover_fq_from_public_inputs(evaluation_bigfield_limbs); + // ipa_claim.commitment = { + // verification_key->public_inputs[verification_key->verification_key->ipa_claim_public_input_indices[8]], + // verification_key->public_inputs[verification_key->verification_key->ipa_claim_public_input_indices[9]], + // false + // }; output.ipa_opening_claim = std::move(ipa_claim); } } From fcbcaf16c1065401f991108d3a0ff9f6bb4ed3b4 Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Thu, 10 Apr 2025 04:01:18 +0000 Subject: [PATCH 2/7] fix commitment construction --- .../barretenberg/commitment_schemes/claim.hpp | 22 +++++++++---------- .../ultra_recursive_verifier.cpp | 5 ++--- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/claim.hpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/claim.hpp index 105990032613..e9cfb1e711c9 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/claim.hpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/claim.hpp @@ -74,19 +74,19 @@ template class OpeningClaim { const std::span, PUBLIC_INPUTS_SIZE>& limbs) requires(std::is_same_v>) { - OpeningClaim claim; - // using BaseField = typename Curve::BaseField; - const size_t SFS_PER_BF = 4; + using BaseField = typename Curve::BaseField; + + const size_t SFS_PER_BF = Fr::PUBLIC_INPUTS_SIZE; std::span, SFS_PER_BF> challenge_limbs{ limbs.data(), SFS_PER_BF }; std::span, SFS_PER_BF> evaluation_limbs{ limbs.data() + SFS_PER_BF, SFS_PER_BF }; - claim.opening_pair.challenge = Fr::reconstruct_from_public(challenge_limbs); - claim.opening_pair.evaluation = Fr::reconstruct_from_public(evaluation_limbs); - - claim.commitment = { limbs.back() - 1, limbs.back(), false }; - // const size_t BFS_PER_BF = 1; - // BaseField x{ limbs.data() + 2 * SFS_PER_BF, BFS_PER_BF }; - // BaseField y{ limbs.data() + 2 * SFS_PER_BF + BFS_PER_BF, BFS_PER_BF }; - return claim; + Fr challenge = Fr::reconstruct_from_public(challenge_limbs); + Fr evaluation = Fr::reconstruct_from_public(evaluation_limbs); + + BaseField x{ limbs[PUBLIC_INPUTS_SIZE - 2] }; + BaseField y{ limbs[PUBLIC_INPUTS_SIZE - 1] }; + Commitment commitment = { x, y, false }; + + return OpeningClaim{ { challenge, evaluation }, commitment }; } IPAClaimIndices get_witness_indices() const diff --git a/barretenberg/cpp/src/barretenberg/stdlib/honk_verifier/ultra_recursive_verifier.cpp b/barretenberg/cpp/src/barretenberg/stdlib/honk_verifier/ultra_recursive_verifier.cpp index 66d38655c7e6..4ebae03171b0 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/honk_verifier/ultra_recursive_verifier.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/honk_verifier/ultra_recursive_verifier.cpp @@ -149,8 +149,7 @@ UltraRecursiveVerifier_::Output UltraRecursiveVerifier_::verify_ if (verification_key->verification_key->contains_ipa_claim) { PublicComponentKey ipa_claim_key{ verification_key->verification_key->ipa_claim_public_input_indices[0], true }; - OpeningClaim> ipa_claim = - PublicIpaClaim::reconstruct(verification_key->public_inputs, ipa_claim_key); + output.ipa_opening_claim = PublicIpaClaim::reconstruct(verification_key->public_inputs, ipa_claim_key); // OpeningClaim> ipa_claim; // std::array challenge_bigfield_limbs; @@ -173,7 +172,7 @@ UltraRecursiveVerifier_::Output UltraRecursiveVerifier_::verify_ // verification_key->public_inputs[verification_key->verification_key->ipa_claim_public_input_indices[9]], // false // }; - output.ipa_opening_claim = std::move(ipa_claim); + // output.ipa_opening_claim = std::move(ipa_claim); } } From d4d304f73cc4245586dd9445c87bbf9cb131813e Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Thu, 10 Apr 2025 17:58:16 +0000 Subject: [PATCH 3/7] WiP set public on claim --- .../barretenberg/commitment_schemes/claim.hpp | 10 +++++++ .../ultra_recursive_verifier.cpp | 30 ------------------- .../ultra_recursive_verifier.test.cpp | 3 +- .../stdlib/primitives/field/field.hpp | 8 +++-- .../stdlib/primitives/group/cycle_group.hpp | 12 ++++++++ .../circuit_builder_base.hpp | 2 +- .../circuit_builder_base_impl.hpp | 7 +++-- .../circuit_simulator.hpp | 8 +++-- 8 files changed, 41 insertions(+), 39 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/claim.hpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/claim.hpp index e9cfb1e711c9..f1448d081c3a 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/claim.hpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/claim.hpp @@ -67,6 +67,16 @@ template class OpeningClaim { uint32_t start_idx = opening_pair.challenge.set_public(); opening_pair.evaluation.set_public(); commitment.set_public(); + + Builder* ctx = commitment.get_context(); + // TODO(https://github.com/AztecProtocol/barretenberg/issues/1325): Eventually the builder/PK/VK will store + // public input key which should be set here and ipa_claim_public_input_indices should go away. + uint32_t pub_idx = start_idx; + for (uint32_t& idx : ctx->ipa_claim_public_input_indices) { + idx = pub_idx++; + } + ctx->contains_ipa_claim = true; + return start_idx; } diff --git a/barretenberg/cpp/src/barretenberg/stdlib/honk_verifier/ultra_recursive_verifier.cpp b/barretenberg/cpp/src/barretenberg/stdlib/honk_verifier/ultra_recursive_verifier.cpp index 4ebae03171b0..abfc1959b2fc 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/honk_verifier/ultra_recursive_verifier.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/honk_verifier/ultra_recursive_verifier.cpp @@ -139,40 +139,10 @@ UltraRecursiveVerifier_::Output UltraRecursiveVerifier_::verify_ if constexpr (HasIPAAccumulator) { using PublicIpaClaim = PublicInputComponent>>; - // const auto recover_fq_from_public_inputs = [](std::array& limbs) { - // for (size_t k = 0; k < Curve::BaseField::NUM_LIMBS; k++) { - // limbs[k].create_range_constraint(Curve::BaseField::NUM_LIMB_BITS, "limb_" + std::to_string(k)); - // } - // return Curve::BaseField::unsafe_construct_from_limbs(limbs[0], limbs[1], limbs[2], limbs[3], false); - // }; - if (verification_key->verification_key->contains_ipa_claim) { PublicComponentKey ipa_claim_key{ verification_key->verification_key->ipa_claim_public_input_indices[0], true }; output.ipa_opening_claim = PublicIpaClaim::reconstruct(verification_key->public_inputs, ipa_claim_key); - - // OpeningClaim> ipa_claim; - // std::array challenge_bigfield_limbs; - // for (size_t k = 0; k < Curve::BaseField::NUM_LIMBS; k++) { - // challenge_bigfield_limbs[k] = - // verification_key - // ->public_inputs[verification_key->verification_key->ipa_claim_public_input_indices[k]]; - // } - // std::array evaluation_bigfield_limbs; - // for (size_t k = 0; k < Curve::BaseField::NUM_LIMBS; k++) { - // evaluation_bigfield_limbs[k] = - // verification_key - // ->public_inputs[verification_key->verification_key - // ->ipa_claim_public_input_indices[Curve::BaseField::NUM_LIMBS + k]]; - // } - // ipa_claim.opening_pair.challenge = recover_fq_from_public_inputs(challenge_bigfield_limbs); - // ipa_claim.opening_pair.evaluation = recover_fq_from_public_inputs(evaluation_bigfield_limbs); - // ipa_claim.commitment = { - // verification_key->public_inputs[verification_key->verification_key->ipa_claim_public_input_indices[8]], - // verification_key->public_inputs[verification_key->verification_key->ipa_claim_public_input_indices[9]], - // false - // }; - // output.ipa_opening_claim = std::move(ipa_claim); } } diff --git a/barretenberg/cpp/src/barretenberg/stdlib/honk_verifier/ultra_recursive_verifier.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/honk_verifier/ultra_recursive_verifier.test.cpp index 5f0bc54a602a..fd6f113bb394 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/honk_verifier/ultra_recursive_verifier.test.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/honk_verifier/ultra_recursive_verifier.test.cpp @@ -81,7 +81,8 @@ template class RecursiveVerifierTest : public testing if constexpr (HasIPAAccumulator) { auto [stdlib_opening_claim, ipa_proof] = IPA>::create_fake_ipa_claim_and_proof(builder); - builder.add_ipa_claim(stdlib_opening_claim.get_witness_indices()); + stdlib_opening_claim.set_public(); + // builder.add_ipa_claim(stdlib_opening_claim.get_witness_indices()); builder.ipa_proof = ipa_proof; } return builder; diff --git a/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field.hpp b/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field.hpp index 0386751c44b6..b367ea4a9dae 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field.hpp @@ -281,14 +281,16 @@ template class field_t { void assert_is_not_zero(std::string const& msg = "field_t::assert_is_not_zero") const; void assert_is_zero(std::string const& msg = "field_t::assert_is_zero") const; bool is_constant() const { return witness_index == IS_CONSTANT; } - void set_public() const + uint32_t set_public() const { + uint32_t public_input_index = 0; if constexpr (IsSimulator) { auto value = normalize().get_value(); - context->set_public_input(value); + public_input_index = context->set_public_input(value); } else { - context->set_public_input(normalize().witness_index); + public_input_index = context->set_public_input(normalize().witness_index); } + return public_input_index; } /** diff --git a/barretenberg/cpp/src/barretenberg/stdlib/primitives/group/cycle_group.hpp b/barretenberg/cpp/src/barretenberg/stdlib/primitives/group/cycle_group.hpp index af15a274ca86..87e6a1629399 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/primitives/group/cycle_group.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/primitives/group/cycle_group.hpp @@ -276,6 +276,18 @@ template class cycle_group { return OriginTag(x.get_origin_tag(), y.get_origin_tag(), _is_infinity.get_origin_tag()); } + /** + * @brief Set the witness indices representing the cycle_group to public + * + * @return uint32_t Index into the public inputs array at which the representation is stored + */ + uint32_t set_public() + { + uint32_t start_idx = x.set_public(); + y.set_public(); + return start_idx; + } + field_t x; field_t y; diff --git a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/circuit_builder_base.hpp b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/circuit_builder_base.hpp index 14d9abd33f40..cfea9d9ddff8 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/circuit_builder_base.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/circuit_builder_base.hpp @@ -187,7 +187,7 @@ template class CircuitBuilderBase { * * @param witness_index The index of the witness. * */ - virtual void set_public_input(uint32_t witness_index); + virtual uint32_t set_public_input(uint32_t witness_index); virtual void assert_equal(uint32_t a_idx, uint32_t b_idx, std::string const& msg = "assert_equal"); // TODO(#216)(Adrian): This method should belong in the ComposerHelper, where the number of reserved gates can be diff --git a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/circuit_builder_base_impl.hpp b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/circuit_builder_base_impl.hpp index 53ccae0becba..48b0ed9d7037 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/circuit_builder_base_impl.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/circuit_builder_base_impl.hpp @@ -176,17 +176,20 @@ template uint32_t CircuitBuilderBase::add_public_variable(co return index; } -template void CircuitBuilderBase::set_public_input(const uint32_t witness_index) +template uint32_t CircuitBuilderBase::set_public_input(const uint32_t witness_index) { for (const uint32_t public_input : public_inputs) { if (public_input == witness_index) { if (!failed()) { failure("Attempted to set a public input that is already public!"); } - return; + return 0; } } + uint32_t public_input_index = static_cast(public_inputs.size()); public_inputs.emplace_back(witness_index); + + return public_input_index; } /** diff --git a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/circuit_simulator.hpp b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/circuit_simulator.hpp index bdce39095f19..ced5b776251c 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/circuit_simulator.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/circuit_simulator.hpp @@ -55,9 +55,13 @@ class CircuitSimulatorBN254 { inline bb::fr get_variable([[maybe_unused]] const uint32_t index) const { return 1028; } uint32_t put_constant_variable([[maybe_unused]] const bb::fr& variable) { return 1028; } - void set_public_input([[maybe_unused]] const uint32_t witness_index) {} + uint32_t set_public_input([[maybe_unused]] const uint32_t witness_index) { return 0; } - void set_public_input(const bb::fr value) { public_inputs.emplace_back(value); } + uint32_t set_public_input(const bb::fr value) + { + public_inputs.emplace_back(value); + return 0; + } void fix_witness([[maybe_unused]] const uint32_t witness_index, [[maybe_unused]] const bb::fr& witness_value){}; From 8f47d154920a549322379a1a69f171004495ac1e Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Thu, 10 Apr 2025 18:46:40 +0000 Subject: [PATCH 4/7] use set public on all ipa claims --- .../cpp/src/barretenberg/api/prove_tube.cpp | 2 +- ..._description_ultra_recursive_verifier.test.cpp | 6 +++--- .../src/barretenberg/commitment_schemes/claim.hpp | 15 --------------- .../ipa_recursive.test.cpp | 8 ++++---- .../barretenberg/dsl/acir_format/acir_format.cpp | 2 +- .../client_ivc_recursive_verifier.test.cpp | 6 +++--- .../ultra_recursive_verifier.test.cpp | 4 ++-- .../ultra_honk/ultra_transcript.test.cpp | 4 ++-- .../recursion/goblin_avm_recursive_verifier.hpp | 2 +- .../recursion/goblin_avm_recursive_verifier.hpp | 2 +- 10 files changed, 18 insertions(+), 33 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/api/prove_tube.cpp b/barretenberg/cpp/src/barretenberg/api/prove_tube.cpp index 1c9c24386ae2..3ee07aeaad97 100644 --- a/barretenberg/cpp/src/barretenberg/api/prove_tube.cpp +++ b/barretenberg/cpp/src/barretenberg/api/prove_tube.cpp @@ -56,7 +56,7 @@ void prove_tube(const std::string& output_path, const std::string& vk_path) AggregationObject::add_default_pairing_points_to_public_inputs(*builder); // The tube only calls an IPA recursive verifier once, so we can just add this IPA claim and proof - builder->add_ipa_claim(client_ivc_rec_verifier_output.opening_claim.get_witness_indices()); + client_ivc_rec_verifier_output.opening_claim.set_public(); builder->ipa_proof = convert_stdlib_proof_to_native(client_ivc_rec_verifier_output.ipa_transcript->proof_data); ASSERT(builder->ipa_proof.size() && "IPA proof should not be empty"); diff --git a/barretenberg/cpp/src/barretenberg/boomerang_value_detection/graph_description_ultra_recursive_verifier.test.cpp b/barretenberg/cpp/src/barretenberg/boomerang_value_detection/graph_description_ultra_recursive_verifier.test.cpp index b810e2ef5aec..02b2e3095502 100644 --- a/barretenberg/cpp/src/barretenberg/boomerang_value_detection/graph_description_ultra_recursive_verifier.test.cpp +++ b/barretenberg/cpp/src/barretenberg/boomerang_value_detection/graph_description_ultra_recursive_verifier.test.cpp @@ -83,7 +83,7 @@ template class BoomerangRecursiveVerifierTest : publi if constexpr (HasIPAAccumulator) { auto [stdlib_opening_claim, ipa_proof] = IPA>::create_fake_ipa_claim_and_proof(builder); - builder.add_ipa_claim(stdlib_opening_claim.get_witness_indices()); + stdlib_opening_claim.set_public(); builder.ipa_proof = ipa_proof; } return builder; @@ -125,7 +125,7 @@ template class BoomerangRecursiveVerifierTest : publi pairing_points.P1.x.fix_witness(); pairing_points.P1.y.fix_witness(); if constexpr (HasIPAAccumulator) { - outer_circuit.add_ipa_claim(output.ipa_opening_claim.get_witness_indices()); + output.ipa_opening_claim.set_public(); outer_circuit.ipa_proof = convert_stdlib_proof_to_native(output.ipa_proof); } info("Recursive Verifier: num gates = ", outer_circuit.get_estimated_num_finalized_gates()); @@ -153,4 +153,4 @@ HEAVY_TYPED_TEST(BoomerangRecursiveVerifierTest, SingleRecursiveVerification) TestFixture::test_recursive_verification(); }; -} // namespace bb::stdlib::recursion::honk \ No newline at end of file +} // namespace bb::stdlib::recursion::honk diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/claim.hpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/claim.hpp index f1448d081c3a..296d905cc955 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/claim.hpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/claim.hpp @@ -99,21 +99,6 @@ template class OpeningClaim { return OpeningClaim{ { challenge, evaluation }, commitment }; } - IPAClaimIndices get_witness_indices() const - requires(std::is_same_v>) - { - return { opening_pair.challenge.binary_basis_limbs[0].element.normalize().witness_index, - opening_pair.challenge.binary_basis_limbs[1].element.normalize().witness_index, - opening_pair.challenge.binary_basis_limbs[2].element.normalize().witness_index, - opening_pair.challenge.binary_basis_limbs[3].element.normalize().witness_index, - opening_pair.evaluation.binary_basis_limbs[0].element.normalize().witness_index, - opening_pair.evaluation.binary_basis_limbs[1].element.normalize().witness_index, - opening_pair.evaluation.binary_basis_limbs[2].element.normalize().witness_index, - opening_pair.evaluation.binary_basis_limbs[3].element.normalize().witness_index, - commitment.x.normalize().witness_index, // no idea if we need these normalize() calls... - commitment.y.normalize().witness_index }; - } - auto get_native_opening_claim() const requires(Curve::is_stdlib_type) { diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes_recursion/ipa_recursive.test.cpp b/barretenberg/cpp/src/barretenberg/commitment_schemes_recursion/ipa_recursive.test.cpp index ca7f28756258..b826affe6a9f 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes_recursion/ipa_recursive.test.cpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes_recursion/ipa_recursive.test.cpp @@ -160,7 +160,7 @@ class IPARecursiveTests : public CommitmentTest { // polynomial. auto [output_claim, ipa_proof] = RecursiveIPA::accumulate(this->ck(), transcript_1, claim_1, transcript_2, claim_2); - builder.add_ipa_claim(output_claim.get_witness_indices()); + output_claim.set_public(); builder.ipa_proof = ipa_proof; builder.finalize_circuit(/*ensure_nonzero=*/false); info("Circuit with 2 IPA Recursive Verifiers and IPA Accumulation num finalized gates = ", @@ -266,7 +266,7 @@ TEST_F(IPARecursiveTests, AccumulationAndFullRecursiveVerifier) // Creates two IPA accumulators and accumulators from the two claims. Also constructs the accumulated h // polynomial. auto [output_claim, ipa_proof] = RecursiveIPA::accumulate(this->ck(), transcript_1, claim_1, transcript_2, claim_2); - builder.add_ipa_claim(output_claim.get_witness_indices()); + output_claim.set_public(); builder.ipa_proof = ipa_proof; builder.finalize_circuit(/*ensure_nonzero=*/false); info("Circuit with 2 IPA Recursive Verifiers and IPA Accumulation num finalized gates = ", @@ -314,7 +314,7 @@ TEST_F(IPARecursiveTests, AccumulationWithDifferentSizes) // Creates two IPA accumulators and accumulators from the two claims. Also constructs the accumulated h // polynomial. auto [output_claim, ipa_proof] = RecursiveIPA::accumulate(this->ck(), transcript_1, claim_1, transcript_2, claim_2); - builder.add_ipa_claim(output_claim.get_witness_indices()); + output_claim.set_public(); builder.ipa_proof = ipa_proof; builder.finalize_circuit(/*ensure_nonzero=*/false); info("Circuit with 2 IPA Recursive Verifiers and IPA Accumulation num finalized gates = ", @@ -332,4 +332,4 @@ TEST_F(IPARecursiveTests, AccumulationWithDifferentSizes) auto result = NativeIPA::reduce_verify(this->vk(), opening_claim, verifier_transcript); EXPECT_TRUE(result); -} \ No newline at end of file +} 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 3ba2b754179d..0377f137375e 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_format/acir_format.cpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_format/acir_format.cpp @@ -277,7 +277,7 @@ void build_constraints(Builder& builder, AcirProgram& program, const ProgramMeta // If we are proving with UltraRollupFlavor, the IPA proof should have nonzero size. ASSERT((metadata.honk_recursion == 2) == (output.ipa_proof.size() > 0)); if (metadata.honk_recursion == 2) { - builder.add_ipa_claim(output.ipa_claim.get_witness_indices()); + output.ipa_claim.set_public(); builder.ipa_proof = output.ipa_proof; } } 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 e431152cacb1..598f17e1ec55 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 @@ -109,7 +109,7 @@ TEST_F(ClientIVCRecursionTests, ClientTubeBase) // just using default. AggregationObject::add_default_pairing_points_to_public_inputs(*tube_builder); // The tube only calls an IPA recursive verifier once, so we can just add this IPA claim and proof - tube_builder->add_ipa_claim(client_ivc_rec_verifier_output.opening_claim.get_witness_indices()); + client_ivc_rec_verifier_output.opening_claim.set_public(); tube_builder->ipa_proof = convert_stdlib_proof_to_native(client_ivc_rec_verifier_output.ipa_transcript->proof_data); info("ClientIVC Recursive Verifier: num prefinalized gates = ", tube_builder->num_gates); @@ -140,7 +140,7 @@ TEST_F(ClientIVCRecursionTests, ClientTubeBase) base_verifier.verify_proof(base_tube_proof, AggregationObject::construct_default(base_builder)); info("Tube UH Recursive Verifier: num prefinalized gates = ", base_builder.num_gates); output.agg_obj.set_public(); - base_builder.add_ipa_claim(output.ipa_opening_claim.get_witness_indices()); + output.ipa_opening_claim.set_public(); base_builder.ipa_proof = tube_prover.proving_key->proving_key.ipa_proof; EXPECT_EQ(base_builder.failed(), false) << base_builder.err(); EXPECT_TRUE(CircuitChecker::check(base_builder)); @@ -172,7 +172,7 @@ TEST_F(ClientIVCRecursionTests, TubeVKIndependentOfInputCircuits) // instead of just using default. AggregationObject::add_default_pairing_points_to_public_inputs(*tube_builder); // The tube only calls an IPA recursive verifier once, so we can just add this IPA claim and proof - tube_builder->add_ipa_claim(client_ivc_rec_verifier_output.opening_claim.get_witness_indices()); + client_ivc_rec_verifier_output.opening_claim.set_public(); tube_builder->ipa_proof = convert_stdlib_proof_to_native(client_ivc_rec_verifier_output.ipa_transcript->proof_data); diff --git a/barretenberg/cpp/src/barretenberg/stdlib/honk_verifier/ultra_recursive_verifier.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/honk_verifier/ultra_recursive_verifier.test.cpp index fd6f113bb394..a24c62c5faf1 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/honk_verifier/ultra_recursive_verifier.test.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/honk_verifier/ultra_recursive_verifier.test.cpp @@ -166,7 +166,7 @@ template class RecursiveVerifierTest : public testing typename RecursiveVerifier::Output verifier_output = verifier.verify_proof(inner_proof, AggState::construct_default(outer_circuit)); if constexpr (HasIPAAccumulator) { - outer_circuit.add_ipa_claim(verifier_output.ipa_opening_claim.get_witness_indices()); + verifier_output.ipa_opening_claim.set_public(); outer_circuit.ipa_proof = convert_stdlib_proof_to_native(verifier_output.ipa_proof); } @@ -207,7 +207,7 @@ template class RecursiveVerifierTest : public testing VerifierOutput output = verifier.verify_proof(inner_proof, agg_obj); AggState pairing_points = output.agg_obj; if constexpr (HasIPAAccumulator) { - outer_circuit.add_ipa_claim(output.ipa_opening_claim.get_witness_indices()); + output.ipa_opening_claim.set_public(); outer_circuit.ipa_proof = convert_stdlib_proof_to_native(output.ipa_proof); } info("Recursive Verifier: num gates = ", outer_circuit.get_estimated_num_finalized_gates()); diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_transcript.test.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_transcript.test.cpp index 68a6d7245fc3..9de2a6dff35e 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_transcript.test.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_transcript.test.cpp @@ -161,7 +161,7 @@ template class UltraTranscriptTests : public ::testing::Test { if constexpr (HasIPAAccumulator) { auto [stdlib_opening_claim, ipa_proof] = IPA>::create_fake_ipa_claim_and_proof(builder); - builder.add_ipa_claim(stdlib_opening_claim.get_witness_indices()); + stdlib_opening_claim.set_public(); builder.ipa_proof = ipa_proof; } } @@ -177,7 +177,7 @@ template class UltraTranscriptTests : public ::testing::Test { if constexpr (HasIPAAccumulator) { auto [stdlib_opening_claim, ipa_proof] = IPA>::create_fake_ipa_claim_and_proof(builder); - builder.add_ipa_claim(stdlib_opening_claim.get_witness_indices()); + stdlib_opening_claim.set_public(); builder.ipa_proof = ipa_proof; } } diff --git a/barretenberg/cpp/src/barretenberg/vm/avm/recursion/goblin_avm_recursive_verifier.hpp b/barretenberg/cpp/src/barretenberg/vm/avm/recursion/goblin_avm_recursive_verifier.hpp index bf843e50045f..e0ef9a779ebd 100644 --- a/barretenberg/cpp/src/barretenberg/vm/avm/recursion/goblin_avm_recursive_verifier.hpp +++ b/barretenberg/cpp/src/barretenberg/vm/avm/recursion/goblin_avm_recursive_verifier.hpp @@ -179,7 +179,7 @@ class AvmGoblinRecursiveVerifier { // Propagate the IPA claim via the public inputs of the outer circuit // TODO(https://github.com/AztecProtocol/barretenberg/issues/1306): Determine the right location/entity to // handle this IPA data propagation. - ultra_builder->add_ipa_claim(goblin_verifier_output.opening_claim.get_witness_indices()); + goblin_verifier_output.opening_claim.set_public(); ultra_builder->ipa_proof = convert_stdlib_proof_to_native(goblin_verifier_output.ipa_transcript->proof_data); ASSERT(ultra_builder->ipa_proof.size() && "IPA proof should not be empty"); diff --git a/barretenberg/cpp/src/barretenberg/vm2/constraining/recursion/goblin_avm_recursive_verifier.hpp b/barretenberg/cpp/src/barretenberg/vm2/constraining/recursion/goblin_avm_recursive_verifier.hpp index 25b893c92bb1..cc51a503c904 100644 --- a/barretenberg/cpp/src/barretenberg/vm2/constraining/recursion/goblin_avm_recursive_verifier.hpp +++ b/barretenberg/cpp/src/barretenberg/vm2/constraining/recursion/goblin_avm_recursive_verifier.hpp @@ -146,7 +146,7 @@ class AvmGoblinRecursiveVerifier { // Propagate the IPA claim via the public inputs of the outer circuit // TODO(https://github.com/AztecProtocol/barretenberg/issues/1306): Determine the right location/entity to // handle this IPA data propagation. - ultra_builder.add_ipa_claim(goblin_verifier_output.opening_claim.get_witness_indices()); + goblin_verifier_output.opening_claim.set_public(); ultra_builder.ipa_proof = convert_stdlib_proof_to_native(goblin_verifier_output.ipa_transcript->proof_data); ASSERT(ultra_builder.ipa_proof.size() && "IPA proof should not be empty"); From b48944139b4192bff208a904532840882aae9693 Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Thu, 10 Apr 2025 20:00:51 +0000 Subject: [PATCH 5/7] improve reconstruct method and add comments --- .../barretenberg/commitment_schemes/claim.hpp | 30 ++++++++++++------- .../stdlib/primitives/group/cycle_group.hpp | 16 ++++++++++ 2 files changed, 35 insertions(+), 11 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/claim.hpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/claim.hpp index 296d905cc955..5a9a7d7eb74a 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/claim.hpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/claim.hpp @@ -61,6 +61,11 @@ template class OpeningClaim { // WORKTODO: Number of bb::fr field elements used to represent a claim over Grumpkin static constexpr size_t PUBLIC_INPUTS_SIZE = 10; + /** + * @brief Set the witness indices for the opening claim to public + * @note Implemented only for an opening claim over Grumpkin for use with IPA. + * + */ uint32_t set_public() requires(std::is_same_v>) { @@ -80,21 +85,24 @@ template class OpeningClaim { return start_idx; } + /** + * @brief Reconstruct an opening claim from limbs stored on the public inputs. + * @note Implemented only for an opening claim over Grumpkin for use with IPA. + * + */ static OpeningClaim reconstruct_from_public( const std::span, PUBLIC_INPUTS_SIZE>& limbs) requires(std::is_same_v>) { - using BaseField = typename Curve::BaseField; - - const size_t SFS_PER_BF = Fr::PUBLIC_INPUTS_SIZE; - std::span, SFS_PER_BF> challenge_limbs{ limbs.data(), SFS_PER_BF }; - std::span, SFS_PER_BF> evaluation_limbs{ limbs.data() + SFS_PER_BF, SFS_PER_BF }; - Fr challenge = Fr::reconstruct_from_public(challenge_limbs); - Fr evaluation = Fr::reconstruct_from_public(evaluation_limbs); - - BaseField x{ limbs[PUBLIC_INPUTS_SIZE - 2] }; - BaseField y{ limbs[PUBLIC_INPUTS_SIZE - 1] }; - Commitment commitment = { x, y, false }; + const size_t FIELD_SIZE = Fr::PUBLIC_INPUTS_SIZE; + const size_t COMMITMENT_SIZE = Commitment::PUBLIC_INPUTS_SIZE; + std::span, FIELD_SIZE> challenge_limbs{ limbs.data(), FIELD_SIZE }; + std::span, FIELD_SIZE> evaluation_limbs{ limbs.data() + FIELD_SIZE, FIELD_SIZE }; + std::span, COMMITMENT_SIZE> commitment_limbs{ limbs.data() + 2 * FIELD_SIZE, + COMMITMENT_SIZE }; + auto challenge = Fr::reconstruct_from_public(challenge_limbs); + auto evaluation = Fr::reconstruct_from_public(evaluation_limbs); + auto commitment = Commitment::reconstruct_from_public(commitment_limbs); return OpeningClaim{ { challenge, evaluation }, commitment }; } diff --git a/barretenberg/cpp/src/barretenberg/stdlib/primitives/group/cycle_group.hpp b/barretenberg/cpp/src/barretenberg/stdlib/primitives/group/cycle_group.hpp index 87e6a1629399..d8cd03ac553d 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/primitives/group/cycle_group.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/primitives/group/cycle_group.hpp @@ -48,6 +48,9 @@ template class cycle_group { static constexpr size_t NUM_ROUNDS = (NUM_BITS + TABLE_BITS - 1) / TABLE_BITS; inline static constexpr std::string_view OFFSET_GENERATOR_DOMAIN_SEPARATOR = "cycle_group_offset_generator"; + // Since the cycle_group base field is the circuit's native field, it can be stored using two public inputs. + static constexpr size_t PUBLIC_INPUTS_SIZE = 2; + private: public: /** @@ -288,6 +291,19 @@ template class cycle_group { return start_idx; } + /** + * @brief Reconstruct a cycle_group from limbs (generally stored in the public inputs) + * @details The base field of the cycle_group curve is the same as the circuit's native field so each coordinate is + * represented by a single "limb". + * + * @param limbs The coordinates of the cycle_group element + * @return cycle_group + */ + static cycle_group reconstruct_from_public(const std::span& limbs) + { + return cycle_group(limbs[0], limbs[1], false); + } + field_t x; field_t y; From f2ccec7a6470821069def9e9aa6715e3ce1c645c Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Thu, 10 Apr 2025 20:16:09 +0000 Subject: [PATCH 6/7] final cleanup and comment update --- .../barretenberg/commitment_schemes/claim.hpp | 4 ++-- .../ultra_recursive_verifier.test.cpp | 1 - .../circuit_builder_base.hpp | 2 -- .../circuit_builder_base_impl.hpp | 16 ---------------- 4 files changed, 2 insertions(+), 21 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/claim.hpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/claim.hpp index 5a9a7d7eb74a..2d1f2228531b 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/claim.hpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/claim.hpp @@ -58,8 +58,8 @@ template class OpeningClaim { // commitment to univariate polynomial p(X) Commitment commitment; - // WORKTODO: Number of bb::fr field elements used to represent a claim over Grumpkin - static constexpr size_t PUBLIC_INPUTS_SIZE = 10; + // Size of public inputs representation of an opening claim over Grumpkin + static constexpr size_t PUBLIC_INPUTS_SIZE = IPA_CLAIM_SIZE; /** * @brief Set the witness indices for the opening claim to public diff --git a/barretenberg/cpp/src/barretenberg/stdlib/honk_verifier/ultra_recursive_verifier.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/honk_verifier/ultra_recursive_verifier.test.cpp index a24c62c5faf1..fe3e37c0665d 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/honk_verifier/ultra_recursive_verifier.test.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/honk_verifier/ultra_recursive_verifier.test.cpp @@ -82,7 +82,6 @@ template class RecursiveVerifierTest : public testing auto [stdlib_opening_claim, ipa_proof] = IPA>::create_fake_ipa_claim_and_proof(builder); stdlib_opening_claim.set_public(); - // builder.add_ipa_claim(stdlib_opening_claim.get_witness_indices()); builder.ipa_proof = ipa_proof; } return builder; diff --git a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/circuit_builder_base.hpp b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/circuit_builder_base.hpp index cfea9d9ddff8..f840cef27d0b 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/circuit_builder_base.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/circuit_builder_base.hpp @@ -216,8 +216,6 @@ template class CircuitBuilderBase { void add_pairing_point_accumulator_for_plonk( const PairingPointAccumulatorIndices& pairing_point_accum_witness_indices); - void add_ipa_claim(const IPAClaimIndices& ipa_claim_witness_indices); - bool failed() const; const std::string& err() const; diff --git a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/circuit_builder_base_impl.hpp b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/circuit_builder_base_impl.hpp index 48b0ed9d7037..995dd905a32e 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/circuit_builder_base_impl.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/circuit_builder_base_impl.hpp @@ -258,22 +258,6 @@ void CircuitBuilderBase::add_pairing_point_accumulator_for_plonk( } } -template void CircuitBuilderBase::add_ipa_claim(const IPAClaimIndices& ipa_claim_witness_indices) -{ - if (contains_ipa_claim) { - failure("added IPA claim when one already exists"); - ASSERT(0); - } - contains_ipa_claim = true; - - size_t i = 0; - for (const auto& idx : ipa_claim_witness_indices) { - set_public_input(idx); - ipa_claim_public_input_indices[i] = static_cast(public_inputs.size() - 1); - ++i; - } -} - template bool CircuitBuilderBase::failed() const { return _failed; From b12a704895a471cc2dd3dee2f321b21c23d08e0c Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Tue, 15 Apr 2025 04:49:40 +0000 Subject: [PATCH 7/7] comments and asserts --- .../cpp/src/barretenberg/commitment_schemes/claim.hpp | 2 ++ .../stdlib_circuit_builders/circuit_builder_base.hpp | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/claim.hpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/claim.hpp index 2d1f2228531b..c066d04d1c30 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/claim.hpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/claim.hpp @@ -94,6 +94,8 @@ template class OpeningClaim { const std::span, PUBLIC_INPUTS_SIZE>& limbs) requires(std::is_same_v>) { + ASSERT(2 * Fr::PUBLIC_INPUTS_SIZE + Commitment::PUBLIC_INPUTS_SIZE == PUBLIC_INPUTS_SIZE); + const size_t FIELD_SIZE = Fr::PUBLIC_INPUTS_SIZE; const size_t COMMITMENT_SIZE = Commitment::PUBLIC_INPUTS_SIZE; std::span, FIELD_SIZE> challenge_limbs{ limbs.data(), FIELD_SIZE }; diff --git a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/circuit_builder_base.hpp b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/circuit_builder_base.hpp index f840cef27d0b..c63b8005a9a5 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/circuit_builder_base.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/circuit_builder_base.hpp @@ -183,10 +183,11 @@ template class CircuitBuilderBase { virtual uint32_t add_public_variable(const FF& in); /** - * Make a witness variable public. + * @brief Make a witness variable public. * * @param witness_index The index of the witness. - * */ + * @return uint32_t The index of the witness in the public inputs vector. + */ virtual uint32_t set_public_input(uint32_t witness_index); virtual void assert_equal(uint32_t a_idx, uint32_t b_idx, std::string const& msg = "assert_equal");