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 1f2fc25673ff..1edd3c3ce234 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 @@ -97,9 +97,12 @@ void create_dummy_vkey_and_proof(typename Flavor::CircuitBuilder& builder, builder.assert_equal(builder.add_variable(fr::random_element()), proof_fields[offset].witness_index); offset++; } + // TODO(https://github.com/AztecProtocol/barretenberg/issues/1352): Using SMALL_DUMMY_VALUE might resolve this + // issue. + fr SMALL_DUMMY_VALUE(2); // arbtirary small value that shouldn't cause builder problems. // The aggregation object for (size_t i = 0; i < AggregationObject::PUBLIC_INPUTS_SIZE; i++) { - builder.assert_equal(builder.add_variable(fr::random_element()), proof_fields[offset].witness_index); + builder.assert_equal(builder.add_variable(SMALL_DUMMY_VALUE), proof_fields[offset].witness_index); offset++; } diff --git a/barretenberg/cpp/src/barretenberg/dsl/acir_format/honk_recursion_constraint.test.cpp b/barretenberg/cpp/src/barretenberg/dsl/acir_format/honk_recursion_constraint.test.cpp index 20d4c4b399f4..67217d9b5f79 100644 --- a/barretenberg/cpp/src/barretenberg/dsl/acir_format/honk_recursion_constraint.test.cpp +++ b/barretenberg/cpp/src/barretenberg/dsl/acir_format/honk_recursion_constraint.test.cpp @@ -155,7 +155,8 @@ template class AcirHonkRecursionConstraint : public : * @param inner_circuits * @return Composer */ - template BuilderType create_outer_circuit(std::vector& inner_circuits) + template + BuilderType create_outer_circuit(std::vector& inner_circuits, bool dummy_witnesses = false) { std::vector honk_recursion_constraints; @@ -208,6 +209,9 @@ template class AcirHonkRecursionConstraint : public : honk_recursion = 2; } ProgramMetadata metadata{ .honk_recursion = honk_recursion }; + if (dummy_witnesses) { + witness = {}; // set it all to 0 + } AcirProgram program{ constraint_system, witness }; BuilderType outer_circuit = create_circuit(program, metadata); @@ -228,6 +232,30 @@ using Flavors = testing::Types, TYPED_TEST_SUITE(AcirHonkRecursionConstraint, Flavors); +TYPED_TEST(AcirHonkRecursionConstraint, TestHonkRecursionConstraintVKGeneration) +{ + std::vector layer_1_circuits; + layer_1_circuits.push_back(TestFixture::create_inner_circuit()); + + auto layer_2_circuit = + TestFixture::template create_outer_circuit(layer_1_circuits); + + auto layer_2_circuit_with_dummy_witnesses = + TestFixture::template create_outer_circuit(layer_1_circuits, + /*dummy_witnesses=*/true); + + auto proving_key = std::make_shared(layer_2_circuit); + auto verification_key = std::make_shared(proving_key->proving_key); + + auto proving_key_dummy = + std::make_shared(layer_2_circuit_with_dummy_witnesses); + auto verification_key_dummy = + std::make_shared(proving_key_dummy->proving_key); + + // Compare the two vks + EXPECT_EQ(*verification_key_dummy, *verification_key); +} + TYPED_TEST(AcirHonkRecursionConstraint, TestBasicSingleHonkRecursionConstraint) { std::vector layer_1_circuits; @@ -243,7 +271,7 @@ TYPED_TEST(AcirHonkRecursionConstraint, TestBasicSingleHonkRecursionConstraint) info("prover gates = ", proving_key->proving_key.circuit_size); auto proof = prover.construct_proof(); auto verification_key = std::make_shared(proving_key->proving_key); - info(HasIPAAccumulator); + if constexpr (HasIPAAccumulator) { auto ipa_verification_key = std::make_shared>(1 << CONST_ECCVM_LOG_N); typename TestFixture::OuterVerifier verifier(verification_key, ipa_verification_key); 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 9c569a24d4fd..86ef41dad9f6 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 @@ -128,6 +128,7 @@ UltraRecursiveVerifier_::Output UltraRecursiveVerifier_::verify_ auto pairing_points = PCS::reduce_verify_batch_opening_claim(opening_claim, transcript); + // TODO(https://github.com/AztecProtocol/barretenberg/issues/1352): Investigate if normalize() calls are needed. pairing_points[0] = pairing_points[0].normalize(); pairing_points[1] = pairing_points[1].normalize(); // TODO(https://github.com/AztecProtocol/barretenberg/issues/995): generate recursion separator challenge properly.