From 02924af9bec4369278a1bf63018f0dffedf195aa Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Tue, 28 May 2024 17:46:46 +0000 Subject: [PATCH 1/8] shell of the basic infra in place --- .../cpp/src/barretenberg/goblin/goblin.hpp | 1 + .../stdlib/honk_recursion/CMakeLists.txt | 1 + .../client_ivc_recursive_verifier.cpp | 11 ++++ .../client_ivc_recursive_verifier.hpp | 9 ++++ .../client_ivc_recursive_verifier.test.cpp | 50 +++++++++++++++++++ 5 files changed, 72 insertions(+) create mode 100644 barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.cpp create mode 100644 barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.hpp create mode 100644 barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.test.cpp diff --git a/barretenberg/cpp/src/barretenberg/goblin/goblin.hpp b/barretenberg/cpp/src/barretenberg/goblin/goblin.hpp index 95f0ca86435a..766d9f9922ff 100644 --- a/barretenberg/cpp/src/barretenberg/goblin/goblin.hpp +++ b/barretenberg/cpp/src/barretenberg/goblin/goblin.hpp @@ -203,6 +203,7 @@ class Goblin { * @return true * @return false */ + // WORKTODO: make this static-able by passing in an ECCVM verification key instead of constructing one from the pkey bool verify(const Proof& proof) { MergeVerifier merge_verifier; diff --git a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/CMakeLists.txt b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/CMakeLists.txt index 926522ed0559..53416eef593f 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/CMakeLists.txt +++ b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/CMakeLists.txt @@ -6,4 +6,5 @@ barretenberg_module( ultra_honk stdlib_poseidon2 protogalaxy + client_ivc ) \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.cpp b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.cpp new file mode 100644 index 000000000000..77930a60bd98 --- /dev/null +++ b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.cpp @@ -0,0 +1,11 @@ +#include "client_ivc_recursive_verifier.hpp" + +namespace bb::stdlib::recursion::honk { + +void ClientIvcRecursiveVerifier_::verify(const ClientIVC::Proof& proof) +{ + // Verify some stuff + (void)proof; +} + +} // namespace bb::stdlib::recursion::honk \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.hpp b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.hpp new file mode 100644 index 000000000000..f094f36a092e --- /dev/null +++ b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.hpp @@ -0,0 +1,9 @@ +#pragma once +#include "barretenberg/client_ivc/client_ivc.hpp" + +namespace bb::stdlib::recursion::honk { +class ClientIvcRecursiveVerifier_ { + public: + void verify(const ClientIVC::Proof& proof); +}; +} // namespace bb::stdlib::recursion::honk \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.test.cpp new file mode 100644 index 000000000000..7403fe9a8fc4 --- /dev/null +++ b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.test.cpp @@ -0,0 +1,50 @@ +#include "barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.hpp" +#include "barretenberg/client_ivc/client_ivc.hpp" +#include "barretenberg/common/test.hpp" + +namespace bb::stdlib::recursion::honk { +class ClientIvcRecursionTests : public testing::Test { + public: + static void SetUpTestSuite() + { + bb::srs::init_crs_factory("../srs_db/ignition"); + srs::init_grumpkin_crs_factory("../srs_db/grumpkin"); + } + + // WORKTODO: if this is really needed then move it to client_ivc or something + struct ClientIvcProverOutput { + using Flavor = MegaFlavor; + using VerifierInstance = VerifierInstance_; + ClientIVC::Proof proof; + std::vector> verifier_instances; + }; + + static ClientIvcProverOutput construct_mock_client_ivc_output(ClientIVC& ivc) + { + using Builder = MegaCircuitBuilder; + using Flavor = MegaFlavor; + using VerifierInstance = VerifierInstance_; + + size_t NUM_CIRCUITS = 3; + for (size_t idx = 0; idx < NUM_CIRCUITS; ++idx) { + Builder circuit{ ivc.goblin.op_queue }; + GoblinMockCircuits::construct_mock_function_circuit(circuit); + ivc.accumulate(circuit); + } + + auto verifier_inst = std::make_shared(ivc.instance_vk); + + return { ivc.prove(), { ivc.verifier_accumulator, verifier_inst } }; + } +}; + +TEST_F(ClientIvcRecursionTests, NativeVerification) +{ + ClientIVC ivc; + auto [proof, verifier_instances] = construct_mock_client_ivc_output(ivc); + + bool result = ivc.verify(proof, verifier_instances); + EXPECT_TRUE(result); +} + +} // namespace bb::stdlib::recursion::honk \ No newline at end of file From 45f428dfa66139fa15d055800d8feaf4a684974b Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Wed, 29 May 2024 02:07:57 +0000 Subject: [PATCH 2/8] veifier has decider but fails --- .../client_ivc_recursive_verifier.cpp | 7 ++- .../client_ivc_recursive_verifier.hpp | 26 +++++++++- .../client_ivc_recursive_verifier.test.cpp | 48 ++++++++++++++++--- 3 files changed, 73 insertions(+), 8 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.cpp b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.cpp index 77930a60bd98..13c2badc51af 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.cpp @@ -2,10 +2,15 @@ namespace bb::stdlib::recursion::honk { -void ClientIvcRecursiveVerifier_::verify(const ClientIVC::Proof& proof) +void ClientIvcRecursiveVerifier_::verify(const ClientIVC::Proof& proof, const VerifierData& data) { // Verify some stuff + (void)data; (void)proof; + (void)builder; + + DeciderVerifier decider{ builder, data.verifier_accumulator_instance }; + decider.verify_proof(proof.decider_proof); } } // namespace bb::stdlib::recursion::honk \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.hpp b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.hpp index f094f36a092e..ab02144da0dc 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.hpp @@ -1,9 +1,33 @@ #pragma once #include "barretenberg/client_ivc/client_ivc.hpp" +#include "barretenberg/stdlib/honk_recursion/verifier/decider_recursive_verifier.hpp" namespace bb::stdlib::recursion::honk { class ClientIvcRecursiveVerifier_ { + using Builder = UltraCircuitBuilder; // The circuit will be an Ultra circuit + using RecursiveFlavor = MegaRecursiveFlavor_; // The verifier algorithms are Mega + using RecursiveVerifierInstances = RecursiveVerifierInstances_; + + using DeciderVerifier = DeciderRecursiveVerifier_; + using FoldingVerifier = ProtoGalaxyRecursiveVerifier_; + + Builder* builder; + public: - void verify(const ClientIVC::Proof& proof); + struct VerifierData { + + using NativeFlavor = MegaFlavor; + using NativeInstance = bb::VerifierInstance_; + using NativeVerificationKey = NativeFlavor::VerificationKey; + + std::shared_ptr verifier_accumulator_instance; + std::shared_ptr honk_verification_key; + // std::vector> honk_verification_keys; + }; + + ClientIvcRecursiveVerifier_(Builder* builder) + : builder(builder){}; + + void verify(const ClientIVC::Proof&, const VerifierData&); }; } // namespace bb::stdlib::recursion::honk \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.test.cpp index 7403fe9a8fc4..bffe32621630 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.test.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.test.cpp @@ -1,4 +1,5 @@ #include "barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.hpp" +#include "barretenberg/circuit_checker/circuit_checker.hpp" #include "barretenberg/client_ivc/client_ivc.hpp" #include "barretenberg/common/test.hpp" @@ -15,15 +16,17 @@ class ClientIvcRecursionTests : public testing::Test { struct ClientIvcProverOutput { using Flavor = MegaFlavor; using VerifierInstance = VerifierInstance_; + using VerifierData = ClientIvcRecursiveVerifier_::VerifierData; ClientIVC::Proof proof; - std::vector> verifier_instances; + + VerifierData verifier_data; }; static ClientIvcProverOutput construct_mock_client_ivc_output(ClientIVC& ivc) { using Builder = MegaCircuitBuilder; - using Flavor = MegaFlavor; - using VerifierInstance = VerifierInstance_; + // using Flavor = MegaFlavor; + // using VerifierInstance = VerifierInstance_; size_t NUM_CIRCUITS = 3; for (size_t idx = 0; idx < NUM_CIRCUITS; ++idx) { @@ -32,9 +35,15 @@ class ClientIvcRecursionTests : public testing::Test { ivc.accumulate(circuit); } - auto verifier_inst = std::make_shared(ivc.instance_vk); + // auto verifier_inst = std::make_shared(ivc.instance_vk); - return { ivc.prove(), { ivc.verifier_accumulator, verifier_inst } }; + ClientIvcProverOutput output; + output.proof = ivc.prove(); + output.verifier_data.verifier_accumulator_instance = ivc.verifier_accumulator; + output.verifier_data.honk_verification_key = ivc.instance_vk; + + return output; + // return { ivc.prove(), { ivc.verifier_accumulator, ivc.instance_vk } }; } }; @@ -43,8 +52,35 @@ TEST_F(ClientIvcRecursionTests, NativeVerification) ClientIVC ivc; auto [proof, verifier_instances] = construct_mock_client_ivc_output(ivc); - bool result = ivc.verify(proof, verifier_instances); + using Flavor = MegaFlavor; + using VerifierInstance = VerifierInstance_; + + auto verifier_inst = std::make_shared(ivc.instance_vk); + + bool result = ivc.verify(proof, { ivc.verifier_accumulator, verifier_inst }); EXPECT_TRUE(result); } +TEST_F(ClientIvcRecursionTests, Basic) +{ + ClientIVC ivc; + auto [proof, verifier_data] = construct_mock_client_ivc_output(ivc); + + using Flavor = MegaFlavor; + using VerifierInstance = VerifierInstance_; + + // Native verification for good measure + auto verifier_inst = std::make_shared(ivc.instance_vk); + + bool result = ivc.verify(proof, { ivc.verifier_accumulator, verifier_inst }); + EXPECT_TRUE(result); + + UltraCircuitBuilder builder; + ClientIvcRecursiveVerifier_ verifier{ &builder }; + + verifier.verify(proof, verifier_data); + + EXPECT_TRUE(CircuitChecker::check(builder)); +} + } // namespace bb::stdlib::recursion::honk \ No newline at end of file From 6737fbea9af90a47f14e2772a82e26a19f017c6e Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Wed, 29 May 2024 17:21:41 +0000 Subject: [PATCH 3/8] test passes with fold verify and decide --- .../verifier/client_ivc_recursive_verifier.cpp | 9 +++++++-- .../verifier/client_ivc_recursive_verifier.hpp | 2 +- .../verifier/client_ivc_recursive_verifier.test.cpp | 9 --------- 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.cpp b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.cpp index 13c2badc51af..35c91ca7e81d 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.cpp @@ -2,14 +2,19 @@ namespace bb::stdlib::recursion::honk { -void ClientIvcRecursiveVerifier_::verify(const ClientIVC::Proof& proof, const VerifierData& data) +void ClientIvcRecursiveVerifier_::verify(const ClientIVC::Proof& proof, VerifierData& data) { // Verify some stuff (void)data; (void)proof; (void)builder; - DeciderVerifier decider{ builder, data.verifier_accumulator_instance }; + FoldingVerifier folding_verifier{ builder, data.verifier_accumulator_instance, { data.honk_verification_key } }; + auto recursive_verifier_accumulator = folding_verifier.verify_folding_proof(proof.folding_proof); + auto native_verifier_acc = + std::make_shared(recursive_verifier_accumulator->get_value()); + + DeciderVerifier decider{ builder, native_verifier_acc }; decider.verify_proof(proof.decider_proof); } diff --git a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.hpp b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.hpp index ab02144da0dc..b23d47057e3d 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.hpp @@ -28,6 +28,6 @@ class ClientIvcRecursiveVerifier_ { ClientIvcRecursiveVerifier_(Builder* builder) : builder(builder){}; - void verify(const ClientIVC::Proof&, const VerifierData&); + void verify(const ClientIVC::Proof&, VerifierData&); }; } // namespace bb::stdlib::recursion::honk \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.test.cpp index bffe32621630..45d6cf8e0fcc 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.test.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.test.cpp @@ -66,15 +66,6 @@ TEST_F(ClientIvcRecursionTests, Basic) ClientIVC ivc; auto [proof, verifier_data] = construct_mock_client_ivc_output(ivc); - using Flavor = MegaFlavor; - using VerifierInstance = VerifierInstance_; - - // Native verification for good measure - auto verifier_inst = std::make_shared(ivc.instance_vk); - - bool result = ivc.verify(proof, { ivc.verifier_accumulator, verifier_inst }); - EXPECT_TRUE(result); - UltraCircuitBuilder builder; ClientIvcRecursiveVerifier_ verifier{ &builder }; From b20bd61336e9c6877aea789ae982db95c34f14c0 Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Wed, 29 May 2024 17:44:07 +0000 Subject: [PATCH 4/8] tidy up and use vks plural --- .../verifier/client_ivc_recursive_verifier.cpp | 2 +- .../verifier/client_ivc_recursive_verifier.hpp | 3 +-- .../verifier/client_ivc_recursive_verifier.test.cpp | 6 +----- 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.cpp b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.cpp index 35c91ca7e81d..e447b4cdf992 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.cpp @@ -9,7 +9,7 @@ void ClientIvcRecursiveVerifier_::verify(const ClientIVC::Proof& proof, Verifier (void)proof; (void)builder; - FoldingVerifier folding_verifier{ builder, data.verifier_accumulator_instance, { data.honk_verification_key } }; + FoldingVerifier folding_verifier{ builder, data.verifier_accumulator_instance, data.honk_verification_keys }; auto recursive_verifier_accumulator = folding_verifier.verify_folding_proof(proof.folding_proof); auto native_verifier_acc = std::make_shared(recursive_verifier_accumulator->get_value()); diff --git a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.hpp b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.hpp index b23d47057e3d..59dbc1c97cc1 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.hpp @@ -21,8 +21,7 @@ class ClientIvcRecursiveVerifier_ { using NativeVerificationKey = NativeFlavor::VerificationKey; std::shared_ptr verifier_accumulator_instance; - std::shared_ptr honk_verification_key; - // std::vector> honk_verification_keys; + std::vector> honk_verification_keys; }; ClientIvcRecursiveVerifier_(Builder* builder) diff --git a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.test.cpp index 45d6cf8e0fcc..3248ce70c0bf 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.test.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.test.cpp @@ -25,8 +25,6 @@ class ClientIvcRecursionTests : public testing::Test { static ClientIvcProverOutput construct_mock_client_ivc_output(ClientIVC& ivc) { using Builder = MegaCircuitBuilder; - // using Flavor = MegaFlavor; - // using VerifierInstance = VerifierInstance_; size_t NUM_CIRCUITS = 3; for (size_t idx = 0; idx < NUM_CIRCUITS; ++idx) { @@ -35,12 +33,10 @@ class ClientIvcRecursionTests : public testing::Test { ivc.accumulate(circuit); } - // auto verifier_inst = std::make_shared(ivc.instance_vk); - ClientIvcProverOutput output; output.proof = ivc.prove(); output.verifier_data.verifier_accumulator_instance = ivc.verifier_accumulator; - output.verifier_data.honk_verification_key = ivc.instance_vk; + output.verifier_data.honk_verification_keys = { ivc.instance_vk }; return output; // return { ivc.prove(), { ivc.verifier_accumulator, ivc.instance_vk } }; From d43db75471adabf70fd52b02d83915ff299f8ad7 Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Wed, 29 May 2024 18:36:03 +0000 Subject: [PATCH 5/8] more tidying --- .../client_ivc_recursive_verifier.cpp | 7 ++- .../client_ivc_recursive_verifier.hpp | 17 ++----- .../client_ivc_recursive_verifier.test.cpp | 50 +++++++++---------- .../protogalaxy_recursive_verifier.hpp | 6 +++ 4 files changed, 37 insertions(+), 43 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.cpp b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.cpp index e447b4cdf992..bdc7bf19836a 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.cpp @@ -2,17 +2,16 @@ namespace bb::stdlib::recursion::honk { -void ClientIvcRecursiveVerifier_::verify(const ClientIVC::Proof& proof, VerifierData& data) +void ClientIvcRecursiveVerifier_::verify(const ClientIVC::Proof& proof, VerifierInput& data) { // Verify some stuff (void)data; (void)proof; (void)builder; - FoldingVerifier folding_verifier{ builder, data.verifier_accumulator_instance, data.honk_verification_keys }; + FoldingVerifier folding_verifier{ builder, data.accumulator, data.instance_vks }; auto recursive_verifier_accumulator = folding_verifier.verify_folding_proof(proof.folding_proof); - auto native_verifier_acc = - std::make_shared(recursive_verifier_accumulator->get_value()); + auto native_verifier_acc = std::make_shared(recursive_verifier_accumulator->get_value()); DeciderVerifier decider{ builder, native_verifier_acc }; decider.verify_proof(proof.decider_proof); diff --git a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.hpp b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.hpp index 59dbc1c97cc1..99eb97af67b6 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.hpp @@ -8,25 +8,16 @@ class ClientIvcRecursiveVerifier_ { using RecursiveFlavor = MegaRecursiveFlavor_; // The verifier algorithms are Mega using RecursiveVerifierInstances = RecursiveVerifierInstances_; - using DeciderVerifier = DeciderRecursiveVerifier_; - using FoldingVerifier = ProtoGalaxyRecursiveVerifier_; - Builder* builder; public: - struct VerifierData { - - using NativeFlavor = MegaFlavor; - using NativeInstance = bb::VerifierInstance_; - using NativeVerificationKey = NativeFlavor::VerificationKey; - - std::shared_ptr verifier_accumulator_instance; - std::vector> honk_verification_keys; - }; + using DeciderVerifier = DeciderRecursiveVerifier_; + using FoldingVerifier = ProtoGalaxyRecursiveVerifier_; + using VerifierInput = FoldingVerifier::VerifierInput; ClientIvcRecursiveVerifier_(Builder* builder) : builder(builder){}; - void verify(const ClientIVC::Proof&, VerifierData&); + void verify(const ClientIVC::Proof&, VerifierInput&); }; } // namespace bb::stdlib::recursion::honk \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.test.cpp index 3248ce70c0bf..de5ea8b41542 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.test.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.test.cpp @@ -6,25 +6,29 @@ namespace bb::stdlib::recursion::honk { class ClientIvcRecursionTests : public testing::Test { public: + using Builder = UltraCircuitBuilder; + using ClientIvcVerifier = ClientIvcRecursiveVerifier_; + using VerifierInput = ClientIvcVerifier::FoldingVerifier::VerifierInput; + using VerifierInstance = VerifierInput::Instance; + static void SetUpTestSuite() { bb::srs::init_crs_factory("../srs_db/ignition"); srs::init_grumpkin_crs_factory("../srs_db/grumpkin"); } - // WORKTODO: if this is really needed then move it to client_ivc or something struct ClientIvcProverOutput { - using Flavor = MegaFlavor; - using VerifierInstance = VerifierInstance_; - using VerifierData = ClientIvcRecursiveVerifier_::VerifierData; ClientIVC::Proof proof; - - VerifierData verifier_data; + VerifierInput verifier_input; }; - static ClientIvcProverOutput construct_mock_client_ivc_output(ClientIVC& ivc) + /** + * @brief Construct a genuine ClientIvc prover output based on accumulation of an arbitrary set of mock circuits + * + */ + static ClientIvcProverOutput construct_client_ivc_prover_output(ClientIVC& ivc) { - using Builder = MegaCircuitBuilder; + using Builder = ClientIVC::ClientCircuit; size_t NUM_CIRCUITS = 3; for (size_t idx = 0; idx < NUM_CIRCUITS; ++idx) { @@ -33,39 +37,33 @@ class ClientIvcRecursionTests : public testing::Test { ivc.accumulate(circuit); } - ClientIvcProverOutput output; - output.proof = ivc.prove(); - output.verifier_data.verifier_accumulator_instance = ivc.verifier_accumulator; - output.verifier_data.honk_verification_keys = { ivc.instance_vk }; - - return output; - // return { ivc.prove(), { ivc.verifier_accumulator, ivc.instance_vk } }; + return { ivc.prove(), { ivc.verifier_accumulator, { ivc.instance_vk } } }; } }; TEST_F(ClientIvcRecursionTests, NativeVerification) { ClientIVC ivc; - auto [proof, verifier_instances] = construct_mock_client_ivc_output(ivc); + auto [proof, verifier_input] = construct_client_ivc_prover_output(ivc); - using Flavor = MegaFlavor; - using VerifierInstance = VerifierInstance_; - - auto verifier_inst = std::make_shared(ivc.instance_vk); + // Construct the set of native verifier instances to be processed by the folding verifier + std::vector> instances{ verifier_input.accumulator }; + for (auto vk : verifier_input.instance_vks) { + instances.emplace_back(std::make_shared(vk)); + } - bool result = ivc.verify(proof, { ivc.verifier_accumulator, verifier_inst }); - EXPECT_TRUE(result); + EXPECT_TRUE(ivc.verify(proof, instances)); } TEST_F(ClientIvcRecursionTests, Basic) { ClientIVC ivc; - auto [proof, verifier_data] = construct_mock_client_ivc_output(ivc); + auto [proof, verifier_input] = construct_client_ivc_prover_output(ivc); - UltraCircuitBuilder builder; - ClientIvcRecursiveVerifier_ verifier{ &builder }; + Builder builder; + ClientIvcVerifier verifier{ &builder }; - verifier.verify(proof, verifier_data); + verifier.verify(proof, verifier_input); EXPECT_TRUE(CircuitChecker::check(builder)); } diff --git a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/protogalaxy_recursive_verifier.hpp b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/protogalaxy_recursive_verifier.hpp index e16c6677f95a..5df831e1346e 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/protogalaxy_recursive_verifier.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/protogalaxy_recursive_verifier.hpp @@ -27,6 +27,12 @@ template class ProtoGalaxyRecursiveVerifier_ { static constexpr size_t NUM = VerifierInstances::NUM; using Transcript = bb::BaseTranscript>; + struct VerifierInput { + using Instance = NativeInstance; + std::shared_ptr accumulator; + std::vector> instance_vks; + }; + static constexpr size_t NUM_SUBRELATIONS = Flavor::NUM_SUBRELATIONS; CommitmentLabels commitment_labels; From 5b6f278bc6521f13407f6f1ddc1d67371cf9df6b Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Wed, 29 May 2024 18:44:34 +0000 Subject: [PATCH 6/8] comments --- .../verifier/client_ivc_recursive_verifier.test.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.test.cpp index de5ea8b41542..5c280557f740 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.test.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.test.cpp @@ -41,6 +41,10 @@ class ClientIvcRecursionTests : public testing::Test { } }; +/** + * @brief Ensure the ClientIvc proof used herein can be natively verified + * + */ TEST_F(ClientIvcRecursionTests, NativeVerification) { ClientIVC ivc; @@ -52,17 +56,25 @@ TEST_F(ClientIvcRecursionTests, NativeVerification) instances.emplace_back(std::make_shared(vk)); } + // Confirm that the IVC proof can be natively verified EXPECT_TRUE(ivc.verify(proof, instances)); } +/** + * @brief Construct and Check a recursive ClientIvc verification circuit + * + */ TEST_F(ClientIvcRecursionTests, Basic) { + // Generate a genuine ClientIvc prover output ClientIVC ivc; auto [proof, verifier_input] = construct_client_ivc_prover_output(ivc); + // Construct the ClientIvc recursive verifier Builder builder; ClientIvcVerifier verifier{ &builder }; + // Generate the recursive verification circuit verifier.verify(proof, verifier_input); EXPECT_TRUE(CircuitChecker::check(builder)); From f7e420353c7d577022ae8d930e48e6714d74069e Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Wed, 29 May 2024 19:01:41 +0000 Subject: [PATCH 7/8] update constructor to use VerifierInput --- .../cpp/src/barretenberg/client_ivc/client_ivc.cpp | 2 +- .../verifier/client_ivc_recursive_verifier.cpp | 9 ++++----- .../verifier/protogalaxy_recursive_verifier.hpp | 6 ++---- .../verifier/protogalaxy_recursive_verifier.test.cpp | 11 +++++------ 4 files changed, 12 insertions(+), 16 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/client_ivc/client_ivc.cpp b/barretenberg/cpp/src/barretenberg/client_ivc/client_ivc.cpp index 53e0eaaa1948..f0fb4b121c7a 100644 --- a/barretenberg/cpp/src/barretenberg/client_ivc/client_ivc.cpp +++ b/barretenberg/cpp/src/barretenberg/client_ivc/client_ivc.cpp @@ -17,7 +17,7 @@ void ClientIVC::accumulate(ClientCircuit& circuit, const std::shared_ptr(verifier_accum->get_value()); } diff --git a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.cpp b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.cpp index bdc7bf19836a..70f7324694d1 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.cpp @@ -4,15 +4,14 @@ namespace bb::stdlib::recursion::honk { void ClientIvcRecursiveVerifier_::verify(const ClientIVC::Proof& proof, VerifierInput& data) { - // Verify some stuff - (void)data; - (void)proof; - (void)builder; + // WORKTODO: Perform Goblin recursive verification here - FoldingVerifier folding_verifier{ builder, data.accumulator, data.instance_vks }; + // Perform recursive folding verification + FoldingVerifier folding_verifier{ builder, data }; auto recursive_verifier_accumulator = folding_verifier.verify_folding_proof(proof.folding_proof); auto native_verifier_acc = std::make_shared(recursive_verifier_accumulator->get_value()); + // Perform recursive decider verification DeciderVerifier decider{ builder, native_verifier_acc }; decider.verify_proof(proof.decider_proof); } diff --git a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/protogalaxy_recursive_verifier.hpp b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/protogalaxy_recursive_verifier.hpp index 5df831e1346e..613528f52722 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/protogalaxy_recursive_verifier.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/protogalaxy_recursive_verifier.hpp @@ -41,11 +41,9 @@ template class ProtoGalaxyRecursiveVerifier_ { std::shared_ptr transcript; VerifierInstances instances; - ProtoGalaxyRecursiveVerifier_(Builder* builder, - std::shared_ptr& accumulator, - const std::vector>& native_inst_vks) + ProtoGalaxyRecursiveVerifier_(Builder* builder, const VerifierInput& input_data) : builder(builder) - , instances(VerifierInstances(builder, accumulator, native_inst_vks)){}; + , instances(VerifierInstances(builder, input_data.accumulator, input_data.instance_vks)){}; /** * @brief Given a new round challenge δ for each iteration of the full ProtoGalaxy protocol, compute the vector diff --git a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/protogalaxy_recursive_verifier.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/protogalaxy_recursive_verifier.test.cpp index 4322f3ed919a..504481a0e7f2 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/protogalaxy_recursive_verifier.test.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/protogalaxy_recursive_verifier.test.cpp @@ -193,8 +193,8 @@ template class ProtoGalaxyRecursiveTests : public tes // Create a recursive folding verifier circuit for the folding proof of the two instances OuterBuilder folding_circuit; - auto verifier = - FoldingRecursiveVerifier(&folding_circuit, verifier_instance_1, { verifier_instance_2->verification_key }); + auto verifier = FoldingRecursiveVerifier(&folding_circuit, + { verifier_instance_1, { verifier_instance_2->verification_key } }); verifier.verify_folding_proof(folding_proof.proof); info("Folding Recursive Verifier: num gates = ", folding_circuit.num_gates); EXPECT_EQ(folding_circuit.failed(), false) << folding_circuit.err(); @@ -257,8 +257,8 @@ template class ProtoGalaxyRecursiveTests : public tes // Create a recursive folding verifier circuit for the folding proof of the two instances OuterBuilder folding_circuit; - auto verifier = - FoldingRecursiveVerifier(&folding_circuit, verifier_instance_1, { verifier_instance_2->verification_key }); + auto verifier = FoldingRecursiveVerifier(&folding_circuit, + { verifier_instance_1, { verifier_instance_2->verification_key } }); auto recursive_verifier_accumulator = verifier.verify_folding_proof(folding_proof.proof); auto native_verifier_acc = std::make_shared(recursive_verifier_accumulator->get_value()); info("Folding Recursive Verifier: num gates = ", folding_circuit.num_gates); @@ -357,8 +357,7 @@ template class ProtoGalaxyRecursiveTests : public tes // commitments OuterBuilder folding_circuit; FoldingRecursiveVerifier verifier{ &folding_circuit, - verifier_accumulator, - { verifier_inst->verification_key } }; + { verifier_accumulator, { verifier_inst->verification_key } } }; auto recursive_verifier_acc = verifier.verify_folding_proof(folding_proof.proof); // Validate that the target sum between prover and verifier is now different EXPECT_FALSE(folding_proof.accumulator->target_sum == recursive_verifier_acc->target_sum.get_value()); From 2aa3e85e4ff96bed5f898cc85b48720b2b7a8395 Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Thu, 30 May 2024 15:40:47 +0000 Subject: [PATCH 8/8] name update --- .../client_ivc_recursive_verifier.cpp | 2 +- .../client_ivc_recursive_verifier.hpp | 4 +-- .../client_ivc_recursive_verifier.test.cpp | 26 +++++++++---------- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.cpp b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.cpp index 70f7324694d1..3fda23bdeaa9 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.cpp @@ -2,7 +2,7 @@ namespace bb::stdlib::recursion::honk { -void ClientIvcRecursiveVerifier_::verify(const ClientIVC::Proof& proof, VerifierInput& data) +void ClientIVCRecursiveVerifier::verify(const ClientIVC::Proof& proof, VerifierInput& data) { // WORKTODO: Perform Goblin recursive verification here diff --git a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.hpp b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.hpp index 99eb97af67b6..3e996c2c377c 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.hpp @@ -3,7 +3,7 @@ #include "barretenberg/stdlib/honk_recursion/verifier/decider_recursive_verifier.hpp" namespace bb::stdlib::recursion::honk { -class ClientIvcRecursiveVerifier_ { +class ClientIVCRecursiveVerifier { using Builder = UltraCircuitBuilder; // The circuit will be an Ultra circuit using RecursiveFlavor = MegaRecursiveFlavor_; // The verifier algorithms are Mega using RecursiveVerifierInstances = RecursiveVerifierInstances_; @@ -15,7 +15,7 @@ class ClientIvcRecursiveVerifier_ { using FoldingVerifier = ProtoGalaxyRecursiveVerifier_; using VerifierInput = FoldingVerifier::VerifierInput; - ClientIvcRecursiveVerifier_(Builder* builder) + ClientIVCRecursiveVerifier(Builder* builder) : builder(builder){}; void verify(const ClientIVC::Proof&, VerifierInput&); diff --git a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.test.cpp index 5c280557f740..d57f21afded4 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.test.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/client_ivc_recursive_verifier.test.cpp @@ -4,11 +4,11 @@ #include "barretenberg/common/test.hpp" namespace bb::stdlib::recursion::honk { -class ClientIvcRecursionTests : public testing::Test { +class ClientIVCRecursionTests : public testing::Test { public: using Builder = UltraCircuitBuilder; - using ClientIvcVerifier = ClientIvcRecursiveVerifier_; - using VerifierInput = ClientIvcVerifier::FoldingVerifier::VerifierInput; + using ClientIVCVerifier = ClientIVCRecursiveVerifier; + using VerifierInput = ClientIVCVerifier::FoldingVerifier::VerifierInput; using VerifierInstance = VerifierInput::Instance; static void SetUpTestSuite() @@ -17,16 +17,16 @@ class ClientIvcRecursionTests : public testing::Test { srs::init_grumpkin_crs_factory("../srs_db/grumpkin"); } - struct ClientIvcProverOutput { + struct ClientIVCProverOutput { ClientIVC::Proof proof; VerifierInput verifier_input; }; /** - * @brief Construct a genuine ClientIvc prover output based on accumulation of an arbitrary set of mock circuits + * @brief Construct a genuine ClientIVC prover output based on accumulation of an arbitrary set of mock circuits * */ - static ClientIvcProverOutput construct_client_ivc_prover_output(ClientIVC& ivc) + static ClientIVCProverOutput construct_client_ivc_prover_output(ClientIVC& ivc) { using Builder = ClientIVC::ClientCircuit; @@ -42,10 +42,10 @@ class ClientIvcRecursionTests : public testing::Test { }; /** - * @brief Ensure the ClientIvc proof used herein can be natively verified + * @brief Ensure the ClientIVC proof used herein can be natively verified * */ -TEST_F(ClientIvcRecursionTests, NativeVerification) +TEST_F(ClientIVCRecursionTests, NativeVerification) { ClientIVC ivc; auto [proof, verifier_input] = construct_client_ivc_prover_output(ivc); @@ -61,18 +61,18 @@ TEST_F(ClientIvcRecursionTests, NativeVerification) } /** - * @brief Construct and Check a recursive ClientIvc verification circuit + * @brief Construct and Check a recursive ClientIVC verification circuit * */ -TEST_F(ClientIvcRecursionTests, Basic) +TEST_F(ClientIVCRecursionTests, Basic) { - // Generate a genuine ClientIvc prover output + // Generate a genuine ClientIVC prover output ClientIVC ivc; auto [proof, verifier_input] = construct_client_ivc_prover_output(ivc); - // Construct the ClientIvc recursive verifier + // Construct the ClientIVC recursive verifier Builder builder; - ClientIvcVerifier verifier{ &builder }; + ClientIVCVerifier verifier{ &builder }; // Generate the recursive verification circuit verifier.verify(proof, verifier_input);