diff --git a/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra_recursive.hpp b/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra_recursive.hpp index f3ce7853066..5e1eba1e1de 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra_recursive.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra_recursive.hpp @@ -54,6 +54,7 @@ template class GoblinUltraRecursive_ { using Commitment = typename Curve::Element; using CommitmentHandle = typename Curve::Element; using FF = typename Curve::ScalarField; + using NativeVerificationKey = flavor::GoblinUltra::VerificationKey; // Note(luke): Eventually this may not be needed at all using VerifierCommitmentKey = pcs::VerifierCommitmentKey; @@ -324,7 +325,7 @@ template class GoblinUltraRecursive_ { * @param builder * @param native_key Native verification key from which to extract the precomputed commitments */ - VerificationKey(CircuitBuilder* builder, auto native_key) + VerificationKey(CircuitBuilder* builder, std::shared_ptr native_key) : VerificationKey_>(native_key->circuit_size, native_key->num_public_inputs) { this->q_m = Commitment::from_witness(builder, native_key->q_m); diff --git a/barretenberg/cpp/src/barretenberg/flavor/ultra_recursive.hpp b/barretenberg/cpp/src/barretenberg/flavor/ultra_recursive.hpp index c89a2254d3d..dde5c725274 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/ultra_recursive.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/ultra_recursive.hpp @@ -54,6 +54,7 @@ template class UltraRecursive_ { using Commitment = typename Curve::Element; using CommitmentHandle = typename Curve::Element; using FF = typename Curve::ScalarField; + using NativeVerificationKey = flavor::Ultra::VerificationKey; // Note(luke): Eventually this may not be needed at all using VerifierCommitmentKey = pcs::VerifierCommitmentKey; @@ -256,7 +257,7 @@ template class UltraRecursive_ { * @param builder * @param native_key Native verification key from which to extract the precomputed commitments */ - VerificationKey(CircuitBuilder* builder, auto native_key) + VerificationKey(CircuitBuilder* builder, std::shared_ptr native_key) : VerificationKey_>(native_key->circuit_size, native_key->num_public_inputs) { this->q_m = Commitment::from_witness(builder, native_key->q_m); diff --git a/barretenberg/cpp/src/barretenberg/stdlib/recursion/honk/verifier/goblin_verifier.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/recursion/honk/verifier/goblin_verifier.test.cpp index 1ef90f6f1dc..0186451d0ab 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/recursion/honk/verifier/goblin_verifier.test.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/recursion/honk/verifier/goblin_verifier.test.cpp @@ -146,6 +146,7 @@ template class GoblinRecursiveVerifierTest : public testi { // Create an arbitrary inner circuit auto inner_circuit = create_inner_circuit(); + OuterBuilder outer_circuit; // Compute native verification key InnerComposer inner_composer; @@ -153,19 +154,18 @@ template class GoblinRecursiveVerifierTest : public testi auto prover = inner_composer.create_prover(instance); // A prerequisite for computing VK const auto native_verification_key = instance->compute_verification_key(); - // Instantiate the recursive verification key from the native verification key - OuterBuilder outer_circuit; - auto verification_key = std::make_shared(&outer_circuit, native_verification_key); + // Instantiate the recursive verifier using the native verification key + RecursiveVerifier verifier{ &outer_circuit, native_verification_key }; // Spot check some values in the recursive VK to ensure it was constructed correctly - EXPECT_EQ(verification_key->circuit_size, native_verification_key->circuit_size); - EXPECT_EQ(verification_key->log_circuit_size, native_verification_key->log_circuit_size); - EXPECT_EQ(verification_key->num_public_inputs, native_verification_key->num_public_inputs); - EXPECT_EQ(verification_key->q_m.get_value(), native_verification_key->q_m); - EXPECT_EQ(verification_key->q_r.get_value(), native_verification_key->q_r); - EXPECT_EQ(verification_key->sigma_1.get_value(), native_verification_key->sigma_1); - EXPECT_EQ(verification_key->id_3.get_value(), native_verification_key->id_3); - EXPECT_EQ(verification_key->lagrange_ecc_op.get_value(), native_verification_key->lagrange_ecc_op); + EXPECT_EQ(verifier.key->circuit_size, native_verification_key->circuit_size); + EXPECT_EQ(verifier.key->log_circuit_size, native_verification_key->log_circuit_size); + EXPECT_EQ(verifier.key->num_public_inputs, native_verification_key->num_public_inputs); + EXPECT_EQ(verifier.key->q_m.get_value(), native_verification_key->q_m); + EXPECT_EQ(verifier.key->q_r.get_value(), native_verification_key->q_r); + EXPECT_EQ(verifier.key->sigma_1.get_value(), native_verification_key->sigma_1); + EXPECT_EQ(verifier.key->id_3.get_value(), native_verification_key->id_3); + EXPECT_EQ(verifier.key->lagrange_ecc_op.get_value(), native_verification_key->lagrange_ecc_op); } /** @@ -186,8 +186,7 @@ template class GoblinRecursiveVerifierTest : public testi // Create a recursive verification circuit for the proof of the inner circuit OuterBuilder outer_circuit; - auto verification_key = std::make_shared(&outer_circuit, native_verification_key); - RecursiveVerifier verifier(&outer_circuit, verification_key); + RecursiveVerifier verifier{ &outer_circuit, native_verification_key }; auto pairing_points = verifier.verify_proof(inner_proof); // Check for a failure flag in the recursive verifier circuit @@ -248,8 +247,7 @@ template class GoblinRecursiveVerifierTest : public testi // Create a recursive verification circuit for the proof of the inner circuit OuterBuilder outer_circuit; - auto verification_key = std::make_shared(&outer_circuit, native_verification_key); - RecursiveVerifier verifier(&outer_circuit, verification_key); + RecursiveVerifier verifier{ &outer_circuit, native_verification_key }; verifier.verify_proof(inner_proof); // We expect the circuit check to fail due to the bad proof diff --git a/barretenberg/cpp/src/barretenberg/stdlib/recursion/honk/verifier/ultra_recursive_verifier.cpp b/barretenberg/cpp/src/barretenberg/stdlib/recursion/honk/verifier/ultra_recursive_verifier.cpp index 6a79ecfe890..573d63d077d 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/recursion/honk/verifier/ultra_recursive_verifier.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/recursion/honk/verifier/ultra_recursive_verifier.cpp @@ -9,8 +9,8 @@ namespace proof_system::plonk::stdlib::recursion::honk { template UltraRecursiveVerifier_::UltraRecursiveVerifier_(Builder* builder, - std::shared_ptr verifier_key) - : key(verifier_key) + std::shared_ptr native_verifier_key) + : key(std::make_shared(builder, native_verifier_key)) , builder(builder) {} diff --git a/barretenberg/cpp/src/barretenberg/stdlib/recursion/honk/verifier/ultra_recursive_verifier.hpp b/barretenberg/cpp/src/barretenberg/stdlib/recursion/honk/verifier/ultra_recursive_verifier.hpp index 0e61739e771..6a1a35abbef 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/recursion/honk/verifier/ultra_recursive_verifier.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/recursion/honk/verifier/ultra_recursive_verifier.hpp @@ -14,11 +14,12 @@ template class UltraRecursiveVerifier_ { using Commitment = typename Flavor::Commitment; using GroupElement = typename Flavor::GroupElement; using VerificationKey = typename Flavor::VerificationKey; + using NativeVerificationKey = typename Flavor::NativeVerificationKey; using VerifierCommitmentKey = typename Flavor::VerifierCommitmentKey; using Builder = typename Flavor::CircuitBuilder; using PairingPoints = std::array; - explicit UltraRecursiveVerifier_(Builder* builder, std::shared_ptr verifier_key = nullptr); + explicit UltraRecursiveVerifier_(Builder* builder, std::shared_ptr native_verifier_key); UltraRecursiveVerifier_(UltraRecursiveVerifier_&& other) = delete; UltraRecursiveVerifier_(const UltraRecursiveVerifier_& other) = delete; UltraRecursiveVerifier_& operator=(const UltraRecursiveVerifier_& other) = delete; diff --git a/barretenberg/cpp/src/barretenberg/stdlib/recursion/honk/verifier/verifier.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/recursion/honk/verifier/verifier.test.cpp index 1f01e472725..22b1ef279dc 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/recursion/honk/verifier/verifier.test.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/recursion/honk/verifier/verifier.test.cpp @@ -138,17 +138,17 @@ template class RecursiveVerifierTest : public testing::Te auto prover = inner_composer.create_prover(instance); // A prerequisite for computing VK const auto native_verification_key = instance->compute_verification_key(); - // Instantiate the recursive verification key from the native verification key - auto verification_key = std::make_shared(&outer_circuit, native_verification_key); + // Instantiate the recursive verifier using the native verification key + RecursiveVerifier verifier{ &outer_circuit, native_verification_key }; // Spot check some values in the recursive VK to ensure it was constructed correctly - EXPECT_EQ(verification_key->circuit_size, native_verification_key->circuit_size); - EXPECT_EQ(verification_key->log_circuit_size, native_verification_key->log_circuit_size); - EXPECT_EQ(verification_key->num_public_inputs, native_verification_key->num_public_inputs); - EXPECT_EQ(verification_key->q_m.get_value(), native_verification_key->q_m); - EXPECT_EQ(verification_key->q_r.get_value(), native_verification_key->q_r); - EXPECT_EQ(verification_key->sigma_1.get_value(), native_verification_key->sigma_1); - EXPECT_EQ(verification_key->id_3.get_value(), native_verification_key->id_3); + EXPECT_EQ(verifier.key->circuit_size, native_verification_key->circuit_size); + EXPECT_EQ(verifier.key->log_circuit_size, native_verification_key->log_circuit_size); + EXPECT_EQ(verifier.key->num_public_inputs, native_verification_key->num_public_inputs); + EXPECT_EQ(verifier.key->q_m.get_value(), native_verification_key->q_m); + EXPECT_EQ(verifier.key->q_r.get_value(), native_verification_key->q_r); + EXPECT_EQ(verifier.key->sigma_1.get_value(), native_verification_key->sigma_1); + EXPECT_EQ(verifier.key->id_3.get_value(), native_verification_key->id_3); } /** @@ -170,8 +170,7 @@ template class RecursiveVerifierTest : public testing::Te // Create a recursive verification circuit for the proof of the inner circuit OuterBuilder outer_circuit; - auto verification_key = std::make_shared(&outer_circuit, native_verification_key); - RecursiveVerifier verifier(&outer_circuit, verification_key); + RecursiveVerifier verifier{ &outer_circuit, native_verification_key }; auto pairing_points = verifier.verify_proof(inner_proof); // Check for a failure flag in the recursive verifier circuit @@ -233,8 +232,7 @@ template class RecursiveVerifierTest : public testing::Te // Create a recursive verification circuit for the proof of the inner circuit OuterBuilder outer_circuit; - auto verification_key = std::make_shared(&outer_circuit, native_verification_key); - RecursiveVerifier verifier(&outer_circuit, verification_key); + RecursiveVerifier verifier{ &outer_circuit, native_verification_key }; verifier.verify_proof(inner_proof); // We expect the circuit check to fail due to the bad proof