From f3ebebed3edfeb3fb91048945d7e0970a2f0121d Mon Sep 17 00:00:00 2001 From: AztecBot Date: Wed, 13 Aug 2025 08:50:22 +0000 Subject: [PATCH 01/14] [empty] Start merge-train. Choo choo. From 9bd186e19a4969d1d8baad18007eb507c8748ceb Mon Sep 17 00:00:00 2001 From: federicobarbacovi <171914500+federicobarbacovi@users.noreply.github.com> Date: Wed, 13 Aug 2025 13:30:06 +0000 Subject: [PATCH 02/14] Mock proofs --- .../dsl/acir_format/mock_verifier_inputs.cpp | 216 ++++++++++++++++++ .../dsl/acir_format/mock_verifier_inputs.hpp | 3 + 2 files changed, 219 insertions(+) diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.cpp b/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.cpp index b13f669d943e..4afbb98a9700 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.cpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.cpp @@ -189,6 +189,222 @@ Goblin::MergeProof create_mock_merge_proof() return proof; } +/** + * @brief Create a mock pre-ipa proof which has the correct structure but is not necessarily valid + * + * @return HonkProof + */ +HonkProof create_mock_pre_ipa_proof() +{ + using FF = ECCVMFlavor::FF; + HonkProof proof; + + // 1. NUM_WITNESS_ENTITIES commitments + for (size_t idx = 0; idx < ECCVMFlavor::NUM_WITNESS_ENTITIES; idx++) { + proof.emplace_back(FF::random_element()); + } + + // 2. Libra concatenation commitment + populate_field_elements_for_mock_commitments(proof, /*num_commitments*/ 1); + + // 3. Libra sum + proof.emplace_back(FF::random_element()); + + // 4. Sumcheck univariates commitments + populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/CONST_ECCVM_LOG_N); + + // 5. Sumcheck univariate evaluations + for (size_t idx = 0; idx < 2 * CONST_ECCVM_LOG_N; idx++) { + proof.emplace_back(FF::random_element()); + } + + // 6. ALL_ENTITIES sumcheck evaluations + for (size_t idx = 0; idx < ECCVMFlavor::NUM_ALL_ENTITIES; idx++) { + proof.emplace_back(FF::random_element()); + } + + // 7. Libra evaluation + proof.emplace_back(FF::random_element()); + + // 8. Libra grand sum commitment + populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/CONST_ECCVM_LOG_N); + + // 9. Libra quotient commitment + populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/CONST_ECCVM_LOG_N); + + // 10. Gemini masking commitment + populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/CONST_ECCVM_LOG_N); + + // 11. Gemini masking evaluations + proof.emplace_back(FF::random_element()); + + // 12. Gemini fold commitments + populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/CONST_ECCVM_LOG_N - 1); + + // 13. Gemini evaluations + for (size_t idx = 0; idx < CONST_ECCVM_LOG_N; idx++) { + proof.emplace_back(FF::random_element()); + } + + // 14. NUM_SMALL_IPA_EVALUATIONS libra evals + for (size_t idx = 0; idx < NUM_SMALL_IPA_EVALUATIONS; idx++) { + proof.emplace_back(FF::random_element()); + } + + // 15. Shplonk + populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/1); + + // 16. Translator concatenated masking term commitment + populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/1); + + // 17. Translator op evaluation + proof.emplace_back(FF::random_element()); + + // 18. Translator Px evaluation + proof.emplace_back(FF::random_element()); + + // 19. Translator Py evaluation + proof.emplace_back(FF::random_element()); + + // 20. Translator z1 evaluation + proof.emplace_back(FF::random_element()); + + // 21. Translator z2 evaluation + proof.emplace_back(FF::random_element()); + + // 22. Translator concatenated masking term evaluation + proof.emplace_back(FF::random_element()); + + // 23. Translator grand sum commitment + populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/1); + + // 24. Translator quotient commitment + populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/1); + + // 25. Translator concatenation evaluation + proof.emplace_back(FF::random_element()); + + // 26. Translator grand sum shift evaluation + proof.emplace_back(FF::random_element()); + + // 27. Translator grand sum evaluation + proof.emplace_back(FF::random_element()); + + // 28. Translator quotient evaluation + proof.emplace_back(FF::random_element()); + + // 29. Shplonk + populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/1); + + BB_ASSERT_EQ(proof.size(), ECCVMFlavor::PROOF_LENGTH_WITHOUT_PUB_INPUTS - IPA_PROOF_LENGTH); + + return proof; +} + +/** + * @brief Create a mock ipa proof which has the correct structure but is not necessarily valid + * + * @return HonkProof + */ +HonkProof create_mock_ipa_proof() +{ + HonkProof proof; + + // Commitments to L and R for CONST_ECCVM_LOG_N round + populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/2 * CONST_ECCVM_LOG_N); + + // Commitment to G_0 + populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/1); + + // a_0 evaluation + proof.emplace_back(fr::random_element()); + + BB_ASSERT_EQ(proof.size(), IPA_PROOF_LENGTH); + + return proof; +} + +/** + * @brief Create a mock translator proof which has the correct structure but is not necessarily valid + * + * @return HonkProof + */ +HonkProof create_mock_translator_proof() +{ + using FF = TranslatorFlavor::FF; + + HonkProof proof; + + // 1. Accumulated result + proof.emplace_back(FF::random_element()); + + // 1. NUM_WITNESS_ENTITIES commitments + populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/TranslatorFlavor::NUM_WITNESS_ENTITIES); + + // 2. Libra concatenation commitment + populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/1); + + // 3. Libra sum + proof.emplace_back(FF::random_element()); + + // 4. sumcheck univariates + for (size_t idx = 0; + idx < TranslatorFlavor::CONST_TRANSLATOR_LOG_N * TranslatorFlavor::BATCHED_RELATION_PARTIAL_LENGTH; + idx++) { + proof.emplace_back(FF::random_element()); + } + + // 5. NUM_ALL_ENTITIES sumcheck evaluations + for (size_t idx = 0; idx < TranslatorFlavor::NUM_ALL_ENTITIES; idx++) { + proof.emplace_back(FF::random_element()); + } + + // 6. Libra claimed evaluation + proof.emplace_back(FF::random_element()); + + // 7. Libra grand sum commitment + populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/1); + + // 8. Libra quotient commitment + populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/1); + + // 9. Gemini masking commitment + populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/1); + + // 10. Gemini masking evaluation + proof.emplace_back(FF::random_element()); + + // 11. CONST_TRANSLATOR_LOG_N - 1 Gemini fold commitments + populate_field_elements_for_mock_commitments(proof, + /*num_commitments=*/TranslatorFlavor::CONST_TRANSLATOR_LOG_N - 1); + + // 12. CONST_TRANSLATOR_LOG_N Gemini evaluations + for (size_t idx = 0; idx < TranslatorFlavor::CONST_TRANSLATOR_LOG_N; idx++) { + proof.emplace_back(FF::random_element()); + } + + // 13. Gemini P pos evaluation + proof.emplace_back(FF::random_element()); + + // 14. Gemini P neg evaluation + proof.emplace_back(FF::random_element()); + + // 15. NUM_SMALL_IPA_EVALUATIONS libra evals + for (size_t idx = 0; idx < NUM_SMALL_IPA_EVALUATIONS; idx++) { + proof.emplace_back(FF::random_element()); + } + + // 16. Shplonk + populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/1); + + // 17. KZG + populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/1); + + BB_ASSERT_EQ(proof.size(), TranslatorFlavor::PROOF_LENGTH_WITHOUT_PUB_INPUTS); + + return proof; +} + /** * @brief Create a mock MegaHonk VK that has the correct structure * diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.hpp b/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.hpp index eef92550e588..a3a2d135c22d 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.hpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.hpp @@ -19,6 +19,9 @@ template bb::HonkProof create_mock_decider_proof(); template bb::HonkProof create_mock_honk_proof(); template bb::HonkProof create_mock_pg_proof(); bb::Goblin::MergeProof create_mock_merge_proof(); +bb::HonkProof create_mock_pre_ipa_proof(); +bb::HonkProof create_mock_ipa_proof(); +bb::HonkProof create_mock_translator_proof(); template std::shared_ptr create_mock_honk_vk(const size_t dyadic_size, From ae8d4b8ec8a6cbc99381a1978f9e6737a8984f97 Mon Sep 17 00:00:00 2001 From: federicobarbacovi <171914500+federicobarbacovi@users.noreply.github.com> Date: Wed, 13 Aug 2025 13:32:55 +0000 Subject: [PATCH 03/14] Define tests --- .../acir_format/mock_verifier_inputs.test.cpp | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.test.cpp b/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.test.cpp index 4429064470f3..29d827c400e4 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.test.cpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.test.cpp @@ -31,6 +31,33 @@ TEST(MockVerifierInputsTest, MockMergeProofSize) EXPECT_EQ(merge_proof.size(), MERGE_PROOF_SIZE); } +/** + * @brief Check that the size of a mock pre-ipa proof matches expectation + */ +TEST(MockVerifierInputsTest, MockPreIpaProofSize) +{ + HonkProof pre_ipa_proof = create_mock_pre_ipa_proof(); + EXPECT_EQ(pre_ipa_proof.size(), ECCVMFlavor::PROOF_LENGTH_WITHOUT_PUB_INPUTS - IPA_PROOF_LENGTH); +} + +/** + * @brief Check that the size of a mock ipa proof matches expectation + */ +TEST(MockVerifierInputsTest, MockIPAProofSize) +{ + HonkProof ipa_proof = create_mock_ipa_proof(); + EXPECT_EQ(ipa_proof.size(), IPA_PROOF_LENGTH); +} + +/** + * @brief Check that the size of a mock translator proof matches expectation + */ +TEST(MockVerifierInputsTest, MockTranslatorProofSize) +{ + HonkProof translator_proof = create_mock_translator_proof(); + EXPECT_EQ(translator_proof.size(), TranslatorFlavor::PROOF_LENGTH_WITHOUT_PUB_INPUTS); +} + /** * @brief Check that the size of a mock Oink proof matches expectation for MegaFlavor * From e945a1fa3c3b5ff60e71c08a8531969c094a291e Mon Sep 17 00:00:00 2001 From: federicobarbacovi <171914500+federicobarbacovi@users.noreply.github.com> Date: Wed, 13 Aug 2025 13:34:36 +0000 Subject: [PATCH 04/14] Remove duplicate test --- .../dsl/acir_format/ivc_recursion_constraint.test.cpp | 9 --------- 1 file changed, 9 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_format/ivc_recursion_constraint.test.cpp b/barretenberg/cpp/src/barretenberg/dsl/acir_format/ivc_recursion_constraint.test.cpp index 1379ec7ba02b..8c1e8374a107 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_format/ivc_recursion_constraint.test.cpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_format/ivc_recursion_constraint.test.cpp @@ -255,15 +255,6 @@ class IvcRecursionConstraintTest : public ::testing::Test { void SetUp() override { bb::srs::init_file_crs_factory(bb::srs::bb_crs_path()); } }; -/** - * @brief Check that the size of a mock merge proof matches expectation - */ -TEST_F(IvcRecursionConstraintTest, MockMergeProofSize) -{ - Goblin::MergeProof merge_proof = create_mock_merge_proof(); - EXPECT_EQ(merge_proof.size(), MERGE_PROOF_SIZE); -} - /** * @brief Test IVC accumulation of a one app and one kernel; The kernel includes a recursive oink verification for the * app, specified via an ACIR RecursionConstraint. From 6c2876f477cd6332d1cb8dff20a3f68b3bfba7a2 Mon Sep 17 00:00:00 2001 From: federicobarbacovi <171914500+federicobarbacovi@users.noreply.github.com> Date: Wed, 13 Aug 2025 14:06:36 +0000 Subject: [PATCH 05/14] Fixes --- .../dsl/acir_format/mock_verifier_inputs.cpp | 148 +++++++++--------- 1 file changed, 76 insertions(+), 72 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.cpp b/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.cpp index 4afbb98a9700..a5ca0ebba9f5 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.cpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.cpp @@ -27,9 +27,10 @@ using namespace bb; * @param fields field buffer to append mock commitment values to * @param num_commitments number of mock commitments to append */ +template void populate_field_elements_for_mock_commitments(std::vector& fields, const size_t& num_commitments) { - auto mock_commitment = curve::BN254::AffineElement::one(); + auto mock_commitment = Curve::AffineElement::one(); std::vector mock_commitment_frs = field_conversion::convert_to_bn254_frs(mock_commitment); for (size_t i = 0; i < num_commitments; ++i) { for (const fr& val : mock_commitment_frs) { @@ -38,6 +39,22 @@ void populate_field_elements_for_mock_commitments(std::vector& fields, const } } +/** + * @brief Helper to populate a field buffer with some number of field elements + * + * @param fields field buffer to append field elements to + * @param num_commitments number of mock commitments to append + */ +template +void populate_field_elements(std::vector& fields, const size_t& num_elements) +{ + for (size_t i = 0; i < num_elements; ++i) { + for (auto& val : field_conversion::convert_to_bn254_frs(FF::random_element())) { + fields.emplace_back(val); + } + } +} + /** * @brief Create a mock oink proof that has the correct structure but is not in general valid * @@ -200,101 +217,91 @@ HonkProof create_mock_pre_ipa_proof() HonkProof proof; // 1. NUM_WITNESS_ENTITIES commitments - for (size_t idx = 0; idx < ECCVMFlavor::NUM_WITNESS_ENTITIES; idx++) { - proof.emplace_back(FF::random_element()); - } + populate_field_elements_for_mock_commitments(proof, ECCVMFlavor::NUM_WITNESS_ENTITIES); // 2. Libra concatenation commitment - populate_field_elements_for_mock_commitments(proof, /*num_commitments*/ 1); + populate_field_elements_for_mock_commitments(proof, /*num_commitments*/ 1); // 3. Libra sum - proof.emplace_back(FF::random_element()); + populate_field_elements(proof, 1); // 4. Sumcheck univariates commitments - populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/CONST_ECCVM_LOG_N); + populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/CONST_ECCVM_LOG_N); // 5. Sumcheck univariate evaluations - for (size_t idx = 0; idx < 2 * CONST_ECCVM_LOG_N; idx++) { - proof.emplace_back(FF::random_element()); - } + populate_field_elements(proof, CONST_ECCVM_LOG_N + CONST_ECCVM_LOG_N); // 6. ALL_ENTITIES sumcheck evaluations - for (size_t idx = 0; idx < ECCVMFlavor::NUM_ALL_ENTITIES; idx++) { - proof.emplace_back(FF::random_element()); - } + populate_field_elements(proof, ECCVMFlavor::NUM_ALL_ENTITIES); // 7. Libra evaluation - proof.emplace_back(FF::random_element()); + populate_field_elements(proof, 1); // 8. Libra grand sum commitment - populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/CONST_ECCVM_LOG_N); + populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/1); // 9. Libra quotient commitment - populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/CONST_ECCVM_LOG_N); + populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/1); // 10. Gemini masking commitment - populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/CONST_ECCVM_LOG_N); + populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/1); // 11. Gemini masking evaluations - proof.emplace_back(FF::random_element()); + populate_field_elements(proof, 1); // 12. Gemini fold commitments - populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/CONST_ECCVM_LOG_N - 1); + populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/CONST_ECCVM_LOG_N - 1); // 13. Gemini evaluations - for (size_t idx = 0; idx < CONST_ECCVM_LOG_N; idx++) { - proof.emplace_back(FF::random_element()); - } + populate_field_elements(proof, CONST_ECCVM_LOG_N); // 14. NUM_SMALL_IPA_EVALUATIONS libra evals - for (size_t idx = 0; idx < NUM_SMALL_IPA_EVALUATIONS; idx++) { - proof.emplace_back(FF::random_element()); - } + populate_field_elements(proof, NUM_SMALL_IPA_EVALUATIONS); // 15. Shplonk - populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/1); + populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/1); // 16. Translator concatenated masking term commitment - populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/1); + populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/1); // 17. Translator op evaluation - proof.emplace_back(FF::random_element()); + populate_field_elements(proof, 1); // 18. Translator Px evaluation - proof.emplace_back(FF::random_element()); + populate_field_elements(proof, 1); // 19. Translator Py evaluation - proof.emplace_back(FF::random_element()); + populate_field_elements(proof, 1); // 20. Translator z1 evaluation - proof.emplace_back(FF::random_element()); + populate_field_elements(proof, 1); // 21. Translator z2 evaluation - proof.emplace_back(FF::random_element()); + populate_field_elements(proof, 1); // 22. Translator concatenated masking term evaluation - proof.emplace_back(FF::random_element()); + populate_field_elements(proof, 1); // 23. Translator grand sum commitment - populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/1); + populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/1); // 24. Translator quotient commitment - populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/1); + populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/1); // 25. Translator concatenation evaluation - proof.emplace_back(FF::random_element()); + populate_field_elements(proof, 1); // 26. Translator grand sum shift evaluation - proof.emplace_back(FF::random_element()); + populate_field_elements(proof, 1); // 27. Translator grand sum evaluation - proof.emplace_back(FF::random_element()); + populate_field_elements(proof, 1); // 28. Translator quotient evaluation - proof.emplace_back(FF::random_element()); + populate_field_elements(proof, 1); // 29. Shplonk - populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/1); + populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/1); BB_ASSERT_EQ(proof.size(), ECCVMFlavor::PROOF_LENGTH_WITHOUT_PUB_INPUTS - IPA_PROOF_LENGTH); @@ -311,12 +318,14 @@ HonkProof create_mock_ipa_proof() HonkProof proof; // Commitments to L and R for CONST_ECCVM_LOG_N round - populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/2 * CONST_ECCVM_LOG_N); + populate_field_elements_for_mock_commitments( + proof, /*num_commitments=*/CONST_ECCVM_LOG_N + CONST_ECCVM_LOG_N); // Commitment to G_0 - populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/1); + populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/1); - // a_0 evaluation + // a_0 evaluation (a_0 is in the base field of BN254) + proof.emplace_back(fr::random_element()); proof.emplace_back(fr::random_element()); BB_ASSERT_EQ(proof.size(), IPA_PROOF_LENGTH); @@ -332,73 +341,68 @@ HonkProof create_mock_ipa_proof() HonkProof create_mock_translator_proof() { using FF = TranslatorFlavor::FF; + using BF = TranslatorFlavor::BF; + using Curve = TranslatorFlavor::Curve; HonkProof proof; // 1. Accumulated result - proof.emplace_back(FF::random_element()); + populate_field_elements(proof, 1); // 1. NUM_WITNESS_ENTITIES commitments - populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/TranslatorFlavor::NUM_WITNESS_ENTITIES); + populate_field_elements_for_mock_commitments(proof, + /*num_commitments=*/TranslatorFlavor::NUM_WITNESS_ENTITIES - 4); // 2. Libra concatenation commitment - populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/1); + populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/1); // 3. Libra sum - proof.emplace_back(FF::random_element()); + populate_field_elements(proof, 1); // 4. sumcheck univariates - for (size_t idx = 0; - idx < TranslatorFlavor::CONST_TRANSLATOR_LOG_N * TranslatorFlavor::BATCHED_RELATION_PARTIAL_LENGTH; - idx++) { - proof.emplace_back(FF::random_element()); - } + populate_field_elements( + proof, TranslatorFlavor::CONST_TRANSLATOR_LOG_N * TranslatorFlavor::BATCHED_RELATION_PARTIAL_LENGTH); // 5. NUM_ALL_ENTITIES sumcheck evaluations - for (size_t idx = 0; idx < TranslatorFlavor::NUM_ALL_ENTITIES; idx++) { - proof.emplace_back(FF::random_element()); - } + populate_field_elements(proof, TranslatorFlavor::NUM_ALL_ENTITIES); // 6. Libra claimed evaluation - proof.emplace_back(FF::random_element()); + populate_field_elements(proof, 1); // 7. Libra grand sum commitment - populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/1); + populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/1); // 8. Libra quotient commitment - populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/1); + populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/1); // 9. Gemini masking commitment - populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/1); + populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/1); // 10. Gemini masking evaluation - proof.emplace_back(FF::random_element()); + populate_field_elements(proof, 1); // 11. CONST_TRANSLATOR_LOG_N - 1 Gemini fold commitments - populate_field_elements_for_mock_commitments(proof, - /*num_commitments=*/TranslatorFlavor::CONST_TRANSLATOR_LOG_N - 1); + populate_field_elements_for_mock_commitments(proof, + /*num_commitments=*/TranslatorFlavor::CONST_TRANSLATOR_LOG_N - + 1); // 12. CONST_TRANSLATOR_LOG_N Gemini evaluations - for (size_t idx = 0; idx < TranslatorFlavor::CONST_TRANSLATOR_LOG_N; idx++) { - proof.emplace_back(FF::random_element()); - } + populate_field_elements(proof, TranslatorFlavor::CONST_TRANSLATOR_LOG_N); // 13. Gemini P pos evaluation - proof.emplace_back(FF::random_element()); + populate_field_elements(proof, 1); // 14. Gemini P neg evaluation - proof.emplace_back(FF::random_element()); + populate_field_elements(proof, 1); // 15. NUM_SMALL_IPA_EVALUATIONS libra evals - for (size_t idx = 0; idx < NUM_SMALL_IPA_EVALUATIONS; idx++) { - proof.emplace_back(FF::random_element()); - } + populate_field_elements(proof, NUM_SMALL_IPA_EVALUATIONS); // 16. Shplonk - populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/1); + populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/1); // 17. KZG - populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/1); + populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/1); BB_ASSERT_EQ(proof.size(), TranslatorFlavor::PROOF_LENGTH_WITHOUT_PUB_INPUTS); From a2dedb26c889eab126611a23083c165d83098d45 Mon Sep 17 00:00:00 2001 From: federicobarbacovi <171914500+federicobarbacovi@users.noreply.github.com> Date: Wed, 13 Aug 2025 14:50:04 +0000 Subject: [PATCH 06/14] Clean up --- .../dsl/acir_format/mock_verifier_inputs.cpp | 78 ++++++++----------- 1 file changed, 31 insertions(+), 47 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.cpp b/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.cpp index a5ca0ebba9f5..62cf51963f41 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.cpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.cpp @@ -43,14 +43,22 @@ void populate_field_elements_for_mock_commitments(std::vector& fields, const * @brief Helper to populate a field buffer with some number of field elements * * @param fields field buffer to append field elements to - * @param num_commitments number of mock commitments to append + * @param num_elements number of mock commitments to append */ template -void populate_field_elements(std::vector& fields, const size_t& num_elements) +void populate_field_elements(std::vector& fields, + const size_t& num_elements, + std::optional value = std::nullopt) { - for (size_t i = 0; i < num_elements; ++i) { - for (auto& val : field_conversion::convert_to_bn254_frs(FF::random_element())) { - fields.emplace_back(val); + if (value.has_value()) { + for (size_t i = 0; i < num_elements; ++i) { + fields.emplace_back(fr{ value.value() }); + } + } else { + for (size_t i = 0; i < num_elements; ++i) { + for (auto& val : field_conversion::convert_to_bn254_frs(FF::random_element())) { + fields.emplace_back(val); + } } } } @@ -83,20 +91,14 @@ template HonkProof create_mock_oink_proof( */ template HonkProof create_mock_decider_proof() { - using FF = typename Flavor::FF; - HonkProof proof; // Sumcheck univariates const size_t TOTAL_SIZE_SUMCHECK_UNIVARIATES = CONST_PROOF_SIZE_LOG_N * Flavor::BATCHED_RELATION_PARTIAL_LENGTH; - for (size_t i = 0; i < TOTAL_SIZE_SUMCHECK_UNIVARIATES; ++i) { - proof.emplace_back(FF::random_element()); - } + populate_field_elements(proof, TOTAL_SIZE_SUMCHECK_UNIVARIATES); // Sumcheck multilinear evaluations - for (size_t i = 0; i < Flavor::NUM_ALL_ENTITIES; ++i) { - proof.emplace_back(FF::random_element()); - } + populate_field_elements(proof, Flavor::NUM_ALL_ENTITIES); // Gemini fold commitments const size_t NUM_GEMINI_FOLD_COMMITMENTS = CONST_PROOF_SIZE_LOG_N - 1; @@ -104,9 +106,7 @@ template HonkProof create_mock_decider_proof() // Gemini fold evaluations const size_t NUM_GEMINI_FOLD_EVALUATIONS = CONST_PROOF_SIZE_LOG_N; - for (size_t i = 0; i < NUM_GEMINI_FOLD_EVALUATIONS; ++i) { - proof.emplace_back(FF::random_element()); - } + populate_field_elements(proof, NUM_GEMINI_FOLD_EVALUATIONS); // Shplonk batched quotient commitment populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/1); @@ -142,15 +142,12 @@ template HonkProof create_mock_pg_proof() HonkProof proof = create_mock_oink_proof(); // Populate mock perturbator coefficients - for (size_t idx = 1; idx <= CONST_PG_LOG_N; idx++) { - proof.emplace_back(0); - } + populate_field_elements(proof, CONST_PG_LOG_N, /*value=*/0); // Populate mock combiner quotient coefficients - for (size_t idx = DeciderProvingKeys_::NUM; idx < DeciderProvingKeys_::BATCHED_EXTENDED_LENGTH; - idx++) { - proof.emplace_back(0); - } + size_t NUM_COEFF_COMBINER_QUOTIENT = + DeciderProvingKeys_::BATCHED_EXTENDED_LENGTH - DeciderProvingKeys_::NUM; + populate_field_elements(proof, NUM_COEFF_COMBINER_QUOTIENT, /*value=*/0); return proof; } @@ -162,18 +159,13 @@ template HonkProof create_mock_pg_proof() */ Goblin::MergeProof create_mock_merge_proof() { - using Flavor = MegaFlavor; - using FF = Flavor::FF; - - std::vector proof; + Goblin::MergeProof proof; proof.reserve(MERGE_PROOF_SIZE); - FF mock_val(5); - auto mock_commitment = curve::BN254::AffineElement::one(); - std::vector mock_commitment_frs = field_conversion::convert_to_bn254_frs(mock_commitment); + uint32_t mock_shift_size = 5; - // Populate mock subtable size - proof.emplace_back(mock_val); + // Populate mock shift size + populate_field_elements(proof, 1, /*value=*/mock_shift_size); // There are 8 entities in the merge protocol (4 columns x 2 components: T_j, g_j(X) = X^{l-1} t_j(X)) // and 8 evaluations (4 columns x 2 components: g_j(kappa), t_j(1/kappa)) @@ -181,25 +173,16 @@ Goblin::MergeProof create_mock_merge_proof() const size_t NUM_TRANSCRIPT_EVALUATIONS = 8; // Transcript poly commitments - for (size_t i = 0; i < NUM_TRANSCRIPT_ENTITIES; ++i) { - for (const FF& val : mock_commitment_frs) { - proof.emplace_back(val); - } - } + populate_field_elements_for_mock_commitments(proof, NUM_TRANSCRIPT_ENTITIES); + // Transcript poly evaluations - for (size_t i = 0; i < NUM_TRANSCRIPT_EVALUATIONS; ++i) { - proof.emplace_back(mock_val); - } + populate_field_elements(proof, NUM_TRANSCRIPT_EVALUATIONS); // Shplonk proof: commitment to the quotient - for (const FF& val : mock_commitment_frs) { - proof.emplace_back(val); - } + populate_field_elements_for_mock_commitments(proof, 1); // KZG proof: commitment to W - for (const FF& val : mock_commitment_frs) { - proof.emplace_back(val); - } + populate_field_elements_for_mock_commitments(proof, 1); BB_ASSERT_EQ(proof.size(), MERGE_PROOF_SIZE); @@ -250,7 +233,8 @@ HonkProof create_mock_pre_ipa_proof() populate_field_elements(proof, 1); // 12. Gemini fold commitments - populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/CONST_ECCVM_LOG_N - 1); + populate_field_elements_for_mock_commitments(proof, + /*num_commitments=*/CONST_ECCVM_LOG_N - 1); // 13. Gemini evaluations populate_field_elements(proof, CONST_ECCVM_LOG_N); From 4f36de3cdb9a104e3b6692faebdde68d95c4d61b Mon Sep 17 00:00:00 2001 From: federicobarbacovi <171914500+federicobarbacovi@users.noreply.github.com> Date: Thu, 14 Aug 2025 09:41:19 +0000 Subject: [PATCH 07/14] Update mock proof generation --- .../dsl/acir_format/mock_verifier_inputs.cpp | 44 ++++++++++++- .../acir_format/mock_verifier_inputs.test.cpp | 63 ++++++++++++------- 2 files changed, 84 insertions(+), 23 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.cpp b/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.cpp index 62cf51963f41..cc9635cfd236 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.cpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.cpp @@ -43,7 +43,8 @@ void populate_field_elements_for_mock_commitments(std::vector& fields, const * @brief Helper to populate a field buffer with some number of field elements * * @param fields field buffer to append field elements to - * @param num_elements number of mock commitments to append + * @param num_elements number of mock field elements to append + * @param value optional mock value appended */ template void populate_field_elements(std::vector& fields, @@ -93,6 +94,14 @@ template HonkProof create_mock_decider_proof() { HonkProof proof; + if (Flavor::HasZK) { + // Libra concatenation commitment + populate_field_elements_for_mock_commitments(proof, 1); + + // Libra sum + populate_field_elements(proof, 1); + } + // Sumcheck univariates const size_t TOTAL_SIZE_SUMCHECK_UNIVARIATES = CONST_PROOF_SIZE_LOG_N * Flavor::BATCHED_RELATION_PARTIAL_LENGTH; populate_field_elements(proof, TOTAL_SIZE_SUMCHECK_UNIVARIATES); @@ -100,6 +109,23 @@ template HonkProof create_mock_decider_proof() // Sumcheck multilinear evaluations populate_field_elements(proof, Flavor::NUM_ALL_ENTITIES); + if (Flavor::HasZK) { + // Libra claimed evaluation + populate_field_elements(proof, 1); + + // Libra grand sum commitment + populate_field_elements_for_mock_commitments(proof, 1); + + // Libra quotient commitment + populate_field_elements_for_mock_commitments(proof, 1); + + // Gemini masking commitment + populate_field_elements_for_mock_commitments(proof, 1); + + // Gemini masking evaluation + populate_field_elements(proof, 1); + } + // Gemini fold commitments const size_t NUM_GEMINI_FOLD_COMMITMENTS = CONST_PROOF_SIZE_LOG_N - 1; populate_field_elements_for_mock_commitments(proof, NUM_GEMINI_FOLD_COMMITMENTS); @@ -108,6 +134,11 @@ template HonkProof create_mock_decider_proof() const size_t NUM_GEMINI_FOLD_EVALUATIONS = CONST_PROOF_SIZE_LOG_N; populate_field_elements(proof, NUM_GEMINI_FOLD_EVALUATIONS); + if (Flavor::HasZK) { + // NUM_SMALL_IPA_EVALUATIONS libra evals + populate_field_elements(proof, NUM_SMALL_IPA_EVALUATIONS); + } + // Shplonk batched quotient commitment populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/1); // KZG quotient commitment @@ -129,6 +160,11 @@ template HonkProof create_mock_honk_proof( proof.reserve(oink_proof.size() + decider_proof.size()); proof.insert(proof.end(), oink_proof.begin(), oink_proof.end()); proof.insert(proof.end(), decider_proof.begin(), decider_proof.end()); + + if (HasIPAAccumulator) { + HonkProof ipa_proof = create_mock_ipa_proof(); + proof.insert(proof.end(), ipa_proof.begin(), ipa_proof.end()); + } return proof; } @@ -444,15 +480,21 @@ template HonkProof create_mock_oink_proof>(); template HonkProof create_mock_oink_proof>(); +template HonkProof create_mock_oink_proof>(); +template HonkProof create_mock_oink_proof(); template HonkProof create_mock_decider_proof(); template HonkProof create_mock_decider_proof(); +template HonkProof create_mock_decider_proof(); +template HonkProof create_mock_decider_proof(); template HonkProof create_mock_honk_proof(); template HonkProof create_mock_honk_proof(); template HonkProof create_mock_honk_proof>(); template HonkProof create_mock_honk_proof>(); +template HonkProof create_mock_honk_proof>(); +template HonkProof create_mock_honk_proof(); template HonkProof create_mock_pg_proof(); template HonkProof create_mock_pg_proof(); diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.test.cpp b/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.test.cpp index 29d827c400e4..6b5e4fc055ae 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.test.cpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.test.cpp @@ -16,9 +16,12 @@ using namespace acir_format; using namespace bb; -template class MockVerifierInputsTest : public ::testing::Test {}; +template class MockVerifierInputsTest : public ::testing::Test { + public: + static void SetUpTestSuite() { bb::srs::init_file_crs_factory(bb::srs::bb_crs_path()); } +}; -using FlavorTypes = testing::Types; +using FlavorTypes = testing::Types; TYPED_TEST_SUITE(MockVerifierInputsTest, FlavorTypes); @@ -90,18 +93,24 @@ TEST(MockVerifierInputsTest, MockMegaOinkProofSize) } /** - * @brief Check that the size of a mock Oink proof matches expectation for UltraFlavor + * @brief Check that the size of a mock Oink proof matches expectation for Ultra flavors * */ -TEST(MockVerifierInputsTest, MockUltraOinkProofSize) +TYPED_TEST(MockVerifierInputsTest, MockUltraOinkProofSize) { - using Flavor = UltraFlavor; - using Builder = UltraCircuitBuilder; - - // DefaultIO - const size_t NUM_PUBLIC_INPUTS = stdlib::recursion::honk::DefaultIO::PUBLIC_INPUTS_SIZE; - HonkProof honk_proof = create_mock_oink_proof>(); - EXPECT_EQ(honk_proof.size(), Flavor::OINK_PROOF_LENGTH_WITHOUT_PUB_INPUTS + NUM_PUBLIC_INPUTS); + using Flavor = TypeParam; + using Builder = Flavor::CircuitBuilder; + using IO = std::conditional_t, + stdlib::recursion::honk::RollupIO, + stdlib::recursion::honk::DefaultIO>; + + if (!std::is_same_v) { + const size_t NUM_PUBLIC_INPUTS = IO::PUBLIC_INPUTS_SIZE; + HonkProof honk_proof = create_mock_oink_proof(); + EXPECT_EQ(honk_proof.size(), Flavor::OINK_PROOF_LENGTH_WITHOUT_PUB_INPUTS + NUM_PUBLIC_INPUTS); + } else { + GTEST_SKIP(); + } } /** @@ -112,8 +121,12 @@ TYPED_TEST(MockVerifierInputsTest, MockDeciderProofSize) { using Flavor = TypeParam; - HonkProof honk_proof = create_mock_decider_proof(); - EXPECT_EQ(honk_proof.size(), Flavor::DECIDER_PROOF_LENGTH()); + if (!std::is_same_v) { + HonkProof honk_proof = create_mock_decider_proof(); + EXPECT_EQ(honk_proof.size(), Flavor::DECIDER_PROOF_LENGTH()); + } else { + GTEST_SKIP(); + } } /** @@ -148,16 +161,22 @@ TEST(MockVerifierInputsTest, MockMegaHonkProofSize) } /** - * @brief Check that the size of a mock Honk proof matches expectation for UltraFlavor + * @brief Check that the size of a mock Honk proof matches expectation for Ultra flavors * */ -TEST(MockVerifierInputsTest, MockHonkProofSize) +TYPED_TEST(MockVerifierInputsTest, MockHonkProofSize) { - using Flavor = UltraFlavor; - using Builder = UltraCircuitBuilder; - - // DefaultIO - const size_t NUM_PUBLIC_INPUTS = stdlib::recursion::honk::DefaultIO::PUBLIC_INPUTS_SIZE; - HonkProof honk_proof = create_mock_honk_proof>(); - EXPECT_EQ(honk_proof.size(), Flavor::PROOF_LENGTH_WITHOUT_PUB_INPUTS() + NUM_PUBLIC_INPUTS); + using Flavor = TypeParam; + using Builder = Flavor::CircuitBuilder; + using IO = std::conditional_t, + stdlib::recursion::honk::RollupIO, + stdlib::recursion::honk::DefaultIO>; + + if (!std::is_same_v) { + const size_t NUM_PUBLIC_INPUTS = IO::PUBLIC_INPUTS_SIZE; + HonkProof honk_proof = create_mock_honk_proof(); + EXPECT_EQ(honk_proof.size(), Flavor::PROOF_LENGTH_WITHOUT_PUB_INPUTS() + NUM_PUBLIC_INPUTS); + } else { + GTEST_SKIP(); + } } From c8a8abfddc4630e91a905e03638921a20ca017db Mon Sep 17 00:00:00 2001 From: federicobarbacovi <171914500+federicobarbacovi@users.noreply.github.com> Date: Thu, 14 Aug 2025 10:28:09 +0000 Subject: [PATCH 08/14] Use mock verification logic in honk recursion constraint --- .../acir_format/honk_recursion_constraint.cpp | 152 +++--------------- .../dsl/acir_format/mock_verifier_inputs.cpp | 84 +++++++--- .../dsl/acir_format/mock_verifier_inputs.hpp | 9 +- .../special_public_inputs.hpp | 3 +- 4 files changed, 89 insertions(+), 159 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_format/honk_recursion_constraint.cpp b/barretenberg/cpp/src/barretenberg/dsl/acir_format/honk_recursion_constraint.cpp index c89f27f73c7a..8663ee9eabc6 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_format/honk_recursion_constraint.cpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_format/honk_recursion_constraint.cpp @@ -7,6 +7,7 @@ #include "honk_recursion_constraint.hpp" #include "barretenberg/common/assert.hpp" #include "barretenberg/constants.hpp" +#include "barretenberg/dsl/acir_format/mock_verifier_inputs.hpp" #include "barretenberg/flavor/flavor.hpp" #include "barretenberg/flavor/ultra_recursive_flavor.hpp" #include "barretenberg/flavor/ultra_rollup_recursive_flavor.hpp" @@ -54,150 +55,37 @@ void create_dummy_vkey_and_proof(typename Flavor::CircuitBuilder& builder, { using Builder = typename Flavor::CircuitBuilder; using NativeFlavor = typename Flavor::NativeFlavor; - - static constexpr size_t IPA_CLAIM_SIZE = stdlib::recursion::honk::RollupIO::IpaClaim::PUBLIC_INPUTS_SIZE; + using IO = std::conditional_t, + stdlib::recursion::honk::RollupIO, + stdlib::recursion::honk::DefaultIO>; // Set vkey->circuit_size correctly based on the proof size BB_ASSERT_EQ(proof_size, NativeFlavor::PROOF_LENGTH_WITHOUT_PUB_INPUTS()); - // a lambda that adds dummy commitments (libra and gemini) - auto set_dummy_commitment = [&](size_t& offset) { - auto comm = curve::BN254::AffineElement::one() * fr::random_element(); - auto frs = field_conversion::convert_to_bn254_frs(comm); - builder.set_variable(proof_fields[offset].witness_index, frs[0]); - builder.set_variable(proof_fields[offset + 1].witness_index, frs[1]); - builder.set_variable(proof_fields[offset + 2].witness_index, frs[2]); - builder.set_variable(proof_fields[offset + 3].witness_index, frs[3]); - offset += 4; - }; - auto set_dummy_evaluation = [&](size_t& offset) { - builder.set_variable(proof_fields[offset].witness_index, fr::random_element()); - offset++; - }; - - // Note: this computation should always result in log_circuit_size = CONST_PROOF_SIZE_LOG_N - auto log_circuit_size = CONST_PROOF_SIZE_LOG_N; - size_t offset = 0; - // First key field is circuit size - builder.set_variable(key_fields[offset++].witness_index, 1 << log_circuit_size); - // Second key field is number of public inputs - builder.set_variable(key_fields[offset++].witness_index, public_inputs_size); - // Third key field is the pub inputs offset + size_t num_inner_public_inputs = public_inputs_size - IO::PUBLIC_INPUTS_SIZE; uint32_t pub_inputs_offset = NativeFlavor::has_zero_row ? 1 : 0; - builder.set_variable(key_fields[offset++].witness_index, pub_inputs_offset); - size_t num_inner_public_inputs = HasIPAAccumulator ? public_inputs_size - bb::RollupIO::PUBLIC_INPUTS_SIZE - : public_inputs_size - bb::DefaultIO::PUBLIC_INPUTS_SIZE; - - for (size_t i = 0; i < Flavor::NUM_PRECOMPUTED_ENTITIES; ++i) { - set_dummy_commitment(offset); - } - offset = 0; // Reset offset for parsing proof fields + // Generate mock honk vk + // Note: log_circuit_size = CONST_PROOF_SIZE_LOG_N + auto honk_vk = create_mock_honk_vk( + 1 << CONST_PROOF_SIZE_LOG_N, pub_inputs_offset, num_inner_public_inputs); - // the inner public inputs - for (size_t i = 0; i < num_inner_public_inputs; i++) { - set_dummy_evaluation(offset); - } + size_t offset = 0; - // Get some values for a valid aggregation object and use them here to avoid divide by 0 or other issues. - std::array::PUBLIC_INPUTS_SIZE> dummy_pairing_points_values = - PairingPoints::construct_dummy(); - for (size_t i = 0; i < PairingPoints::PUBLIC_INPUTS_SIZE; i++) { - builder.set_variable(proof_fields[offset].witness_index, dummy_pairing_points_values[i]); + // Set honk vk in builder + for (auto& proof_element : honk_vk->to_field_elements()) { + builder.set_variable(key_fields[offset].witness_index, proof_element); offset++; } - // IPA claim - // TODO(https://github.com/AztecProtocol/barretenberg/issues/1392): Don't use random elements here. - if constexpr (HasIPAAccumulator) { - for (size_t i = 0; i < IPA_CLAIM_SIZE; i++) { - set_dummy_evaluation(offset); - } - } - - // first NUM_WITNESS_ENTITIES witness commitments - for (size_t i = 0; i < Flavor::NUM_WITNESS_ENTITIES; i++) { - set_dummy_commitment(offset); - } - - if constexpr (Flavor::HasZK) { - // Libra concatenation commitment - set_dummy_commitment(offset); - // libra sum - set_dummy_evaluation(offset); - } - - // now the univariates, which can just be 0s (8*CONST_PROOF_SIZE_LOG_N Frs, where 8 is the maximum relation - // degree) - for (size_t i = 0; i < CONST_PROOF_SIZE_LOG_N * Flavor::BATCHED_RELATION_PARTIAL_LENGTH; i++) { - set_dummy_evaluation(offset); - } - - // now the sumcheck evaluations, which is just 44 0s - for (size_t i = 0; i < Flavor::NUM_ALL_ENTITIES; i++) { - set_dummy_evaluation(offset); - } + // Generate dummy honk proof + bb::HonkProof honk_proof = create_mock_honk_proof(num_inner_public_inputs); - if constexpr (Flavor::HasZK) { - // Libra claimed evaluation - set_dummy_evaluation(offset); - // Libra grand sum commitment - - set_dummy_commitment(offset); - // Libra quotient commitment - set_dummy_commitment(offset); - // Gemini masking commitment - set_dummy_commitment(offset); - // Gemini masking evaluation - set_dummy_evaluation(offset); - } - - // now the gemini fold commitments which are CONST_PROOF_SIZE_LOG_N - 1 - for (size_t i = 1; i < CONST_PROOF_SIZE_LOG_N; i++) { - set_dummy_commitment(offset); - } - - // the gemini fold evaluations which are also CONST_PROOF_SIZE_LOG_N - for (size_t i = 1; i <= CONST_PROOF_SIZE_LOG_N; i++) { - set_dummy_evaluation(offset); - } - - if constexpr (Flavor::HasZK) { - // NUM_SMALL_IPA_EVALUATIONS libra evals - for (size_t i = 0; i < NUM_SMALL_IPA_EVALUATIONS; i++) { - set_dummy_evaluation(offset); - } - } - - // lastly the shplonk batched quotient commitment and kzg quotient commitment - for (size_t i = 0; i < 2; i++) { - set_dummy_commitment(offset); - } - // IPA Proof - if constexpr (HasIPAAccumulator) { - - // Ls and Rs - for (size_t i = 0; i < static_cast(2) * CONST_ECCVM_LOG_N; i++) { - auto comm = curve::Grumpkin::AffineElement::one() * fq::random_element(); - auto frs = field_conversion::convert_to_bn254_frs(comm); - builder.set_variable(proof_fields[offset].witness_index, frs[0]); - builder.set_variable(proof_fields[offset + 1].witness_index, frs[1]); - offset += 2; - } - - // G_zero - auto G_zero = curve::Grumpkin::AffineElement::one() * fq::random_element(); - auto G_zero_frs = field_conversion::convert_to_bn254_frs(G_zero); - builder.set_variable(proof_fields[offset].witness_index, G_zero_frs[0]); - builder.set_variable(proof_fields[offset + 1].witness_index, G_zero_frs[1]); - offset += 2; - - // a_zero - auto a_zero = fq::random_element(); - auto a_zero_frs = field_conversion::convert_to_bn254_frs(a_zero); - builder.set_variable(proof_fields[offset].witness_index, a_zero_frs[0]); - builder.set_variable(proof_fields[offset + 1].witness_index, a_zero_frs[1]); - offset += 2; + offset = 0; + // Set honk proof in builder + for (auto& proof_element : honk_proof) { + builder.set_variable(proof_fields[offset].witness_index, proof_element); + offset++; } BB_ASSERT_EQ(offset, proof_size + public_inputs_size); diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.cpp b/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.cpp index cc9635cfd236..22256a019d6f 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.cpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.cpp @@ -68,14 +68,20 @@ void populate_field_elements(std::vector& fields, * @brief Create a mock oink proof that has the correct structure but is not in general valid * */ -template HonkProof create_mock_oink_proof() +template HonkProof create_mock_oink_proof(const size_t inner_public_inputs_size) { + using FF = Flavor::FF; + HonkProof proof; // Populate mock public inputs - typename Flavor::CircuitBuilder builder; + typename PublicInputs::Builder builder; PublicInputs::add_default(builder); + for (size_t idx = 0; idx < inner_public_inputs_size; idx++) { + proof.emplace_back(FF::random_element()); + } + for (const auto& pub : builder.public_inputs()) { proof.emplace_back(builder.get_variable(pub)); } @@ -151,10 +157,10 @@ template HonkProof create_mock_decider_proof() * @brief Create a mock honk proof that has the correct structure but is not in general valid * */ -template HonkProof create_mock_honk_proof() +template HonkProof create_mock_honk_proof(const size_t inner_public_inputs_size) { // Construct a Honk proof as the concatenation of an Oink proof and a Decider proof - HonkProof oink_proof = create_mock_oink_proof(); + HonkProof oink_proof = create_mock_oink_proof(inner_public_inputs_size); HonkProof decider_proof = create_mock_decider_proof(); HonkProof proof; proof.reserve(oink_proof.size() + decider_proof.size()); @@ -435,12 +441,13 @@ HonkProof create_mock_translator_proof() */ template std::shared_ptr create_mock_honk_vk(const size_t dyadic_size, - const size_t pub_inputs_offset) + const size_t pub_inputs_offset, + const size_t inner_public_inputs_size) { // Set relevant VK metadata and commitments auto honk_verification_key = std::make_shared(); honk_verification_key->log_circuit_size = bb::numeric::get_msb(dyadic_size); - honk_verification_key->num_public_inputs = PublicInputs::PUBLIC_INPUTS_SIZE; + honk_verification_key->num_public_inputs = inner_public_inputs_size + PublicInputs::PUBLIC_INPUTS_SIZE; honk_verification_key->pub_inputs_offset = pub_inputs_offset; // must be set correctly for (auto& commitment : honk_verification_key->get_all()) { @@ -475,39 +482,70 @@ template std::shared_ptr> crea } // Explicitly instantiate template functions -template HonkProof create_mock_oink_proof(); -template HonkProof create_mock_oink_proof(); -template HonkProof create_mock_oink_proof>(); - -template HonkProof create_mock_oink_proof>(); -template HonkProof create_mock_oink_proof>(); -template HonkProof create_mock_oink_proof(); +template HonkProof create_mock_oink_proof(const size_t); +template HonkProof create_mock_oink_proof(const size_t); +template HonkProof create_mock_oink_proof>( + const size_t); + +template HonkProof create_mock_oink_proof>( + const size_t); +template HonkProof create_mock_oink_proof>( + const size_t); +template HonkProof create_mock_oink_proof>( + const size_t); +template HonkProof create_mock_oink_proof>( + const size_t); +template HonkProof create_mock_oink_proof(const size_t); template HonkProof create_mock_decider_proof(); template HonkProof create_mock_decider_proof(); template HonkProof create_mock_decider_proof(); template HonkProof create_mock_decider_proof(); -template HonkProof create_mock_honk_proof(); -template HonkProof create_mock_honk_proof(); -template HonkProof create_mock_honk_proof>(); - -template HonkProof create_mock_honk_proof>(); -template HonkProof create_mock_honk_proof>(); -template HonkProof create_mock_honk_proof(); +template HonkProof create_mock_honk_proof(const size_t); +template HonkProof create_mock_honk_proof(const size_t); +template HonkProof create_mock_honk_proof>( + const size_t); + +template HonkProof create_mock_honk_proof>( + const size_t); +template HonkProof create_mock_honk_proof>( + const size_t); +template HonkProof create_mock_honk_proof>( + const size_t); +template HonkProof create_mock_honk_proof>( + const size_t); +template HonkProof create_mock_honk_proof(const size_t); template HonkProof create_mock_pg_proof(); template HonkProof create_mock_pg_proof(); template HonkProof create_mock_pg_proof>(); template std::shared_ptr create_mock_honk_vk( - const size_t, const size_t); + const size_t, const size_t, const size_t); template std::shared_ptr create_mock_honk_vk( - const size_t, const size_t); + const size_t, const size_t, const size_t); template std::shared_ptr create_mock_honk_vk< MegaFlavor, - stdlib::recursion::honk::HidingKernelIO>(const size_t, const size_t); + stdlib::recursion::honk::HidingKernelIO>(const size_t, const size_t, const size_t); + +template std::shared_ptr create_mock_honk_vk< + UltraFlavor, + stdlib::recursion::honk::DefaultIO>(const size_t, const size_t, const size_t); +template std::shared_ptr create_mock_honk_vk< + UltraZKFlavor, + stdlib::recursion::honk::DefaultIO>(const size_t, const size_t, const size_t); +template std::shared_ptr create_mock_honk_vk< + UltraFlavor, + stdlib::recursion::honk::DefaultIO>(const size_t, const size_t, const size_t); +template std::shared_ptr create_mock_honk_vk< + UltraZKFlavor, + stdlib::recursion::honk::DefaultIO>(const size_t, const size_t, const size_t); +template std::shared_ptr create_mock_honk_vk( + const size_t, const size_t, const size_t); + template std::shared_ptr> create_mock_decider_vk(); } // namespace acir_format diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.hpp b/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.hpp index a3a2d135c22d..1c02cc950ca9 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.hpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.hpp @@ -14,9 +14,11 @@ namespace acir_format { -template bb::HonkProof create_mock_oink_proof(); +template +bb::HonkProof create_mock_oink_proof(const size_t inner_public_inputs_size = 0); template bb::HonkProof create_mock_decider_proof(); -template bb::HonkProof create_mock_honk_proof(); +template +bb::HonkProof create_mock_honk_proof(const size_t inner_public_inputs_size = 0); template bb::HonkProof create_mock_pg_proof(); bb::Goblin::MergeProof create_mock_merge_proof(); bb::HonkProof create_mock_pre_ipa_proof(); @@ -25,7 +27,8 @@ bb::HonkProof create_mock_translator_proof(); template std::shared_ptr create_mock_honk_vk(const size_t dyadic_size, - const size_t pub_inputs_offset); + const size_t pub_inputs_offset, + const size_t inner_public_inputs_size = 0); template std::shared_ptr> create_mock_decider_vk(); } // namespace acir_format diff --git a/barretenberg/cpp/src/barretenberg/stdlib/special_public_inputs/special_public_inputs.hpp b/barretenberg/cpp/src/barretenberg/stdlib/special_public_inputs/special_public_inputs.hpp index 5616092d7055..781ed73631d3 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/special_public_inputs/special_public_inputs.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/special_public_inputs/special_public_inputs.hpp @@ -135,8 +135,9 @@ class KernelIO { * @brief Manages the data that is propagated on the public inputs of an application/function circuit * */ -template class DefaultIO { +template class DefaultIO { public: + using Builder = Builder_; using Curve = stdlib::bn254; // curve is always bn254 using FF = Curve::ScalarField; using PairingInputs = stdlib::recursion::PairingPoints; From 0b7894c422f8ec6f85694a6cee2c62bf13ae78e0 Mon Sep 17 00:00:00 2001 From: federicobarbacovi <171914500+federicobarbacovi@users.noreply.github.com> Date: Thu, 14 Aug 2025 10:53:43 +0000 Subject: [PATCH 09/14] Comments and todo --- .../barretenberg/dsl/acir_format/avm2_recursion_constraint.cpp | 2 ++ .../src/barretenberg/dsl/acir_format/mock_verifier_inputs.cpp | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_format/avm2_recursion_constraint.cpp b/barretenberg/cpp/src/barretenberg/dsl/acir_format/avm2_recursion_constraint.cpp index 907ef89aab3e..0b516c88a205 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_format/avm2_recursion_constraint.cpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_format/avm2_recursion_constraint.cpp @@ -50,6 +50,8 @@ void create_dummy_vkey_and_proof(Builder& builder, const std::vector& key_fields, const std::vector& proof_fields) { + // TODO(https://github.com/AztecProtocol/barretenberg/issues/1514): restructure this function to use functions from + // mock_verifier_inputs using Flavor = avm2::AvmFlavor; // Relevant source for proof layout: AvmFlavor::Transcript::serialize_full_transcript() diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.cpp b/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.cpp index 22256a019d6f..f700ec975fb9 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.cpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.cpp @@ -204,7 +204,7 @@ Goblin::MergeProof create_mock_merge_proof() Goblin::MergeProof proof; proof.reserve(MERGE_PROOF_SIZE); - uint32_t mock_shift_size = 5; + uint32_t mock_shift_size = 5; // Must be smaller than 32, otherwise pow raises an error // Populate mock shift size populate_field_elements(proof, 1, /*value=*/mock_shift_size); From df1d579a401b6f23c4998998a7013312c14b1c97 Mon Sep 17 00:00:00 2001 From: federicobarbacovi <171914500+federicobarbacovi@users.noreply.github.com> Date: Thu, 14 Aug 2025 14:03:59 +0000 Subject: [PATCH 10/14] Address comments --- .../dsl/acir_format/mock_verifier_inputs.cpp | 35 ++++++++++--------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.cpp b/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.cpp index f700ec975fb9..ed9b10c8ee34 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.cpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.cpp @@ -49,24 +49,21 @@ void populate_field_elements_for_mock_commitments(std::vector& fields, const template void populate_field_elements(std::vector& fields, const size_t& num_elements, - std::optional value = std::nullopt) + std::optional value = std::nullopt) { - if (value.has_value()) { - for (size_t i = 0; i < num_elements; ++i) { - fields.emplace_back(fr{ value.value() }); - } - } else { - for (size_t i = 0; i < num_elements; ++i) { - for (auto& val : field_conversion::convert_to_bn254_frs(FF::random_element())) { - fields.emplace_back(val); - } - } + + for (size_t i = 0; i < num_elements; ++i) { + std::vector field_elements = value.has_value() + ? field_conversion::convert_to_bn254_frs(value.value()) + : field_conversion::convert_to_bn254_frs(FF::random_element()); + fields.insert(fields.end(), field_elements.begin(), field_elements.end()); } } /** * @brief Create a mock oink proof that has the correct structure but is not in general valid * + * @param inner_public_inputs_size Number of public inputs coming from the ACIR constraints */ template HonkProof create_mock_oink_proof(const size_t inner_public_inputs_size) { @@ -78,10 +75,10 @@ template HonkProof create_mock_oink_proof( typename PublicInputs::Builder builder; PublicInputs::add_default(builder); - for (size_t idx = 0; idx < inner_public_inputs_size; idx++) { - proof.emplace_back(FF::random_element()); - } + // Populate the proof with as many public inputs as required from the ACIR constraints + populate_field_elements(proof, inner_public_inputs_size); + // Populate the proof with the public inputs added from barretenberg for (const auto& pub : builder.public_inputs()) { proof.emplace_back(builder.get_variable(pub)); } @@ -156,6 +153,7 @@ template HonkProof create_mock_decider_proof() /** * @brief Create a mock honk proof that has the correct structure but is not in general valid * + * @param inner_public_inputs_size Number of public inputs coming from the ACIR constraints */ template HonkProof create_mock_honk_proof(const size_t inner_public_inputs_size) { @@ -184,12 +182,12 @@ template HonkProof create_mock_pg_proof() HonkProof proof = create_mock_oink_proof(); // Populate mock perturbator coefficients - populate_field_elements(proof, CONST_PG_LOG_N, /*value=*/0); + populate_field_elements(proof, CONST_PG_LOG_N, /*value=*/fr::zero()); // Populate mock combiner quotient coefficients size_t NUM_COEFF_COMBINER_QUOTIENT = DeciderProvingKeys_::BATCHED_EXTENDED_LENGTH - DeciderProvingKeys_::NUM; - populate_field_elements(proof, NUM_COEFF_COMBINER_QUOTIENT, /*value=*/0); + populate_field_elements(proof, NUM_COEFF_COMBINER_QUOTIENT, /*value=*/fr::zero()); return proof; } @@ -207,7 +205,7 @@ Goblin::MergeProof create_mock_merge_proof() uint32_t mock_shift_size = 5; // Must be smaller than 32, otherwise pow raises an error // Populate mock shift size - populate_field_elements(proof, 1, /*value=*/mock_shift_size); + populate_field_elements(proof, 1, /*value=*/fr{ mock_shift_size }); // There are 8 entities in the merge protocol (4 columns x 2 components: T_j, g_j(X) = X^{l-1} t_j(X)) // and 8 evaluations (4 columns x 2 components: g_j(kappa), t_j(1/kappa)) @@ -438,6 +436,9 @@ HonkProof create_mock_translator_proof() /** * @brief Create a mock MegaHonk VK that has the correct structure * + * @param dyadic_size Dyadic size of the circuit for which we generate a vk + * @param pub_inputs_offest Indicating whether the circuit has a first zero row + * @param inner_public_inputs_size Number of public inputs coming from the ACIR constraints */ template std::shared_ptr create_mock_honk_vk(const size_t dyadic_size, From a37ef473da7a8d55aa548263295e2757f0c6e7bc Mon Sep 17 00:00:00 2001 From: federicobarbacovi <171914500+federicobarbacovi@users.noreply.github.com> Date: Fri, 15 Aug 2025 10:24:46 +0000 Subject: [PATCH 11/14] Fixes --- .../acir_format/honk_recursion_constraint.cpp | 4 ++-- .../dsl/acir_format/mock_verifier_inputs.cpp | 16 ++++++---------- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_format/honk_recursion_constraint.cpp b/barretenberg/cpp/src/barretenberg/dsl/acir_format/honk_recursion_constraint.cpp index 8663ee9eabc6..0f81c5b92e33 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_format/honk_recursion_constraint.cpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_format/honk_recursion_constraint.cpp @@ -73,8 +73,8 @@ void create_dummy_vkey_and_proof(typename Flavor::CircuitBuilder& builder, size_t offset = 0; // Set honk vk in builder - for (auto& proof_element : honk_vk->to_field_elements()) { - builder.set_variable(key_fields[offset].witness_index, proof_element); + for (auto& vk_element : honk_vk->to_field_elements()) { + builder.set_variable(key_fields[offset].witness_index, vk_element); offset++; } diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.cpp b/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.cpp index ed9b10c8ee34..e739d364deb5 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.cpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.cpp @@ -51,7 +51,6 @@ void populate_field_elements(std::vector& fields, const size_t& num_elements, std::optional value = std::nullopt) { - for (size_t i = 0; i < num_elements; ++i) { std::vector field_elements = value.has_value() ? field_conversion::convert_to_bn254_frs(value.value()) @@ -67,8 +66,6 @@ void populate_field_elements(std::vector& fields, */ template HonkProof create_mock_oink_proof(const size_t inner_public_inputs_size) { - using FF = Flavor::FF; - HonkProof proof; // Populate mock public inputs @@ -76,7 +73,7 @@ template HonkProof create_mock_oink_proof( PublicInputs::add_default(builder); // Populate the proof with as many public inputs as required from the ACIR constraints - populate_field_elements(proof, inner_public_inputs_size); + populate_field_elements(proof, inner_public_inputs_size); // Populate the proof with the public inputs added from barretenberg for (const auto& pub : builder.public_inputs()) { @@ -97,7 +94,7 @@ template HonkProof create_mock_decider_proof() { HonkProof proof; - if (Flavor::HasZK) { + if constexpr (Flavor::HasZK) { // Libra concatenation commitment populate_field_elements_for_mock_commitments(proof, 1); @@ -112,7 +109,7 @@ template HonkProof create_mock_decider_proof() // Sumcheck multilinear evaluations populate_field_elements(proof, Flavor::NUM_ALL_ENTITIES); - if (Flavor::HasZK) { + if constexpr (Flavor::HasZK) { // Libra claimed evaluation populate_field_elements(proof, 1); @@ -137,7 +134,7 @@ template HonkProof create_mock_decider_proof() const size_t NUM_GEMINI_FOLD_EVALUATIONS = CONST_PROOF_SIZE_LOG_N; populate_field_elements(proof, NUM_GEMINI_FOLD_EVALUATIONS); - if (Flavor::HasZK) { + if constexpr (Flavor::HasZK) { // NUM_SMALL_IPA_EVALUATIONS libra evals populate_field_elements(proof, NUM_SMALL_IPA_EVALUATIONS); } @@ -165,7 +162,7 @@ template HonkProof create_mock_honk_proof( proof.insert(proof.end(), oink_proof.begin(), oink_proof.end()); proof.insert(proof.end(), decider_proof.begin(), decider_proof.end()); - if (HasIPAAccumulator) { + if constexpr (HasIPAAccumulator) { HonkProof ipa_proof = create_mock_ipa_proof(); proof.insert(proof.end(), ipa_proof.begin(), ipa_proof.end()); } @@ -349,8 +346,7 @@ HonkProof create_mock_ipa_proof() populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/1); // a_0 evaluation (a_0 is in the base field of BN254) - proof.emplace_back(fr::random_element()); - proof.emplace_back(fr::random_element()); + populate_field_elements(proof, 1); BB_ASSERT_EQ(proof.size(), IPA_PROOF_LENGTH); From a9a918e2f89d1b0b486b630fc817b9a0cdeef4a2 Mon Sep 17 00:00:00 2001 From: federicobarbacovi <171914500+federicobarbacovi@users.noreply.github.com> Date: Fri, 15 Aug 2025 11:36:00 +0000 Subject: [PATCH 12/14] Fix pre-ipa mocking --- .../dsl/acir_format/mock_verifier_inputs.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.cpp b/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.cpp index e739d364deb5..d2f4cecf5874 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.cpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.cpp @@ -245,11 +245,11 @@ HonkProof create_mock_pre_ipa_proof() // 3. Libra sum populate_field_elements(proof, 1); - // 4. Sumcheck univariates commitments - populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/CONST_ECCVM_LOG_N); - - // 5. Sumcheck univariate evaluations - populate_field_elements(proof, CONST_ECCVM_LOG_N + CONST_ECCVM_LOG_N); + // 4. Sumcheck univariates commitments + 5. Sumcheck univariate evaluations + for (size_t idx = 0; idx < CONST_ECCVM_LOG_N; idx++) { + populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/1); + populate_field_elements(proof, /*num_elements=*/2); + } // 6. ALL_ENTITIES sumcheck evaluations populate_field_elements(proof, ECCVMFlavor::NUM_ALL_ENTITIES); From 0fcc94f90a5c26fcf1e93456647829564e2cc6bf Mon Sep 17 00:00:00 2001 From: federicobarbacovi <171914500+federicobarbacovi@users.noreply.github.com> Date: Fri, 15 Aug 2025 14:42:07 +0000 Subject: [PATCH 13/14] Address comments --- .../dsl/acir_format/mock_verifier_inputs.cpp | 77 ++++--------------- .../dsl/acir_format/mock_verifier_inputs.hpp | 3 +- 2 files changed, 19 insertions(+), 61 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.cpp b/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.cpp index d2f4cecf5874..6e1467e76a9d 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.cpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.cpp @@ -90,7 +90,7 @@ template HonkProof create_mock_oink_proof( * @brief Create a mock decider proof that has the correct structure but is not in general valid * */ -template HonkProof create_mock_decider_proof() +template HonkProof create_mock_decider_proof(const size_t const_proof_log_n) { HonkProof proof; @@ -103,7 +103,7 @@ template HonkProof create_mock_decider_proof() } // Sumcheck univariates - const size_t TOTAL_SIZE_SUMCHECK_UNIVARIATES = CONST_PROOF_SIZE_LOG_N * Flavor::BATCHED_RELATION_PARTIAL_LENGTH; + const size_t TOTAL_SIZE_SUMCHECK_UNIVARIATES = const_proof_log_n * Flavor::BATCHED_RELATION_PARTIAL_LENGTH; populate_field_elements(proof, TOTAL_SIZE_SUMCHECK_UNIVARIATES); // Sumcheck multilinear evaluations @@ -127,11 +127,11 @@ template HonkProof create_mock_decider_proof() } // Gemini fold commitments - const size_t NUM_GEMINI_FOLD_COMMITMENTS = CONST_PROOF_SIZE_LOG_N - 1; + const size_t NUM_GEMINI_FOLD_COMMITMENTS = const_proof_log_n - 1; populate_field_elements_for_mock_commitments(proof, NUM_GEMINI_FOLD_COMMITMENTS); // Gemini fold evaluations - const size_t NUM_GEMINI_FOLD_EVALUATIONS = CONST_PROOF_SIZE_LOG_N; + const size_t NUM_GEMINI_FOLD_EVALUATIONS = const_proof_log_n; populate_field_elements(proof, NUM_GEMINI_FOLD_EVALUATIONS); if constexpr (Flavor::HasZK) { @@ -229,6 +229,8 @@ Goblin::MergeProof create_mock_merge_proof() /** * @brief Create a mock pre-ipa proof which has the correct structure but is not necessarily valid * + * @details An ECCVM proof is made of a pre-ipa proof and an ipa-proof. Here we mock the pre-ipa part. + * * @return HonkProof */ HonkProof create_mock_pre_ipa_proof() @@ -332,6 +334,8 @@ HonkProof create_mock_pre_ipa_proof() /** * @brief Create a mock ipa proof which has the correct structure but is not necessarily valid * + * @details An ECCVM proof is made of a pre-ipa proof and an ipa-proof. Here we mock the ipa part. + * * @return HonkProof */ HonkProof create_mock_ipa_proof() @@ -360,69 +364,21 @@ HonkProof create_mock_ipa_proof() */ HonkProof create_mock_translator_proof() { - using FF = TranslatorFlavor::FF; using BF = TranslatorFlavor::BF; using Curve = TranslatorFlavor::Curve; HonkProof proof; + HonkProof decider_proof = create_mock_decider_proof(TranslatorFlavor::CONST_TRANSLATOR_LOG_N); // 1. Accumulated result populate_field_elements(proof, 1); - // 1. NUM_WITNESS_ENTITIES commitments + // 2. NUM_WITNESS_ENTITIES commitments populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/TranslatorFlavor::NUM_WITNESS_ENTITIES - 4); - // 2. Libra concatenation commitment - populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/1); - - // 3. Libra sum - populate_field_elements(proof, 1); - - // 4. sumcheck univariates - populate_field_elements( - proof, TranslatorFlavor::CONST_TRANSLATOR_LOG_N * TranslatorFlavor::BATCHED_RELATION_PARTIAL_LENGTH); - - // 5. NUM_ALL_ENTITIES sumcheck evaluations - populate_field_elements(proof, TranslatorFlavor::NUM_ALL_ENTITIES); - - // 6. Libra claimed evaluation - populate_field_elements(proof, 1); - - // 7. Libra grand sum commitment - populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/1); - - // 8. Libra quotient commitment - populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/1); - - // 9. Gemini masking commitment - populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/1); - - // 10. Gemini masking evaluation - populate_field_elements(proof, 1); - - // 11. CONST_TRANSLATOR_LOG_N - 1 Gemini fold commitments - populate_field_elements_for_mock_commitments(proof, - /*num_commitments=*/TranslatorFlavor::CONST_TRANSLATOR_LOG_N - - 1); - - // 12. CONST_TRANSLATOR_LOG_N Gemini evaluations - populate_field_elements(proof, TranslatorFlavor::CONST_TRANSLATOR_LOG_N); - - // 13. Gemini P pos evaluation - populate_field_elements(proof, 1); - - // 14. Gemini P neg evaluation - populate_field_elements(proof, 1); - - // 15. NUM_SMALL_IPA_EVALUATIONS libra evals - populate_field_elements(proof, NUM_SMALL_IPA_EVALUATIONS); - - // 16. Shplonk - populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/1); - - // 17. KZG - populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/1); + // Insert decider proof + proof.insert(proof.end(), decider_proof.begin(), decider_proof.end()); BB_ASSERT_EQ(proof.size(), TranslatorFlavor::PROOF_LENGTH_WITHOUT_PUB_INPUTS); @@ -494,10 +450,11 @@ template HonkProof create_mock_oink_proof(const size_t); -template HonkProof create_mock_decider_proof(); -template HonkProof create_mock_decider_proof(); -template HonkProof create_mock_decider_proof(); -template HonkProof create_mock_decider_proof(); +template HonkProof create_mock_decider_proof(const size_t); +template HonkProof create_mock_decider_proof(const size_t); +template HonkProof create_mock_decider_proof(const size_t); +template HonkProof create_mock_decider_proof(const size_t); +template HonkProof create_mock_decider_proof(const size_t); template HonkProof create_mock_honk_proof(const size_t); template HonkProof create_mock_honk_proof(const size_t); diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.hpp b/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.hpp index 1c02cc950ca9..61f9c77df380 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.hpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.hpp @@ -16,7 +16,8 @@ namespace acir_format { template bb::HonkProof create_mock_oink_proof(const size_t inner_public_inputs_size = 0); -template bb::HonkProof create_mock_decider_proof(); +template +bb::HonkProof create_mock_decider_proof(const size_t const_proof_log_n = bb::CONST_PROOF_SIZE_LOG_N); template bb::HonkProof create_mock_honk_proof(const size_t inner_public_inputs_size = 0); template bb::HonkProof create_mock_pg_proof(); From 33b2552ebd7af4c958b46c0f3ccf8c1a3c6c7fb6 Mon Sep 17 00:00:00 2001 From: federicobarbacovi <171914500+federicobarbacovi@users.noreply.github.com> Date: Fri, 15 Aug 2025 14:57:56 +0000 Subject: [PATCH 14/14] Fix --- .../dsl/acir_format/mock_verifier_inputs.cpp | 38 ++++++++++++------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.cpp b/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.cpp index 6e1467e76a9d..088ba275b40c 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.cpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_format/mock_verifier_inputs.cpp @@ -92,57 +92,67 @@ template HonkProof create_mock_oink_proof( */ template HonkProof create_mock_decider_proof(const size_t const_proof_log_n) { + using FF = Flavor::FF; + using Curve = Flavor::Curve; HonkProof proof; if constexpr (Flavor::HasZK) { // Libra concatenation commitment - populate_field_elements_for_mock_commitments(proof, 1); + populate_field_elements_for_mock_commitments(proof, 1); // Libra sum - populate_field_elements(proof, 1); + populate_field_elements(proof, 1); } // Sumcheck univariates const size_t TOTAL_SIZE_SUMCHECK_UNIVARIATES = const_proof_log_n * Flavor::BATCHED_RELATION_PARTIAL_LENGTH; - populate_field_elements(proof, TOTAL_SIZE_SUMCHECK_UNIVARIATES); + populate_field_elements(proof, TOTAL_SIZE_SUMCHECK_UNIVARIATES); // Sumcheck multilinear evaluations - populate_field_elements(proof, Flavor::NUM_ALL_ENTITIES); + populate_field_elements(proof, Flavor::NUM_ALL_ENTITIES); if constexpr (Flavor::HasZK) { // Libra claimed evaluation - populate_field_elements(proof, 1); + populate_field_elements(proof, 1); // Libra grand sum commitment - populate_field_elements_for_mock_commitments(proof, 1); + populate_field_elements_for_mock_commitments(proof, 1); // Libra quotient commitment - populate_field_elements_for_mock_commitments(proof, 1); + populate_field_elements_for_mock_commitments(proof, 1); // Gemini masking commitment - populate_field_elements_for_mock_commitments(proof, 1); + populate_field_elements_for_mock_commitments(proof, 1); // Gemini masking evaluation - populate_field_elements(proof, 1); + populate_field_elements(proof, 1); } // Gemini fold commitments const size_t NUM_GEMINI_FOLD_COMMITMENTS = const_proof_log_n - 1; - populate_field_elements_for_mock_commitments(proof, NUM_GEMINI_FOLD_COMMITMENTS); + populate_field_elements_for_mock_commitments(proof, NUM_GEMINI_FOLD_COMMITMENTS); // Gemini fold evaluations const size_t NUM_GEMINI_FOLD_EVALUATIONS = const_proof_log_n; - populate_field_elements(proof, NUM_GEMINI_FOLD_EVALUATIONS); + populate_field_elements(proof, NUM_GEMINI_FOLD_EVALUATIONS); + + if constexpr (std::is_same_v) { + // Gemini P pos evaluation + populate_field_elements(proof, 1); + + // Gemini P neg evaluation + populate_field_elements(proof, 1); + } if constexpr (Flavor::HasZK) { // NUM_SMALL_IPA_EVALUATIONS libra evals - populate_field_elements(proof, NUM_SMALL_IPA_EVALUATIONS); + populate_field_elements(proof, NUM_SMALL_IPA_EVALUATIONS); } // Shplonk batched quotient commitment - populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/1); + populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/1); // KZG quotient commitment - populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/1); + populate_field_elements_for_mock_commitments(proof, /*num_commitments=*/1); return proof; }