From cf18c6945def03bf8c5d3d34ac1765f28fb4a260 Mon Sep 17 00:00:00 2001 From: maramihali Date: Thu, 21 Sep 2023 09:38:35 +0000 Subject: [PATCH 1/4] more wip --- .../barretenberg/honk/instance/instances.hpp | 26 +++++++++++++++++++ .../honk/proof_system/protogalaxy_prover.cpp | 3 ++- .../honk/proof_system/protogalaxy_prover.hpp | 15 ++++++----- .../proof_system/protogalaxy_verifier.hpp | 10 ++++--- 4 files changed, 42 insertions(+), 12 deletions(-) create mode 100644 barretenberg/cpp/src/barretenberg/honk/instance/instances.hpp diff --git a/barretenberg/cpp/src/barretenberg/honk/instance/instances.hpp b/barretenberg/cpp/src/barretenberg/honk/instance/instances.hpp new file mode 100644 index 00000000000..cf6b69f7202 --- /dev/null +++ b/barretenberg/cpp/src/barretenberg/honk/instance/instances.hpp @@ -0,0 +1,26 @@ + +namespace proof_system::honk { + +template struct ProverInstances { + using Flavor = Flavor_; + using Instance = ProverInstance_; + using ArrayType = std::array; + static constexpr size_t NUM = NUM_; + ArrayType _data; + Instance const& operator[](size_t idx) const { return _data[idx]; } + typename ArrayType::iterator begin() { return _data.begin(); }; + typename ArrayType::iterator end() { return _data.end(); }; +} + +template +struct VerifierInstances { + using Flavor = Flavor_; + using Instance = VerifierInstance_; + using ArrayType = std::array; + static constexpr size_t NUM = NUM_; + ArrayType _data; + Instance const& operator[](size_t idx) const { return _data[idx]; } + typename ArrayType::iterator begin() { return _data.begin(); }; + typename ArrayType::iterator end() { return _data.end(); }; +} +} // namespace proof_system::honk \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_prover.cpp b/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_prover.cpp index 679071c8cb7..127133603b6 100644 --- a/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_prover.cpp @@ -2,7 +2,7 @@ #include "barretenberg/proof_system/flavor/flavor.hpp" namespace proof_system::honk { template -ProtoGalaxyProver_::ProtoGalaxyProver_(std::vector> insts) +ProtoGalaxyProver_::ProtoGalaxyProver_(std::shared_ptr insts) : instances(insts) {} @@ -14,6 +14,7 @@ ProtoGalaxyProver_::ProtoGalaxyProver_(std::vector void ProtoGalaxyProver_::prepare_for_folding() { + // this doesnt work in the current format for (const auto& instance : instances) { instance->initialise_prover_polynomials(); diff --git a/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_prover.hpp b/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_prover.hpp index a2e2969c77b..0e8676d4b21 100644 --- a/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_prover.hpp +++ b/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_prover.hpp @@ -6,17 +6,18 @@ #include "barretenberg/honk/proof_system/folding_result.hpp" #include "barretenberg/proof_system/flavor/flavor.hpp" namespace proof_system::honk { -template class ProtoGalaxyProver_ { +template class ProtoGalaxyProver_ { public: + using Flavor = typename ProverInstances::Flavor; using FF = typename Flavor::FF; - using Instance = ProverInstance_; + using Instances = ProverInstances; using ProverPolynomials = typename Flavor::ProverPolynomials; - std::vector> instances; + std::shared_ptr instances; ProverTranscript transcript; - explicit ProtoGalaxyProver_(std::vector>); + explicit ProtoGalaxyProver_(std::shared_ptr); ~ProtoGalaxyProver_() = default; void prepare_for_folding(); @@ -24,7 +25,7 @@ template class ProtoGalaxyProver_ { ProverFoldingResult fold_instances(); }; -extern template class ProtoGalaxyProver_; -extern template class ProtoGalaxyProver_; -extern template class ProtoGalaxyProver_; +// extern template class ProtoGalaxyProver_; +// extern template class ProtoGalaxyProver_; +// extern template class ProtoGalaxyProver_; } // namespace proof_system::honk \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_verifier.hpp b/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_verifier.hpp index e556480af1c..4b279b3c2f4 100644 --- a/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_verifier.hpp +++ b/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_verifier.hpp @@ -8,20 +8,22 @@ #include "barretenberg/proof_system/flavor/flavor.hpp" namespace proof_system::honk { -template class ProtoGalaxyVerifier_ { +template class ProtoGalaxyVerifier_ { public: + using Flavor = typename VerifierInstances::Flavor; using FF = typename Flavor::FF; using VerificationKey = typename Flavor::VerificationKey; using VerifierInstance = VerifierInstance_; std::vector verifier_instances; VerifierTranscript transcript; + // should the PG verifier be given the VerifierInstances, nah this makes sense yo me explicit ProtoGalaxyVerifier_(std::vector> vks); ~ProtoGalaxyVerifier_() = default; VerifierFoldingResult fold_public_parameters(std::vector fold_data); }; -extern template class ProtoGalaxyVerifier_; -extern template class ProtoGalaxyVerifier_; -extern template class ProtoGalaxyVerifier_; +// extern template class ProtoGalaxyVerifier_; +// extern template class ProtoGalaxyVerifier_; +// extern template class ProtoGalaxyVerifier_; } // namespace proof_system::honk \ No newline at end of file From 2d0bd077ea962f23839e0c0d6e8742b59221afd2 Mon Sep 17 00:00:00 2001 From: maramihali Date: Thu, 21 Sep 2023 15:37:32 +0000 Subject: [PATCH 2/4] linker errrors :( --- .../barretenberg/honk/instance/instances.hpp | 27 ++++++++----- .../honk/instance/prover_instance.hpp | 2 - .../honk/instance/verifier_instance.hpp | 1 - .../honk/proof_system/protogalaxy_prover.cpp | 35 +++++++++-------- .../honk/proof_system/protogalaxy_prover.hpp | 9 ++--- .../proof_system/protogalaxy_verifier.cpp | 39 ++++++++++--------- .../proof_system/protogalaxy_verifier.hpp | 8 ++-- .../honk/transcript/transcript.test.cpp | 8 ++-- 8 files changed, 70 insertions(+), 59 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/honk/instance/instances.hpp b/barretenberg/cpp/src/barretenberg/honk/instance/instances.hpp index cf6b69f7202..b44d5cb78aa 100644 --- a/barretenberg/cpp/src/barretenberg/honk/instance/instances.hpp +++ b/barretenberg/cpp/src/barretenberg/honk/instance/instances.hpp @@ -1,26 +1,35 @@ - +#pragma once +#include "barretenberg/honk/instance/prover_instance.hpp" +#include "barretenberg/honk/instance/verifier_instance.hpp" namespace proof_system::honk { template struct ProverInstances { using Flavor = Flavor_; - using Instance = ProverInstance_; - using ArrayType = std::array; + using Instance = ProverInstance_; + using ArrayType = std::array; + + public: static constexpr size_t NUM = NUM_; ArrayType _data; Instance const& operator[](size_t idx) const { return _data[idx]; } typename ArrayType::iterator begin() { return _data.begin(); }; typename ArrayType::iterator end() { return _data.end(); }; -} + ProverInstances() + : _data({ 0, 0, 0, 0, 0 }){}; + ~ProverInstances(); +}; -template -struct VerifierInstances { +template struct VerifierInstances { using Flavor = Flavor_; - using Instance = VerifierInstance_; - using ArrayType = std::array; + using Instance = VerifierInstance_; + using ArrayType = std::array; + + public: static constexpr size_t NUM = NUM_; ArrayType _data; Instance const& operator[](size_t idx) const { return _data[idx]; } typename ArrayType::iterator begin() { return _data.begin(); }; typename ArrayType::iterator end() { return _data.end(); }; -} + ~VerifierInstances(); +}; } // namespace proof_system::honk \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/honk/instance/prover_instance.hpp b/barretenberg/cpp/src/barretenberg/honk/instance/prover_instance.hpp index f65a06e79e9..99bfde23643 100644 --- a/barretenberg/cpp/src/barretenberg/honk/instance/prover_instance.hpp +++ b/barretenberg/cpp/src/barretenberg/honk/instance/prover_instance.hpp @@ -46,8 +46,6 @@ template class ProverInstance_ { proof_system::RelationParameters relation_parameters; std::vector recursive_proof_public_input_indices; FoldingParameters folding_params; - // Used by the prover for domain separation in the transcript - uint32_t index; ProverInstance_(Circuit& circuit) { diff --git a/barretenberg/cpp/src/barretenberg/honk/instance/verifier_instance.hpp b/barretenberg/cpp/src/barretenberg/honk/instance/verifier_instance.hpp index 7adb643d441..3ba7979103a 100644 --- a/barretenberg/cpp/src/barretenberg/honk/instance/verifier_instance.hpp +++ b/barretenberg/cpp/src/barretenberg/honk/instance/verifier_instance.hpp @@ -15,6 +15,5 @@ template class VerifierInstance_ { size_t circuit_size; RelationParameters relation_parameters; FoldingParameters folding_params; - size_t index; }; } // namespace proof_system::honk \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_prover.cpp b/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_prover.cpp index 127133603b6..4ed4ab33238 100644 --- a/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_prover.cpp @@ -1,8 +1,8 @@ #include "protogalaxy_prover.hpp" #include "barretenberg/proof_system/flavor/flavor.hpp" namespace proof_system::honk { -template -ProtoGalaxyProver_::ProtoGalaxyProver_(std::shared_ptr insts) +template +ProtoGalaxyProver_::ProtoGalaxyProver_(ProverInstances insts) : instances(insts) {} @@ -12,44 +12,47 @@ ProtoGalaxyProver_::ProtoGalaxyProver_(std::shared_ptr insts) * polynomials in the transcript. * */ -template void ProtoGalaxyProver_::prepare_for_folding() +template void ProtoGalaxyProver_::prepare_for_folding() { // this doesnt work in the current format - for (const auto& instance : instances) { + auto idx = 0; + for (auto it = instances.begin(); it != instances.end(); it++, idx++) { + auto instance = *it; instance->initialise_prover_polynomials(); - const auto instance_index = std::to_string(instance->index); + auto domain_separator = std::to_string(idx); const auto circuit_size = static_cast(instance->proving_key->circuit_size); const auto num_public_inputs = static_cast(instance->proving_key->num_public_inputs); - transcript.send_to_verifier(instance_index + "_circuit_size", circuit_size); - transcript.send_to_verifier(instance_index + "_public_input_size", num_public_inputs); - transcript.send_to_verifier(instance_index + "_pub_inputs_offset", + transcript.send_to_verifier(domain_separator + "_circuit_size", circuit_size); + transcript.send_to_verifier(domain_separator + "_public_input_size", num_public_inputs); + transcript.send_to_verifier(domain_separator + "_pub_inputs_offset", static_cast(instance->pub_inputs_offset)); for (size_t i = 0; i < instance->proving_key->num_public_inputs; ++i) { auto public_input_i = instance->public_inputs[i]; - transcript.send_to_verifier(instance_index + "_public_input_" + std::to_string(i), public_input_i); + transcript.send_to_verifier(domain_separator + "_public_input_" + std::to_string(i), public_input_i); } - auto [eta, beta, gamma] = - transcript.get_challenges(instance_index + "_eta", instance_index + "_beta", instance_index + "_gamma"); + auto [eta, beta, gamma] = transcript.get_challenges( + domain_separator + "_eta", domain_separator + "_beta", domain_separator + "_gamma"); instance->compute_sorted_accumulator_polynomials(eta); instance->compute_grand_product_polynomials(beta, gamma); } } // TODO(#689): implement this function -template ProverFoldingResult ProtoGalaxyProver_::fold_instances() +template +ProverFoldingResult ProtoGalaxyProver_::fold_instances() { prepare_for_folding(); ProverFoldingResult res; res.folding_data = transcript.proof_data; return res; } - -template class ProtoGalaxyProver_; -template class ProtoGalaxyProver_; -template class ProtoGalaxyProver_; +template class ProtoGalaxyProver_>; +// template class ProtoGalaxyProver_; +// template class ProtoGalaxyProver_; +// template class ProtoGalaxyProver_; } // namespace proof_system::honk \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_prover.hpp b/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_prover.hpp index 0e8676d4b21..c87c088c045 100644 --- a/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_prover.hpp +++ b/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_prover.hpp @@ -2,7 +2,7 @@ #include "barretenberg/honk/flavor/goblin_ultra.hpp" #include "barretenberg/honk/flavor/ultra.hpp" #include "barretenberg/honk/flavor/ultra_grumpkin.hpp" -#include "barretenberg/honk/instance/prover_instance.hpp" +#include "barretenberg/honk/instance/instances.hpp" #include "barretenberg/honk/proof_system/folding_result.hpp" #include "barretenberg/proof_system/flavor/flavor.hpp" namespace proof_system::honk { @@ -10,14 +10,13 @@ template class ProtoGalaxyProver_ { public: using Flavor = typename ProverInstances::Flavor; using FF = typename Flavor::FF; - using Instances = ProverInstances; using ProverPolynomials = typename Flavor::ProverPolynomials; - std::shared_ptr instances; + ProverInstances instances; ProverTranscript transcript; - explicit ProtoGalaxyProver_(std::shared_ptr); + explicit ProtoGalaxyProver_(ProverInstances); ~ProtoGalaxyProver_() = default; void prepare_for_folding(); @@ -25,7 +24,7 @@ template class ProtoGalaxyProver_ { ProverFoldingResult fold_instances(); }; -// extern template class ProtoGalaxyProver_; +extern template class ProtoGalaxyProver_>; // extern template class ProtoGalaxyProver_; // extern template class ProtoGalaxyProver_; } // namespace proof_system::honk \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_verifier.cpp b/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_verifier.cpp index 8ad3054595f..da323281c1e 100644 --- a/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_verifier.cpp +++ b/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_verifier.cpp @@ -1,36 +1,39 @@ #include "protogalaxy_verifier.hpp" #include "barretenberg/honk/utils/grand_product_delta.hpp" namespace proof_system::honk { -template -ProtoGalaxyVerifier_::ProtoGalaxyVerifier_(std::vector> vks) +template +ProtoGalaxyVerifier_::ProtoGalaxyVerifier_(std::vector> vks) { // TODO(https://github.com/AztecProtocol/barretenberg/issues/391): simplify code with C++23 features - uint32_t idx = 0; for (const auto& vk : vks) { - VerifierInstance inst; + Instance inst; inst.verification_key = std::move(vk); - inst.index = idx; verifier_instances.emplace_back(inst); - idx++; } } -template -VerifierFoldingResult ProtoGalaxyVerifier_::fold_public_parameters(std::vector fold_data) +template +VerifierFoldingResult ProtoGalaxyVerifier_< + VerifierInstances>::fold_public_parameters(std::vector fold_data) { transcript = VerifierTranscript{ fold_data }; - for (auto& inst : verifier_instances) { - auto idx = std::to_string(inst.index); - inst.circuit_size = transcript.template receive_from_prover(idx + "_circuit_size"); - inst.public_input_size = transcript.template receive_from_prover(idx + "_public_input_size"); - inst.pub_inputs_offset = transcript.template receive_from_prover(idx + "_pub_inputs_offset"); + auto index = 0; + for (auto it = verifier_instances.begin(); it != verifier_instances.end(); it++, index++) { + auto inst = *it; + auto domain_separator = std::to_string(index); + inst.circuit_size = transcript.template receive_from_prover(domain_separator + "_circuit_size"); + inst.public_input_size = + transcript.template receive_from_prover(domain_separator + "_public_input_size"); + inst.pub_inputs_offset = + transcript.template receive_from_prover(domain_separator + "_pub_inputs_offset"); for (size_t i = 0; i < inst.public_input_size; ++i) { auto public_input_i = - transcript.template receive_from_prover(idx + "_public_input_" + std::to_string(i)); + transcript.template receive_from_prover(domain_separator + "_public_input_" + std::to_string(i)); inst.public_inputs.emplace_back(public_input_i); } - auto [eta, beta, gamma] = transcript.get_challenges(idx + "_eta", idx + "_beta", idx + "_gamma"); + auto [eta, beta, gamma] = transcript.get_challenges( + domain_separator + "_eta", domain_separator + "_beta", domain_separator + "_gamma"); const FF public_input_delta = compute_public_input_delta( inst.public_inputs, beta, gamma, inst.circuit_size, inst.pub_inputs_offset); const FF lookup_grand_product_delta = compute_lookup_grand_product_delta(beta, gamma, inst.circuit_size); @@ -43,7 +46,7 @@ VerifierFoldingResult ProtoGalaxyVerifier_::fold_public_paramete return res; } -template class ProtoGalaxyVerifier_; -template class ProtoGalaxyVerifier_; -template class ProtoGalaxyVerifier_; +template class ProtoGalaxyVerifier_>; +// template class ProtoGalaxyVerifier_; +// template class ProtoGalaxyVerifier_; } // namespace proof_system::honk \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_verifier.hpp b/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_verifier.hpp index 4b279b3c2f4..68558aaa94b 100644 --- a/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_verifier.hpp +++ b/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_verifier.hpp @@ -2,7 +2,7 @@ #include "barretenberg/honk/flavor/goblin_ultra.hpp" #include "barretenberg/honk/flavor/ultra.hpp" #include "barretenberg/honk/flavor/ultra_grumpkin.hpp" -#include "barretenberg/honk/instance/verifier_instance.hpp" +#include "barretenberg/honk/instance/instances.hpp" #include "barretenberg/honk/proof_system/folding_result.hpp" #include "barretenberg/honk/transcript/transcript.hpp" #include "barretenberg/proof_system/flavor/flavor.hpp" @@ -12,9 +12,9 @@ template class ProtoGalaxyVerifier_ { public: using Flavor = typename VerifierInstances::Flavor; using FF = typename Flavor::FF; + using Instance = typename VerifierInstances::Instance; using VerificationKey = typename Flavor::VerificationKey; - using VerifierInstance = VerifierInstance_; - std::vector verifier_instances; + VerifierInstances verifier_instances; VerifierTranscript transcript; // should the PG verifier be given the VerifierInstances, nah this makes sense yo me @@ -23,7 +23,7 @@ template class ProtoGalaxyVerifier_ { VerifierFoldingResult fold_public_parameters(std::vector fold_data); }; -// extern template class ProtoGalaxyVerifier_; +extern template class ProtoGalaxyVerifier_>; // extern template class ProtoGalaxyVerifier_; // extern template class ProtoGalaxyVerifier_; } // namespace proof_system::honk \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/honk/transcript/transcript.test.cpp b/barretenberg/cpp/src/barretenberg/honk/transcript/transcript.test.cpp index 7981a048503..691545e6b18 100644 --- a/barretenberg/cpp/src/barretenberg/honk/transcript/transcript.test.cpp +++ b/barretenberg/cpp/src/barretenberg/honk/transcript/transcript.test.cpp @@ -335,6 +335,7 @@ TEST_F(UltraTranscriptTests, UltraVerifierManifestConsistency) TEST_F(UltraTranscriptTests, FoldingManifestTest) { + using Flavor = flavor::Ultra; auto builder_one = proof_system::UltraCircuitBuilder(); auto a = 2; auto b = 3; @@ -353,10 +354,9 @@ TEST_F(UltraTranscriptTests, FoldingManifestTest) auto composer = UltraComposer(); auto instance_one = composer.create_instance(builder_one); auto instance_two = composer.create_instance(builder_two); - - std::vector> insts; - insts.emplace_back(instance_one); - insts.emplace_back(instance_two); + ProverInstances insts; + insts[0] = instance_one; + insts[1] = instance_two; auto prover = composer.create_folding_prover(insts); auto verifier = composer.create_folding_verifier(insts); From 99504a5db66f6e3cdb906b4af8662c6bc8f2204b Mon Sep 17 00:00:00 2001 From: maramihali Date: Mon, 25 Sep 2023 11:02:43 +0000 Subject: [PATCH 3/4] it links and builds <3 --- .../honk/composer/ultra_composer.cpp | 28 ------------------- .../honk/composer/ultra_composer.hpp | 25 +++++++++++++++-- .../barretenberg/honk/instance/instances.hpp | 23 +++++++++++---- .../honk/instance/prover_instance.hpp | 2 -- .../honk/proof_system/protogalaxy_prover.cpp | 10 ++----- .../honk/proof_system/protogalaxy_prover.hpp | 7 +++-- .../proof_system/protogalaxy_verifier.cpp | 15 ++-------- .../proof_system/protogalaxy_verifier.hpp | 7 +++-- .../honk/transcript/transcript.test.cpp | 7 +++-- 9 files changed, 56 insertions(+), 68 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/honk/composer/ultra_composer.cpp b/barretenberg/cpp/src/barretenberg/honk/composer/ultra_composer.cpp index 93aba6f71bf..f01b4d3588d 100644 --- a/barretenberg/cpp/src/barretenberg/honk/composer/ultra_composer.cpp +++ b/barretenberg/cpp/src/barretenberg/honk/composer/ultra_composer.cpp @@ -35,35 +35,7 @@ UltraVerifier_ UltraComposer_::create_verifier(std::shared_ptr -ProtoGalaxyProver_ UltraComposer_::create_folding_prover( - std::vector> instances) -{ - uint32_t idx = 0; - for (const auto& inst : instances) { - inst->index = idx; - idx++; - } - ProtoGalaxyProver_ output_state(instances); - - return output_state; -} - -template -ProtoGalaxyVerifier_ UltraComposer_::create_folding_verifier( - std::vector> instances) -{ - std::vector> vks; - for (const auto& inst : instances) { - vks.emplace_back(inst->compute_verification_key()); - } - ProtoGalaxyVerifier_ output_state(vks); - - return output_state; -} - template class UltraComposer_; template class UltraComposer_; template class UltraComposer_; - } // namespace proof_system::honk diff --git a/barretenberg/cpp/src/barretenberg/honk/composer/ultra_composer.hpp b/barretenberg/cpp/src/barretenberg/honk/composer/ultra_composer.hpp index 0a33f748ba3..df8bc2e6907 100644 --- a/barretenberg/cpp/src/barretenberg/honk/composer/ultra_composer.hpp +++ b/barretenberg/cpp/src/barretenberg/honk/composer/ultra_composer.hpp @@ -24,9 +24,12 @@ template class UltraComposer_ { using VerifierCommitmentKey = typename Flavor::VerifierCommitmentKey; using Instance = ProverInstance_; + static constexpr size_t NUM_FOLDING = 2; + using ProverInstances = ProverInstances; + using VerifierInstances = VerifierInstances; + // offset due to placing zero wires at the start of execution trace static constexpr size_t num_zero_rows = Flavor::has_zero_row ? 1 : 0; - static constexpr std::string_view NAME_STRING = "UltraHonk"; static constexpr size_t NUM_WIRES = CircuitBuilder::NUM_WIRES; std::shared_ptr proving_key; @@ -69,8 +72,24 @@ template class UltraComposer_ { UltraProver_ create_prover(std::shared_ptr); UltraVerifier_ create_verifier(std::shared_ptr); - ProtoGalaxyProver_ create_folding_prover(std::vector>); - ProtoGalaxyVerifier_ create_folding_verifier(std::vector>); + ProtoGalaxyProver_ create_folding_prover(std::vector> instances) + { + ProverInstances insts(instances); + ProtoGalaxyProver_ output_state(insts); + + return output_state; + }; + ProtoGalaxyVerifier_ create_folding_verifier(std::vector> instances) + { + std::vector> vks; + for (const auto& inst : instances) { + vks.emplace_back(inst->compute_verification_key()); + } + VerifierInstances insts(vks); + ProtoGalaxyVerifier_ output_state(insts); + + return output_state; + }; }; extern template class UltraComposer_; // TODO: the UltraGrumpkin flavor still works on BN254 because plookup needs to be templated to be able to construct diff --git a/barretenberg/cpp/src/barretenberg/honk/instance/instances.hpp b/barretenberg/cpp/src/barretenberg/honk/instance/instances.hpp index b44d5cb78aa..2c5c0584c3f 100644 --- a/barretenberg/cpp/src/barretenberg/honk/instance/instances.hpp +++ b/barretenberg/cpp/src/barretenberg/honk/instance/instances.hpp @@ -6,7 +6,7 @@ namespace proof_system::honk { template struct ProverInstances { using Flavor = Flavor_; using Instance = ProverInstance_; - using ArrayType = std::array; + using ArrayType = std::array, NUM_>; public: static constexpr size_t NUM = NUM_; @@ -14,13 +14,18 @@ template struct ProverInstances { Instance const& operator[](size_t idx) const { return _data[idx]; } typename ArrayType::iterator begin() { return _data.begin(); }; typename ArrayType::iterator end() { return _data.end(); }; - ProverInstances() - : _data({ 0, 0, 0, 0, 0 }){}; - ~ProverInstances(); + ProverInstances(std::vector> data) + { + ASSERT(data.size() == NUM); + for (size_t idx = 0; idx < data.size(); idx++) { + _data[idx] = std::move(data[idx]); + } + }; }; template struct VerifierInstances { using Flavor = Flavor_; + using VerificationKey = typename Flavor::VerificationKey; using Instance = VerifierInstance_; using ArrayType = std::array; @@ -30,6 +35,14 @@ template struct VerifierInstances { Instance const& operator[](size_t idx) const { return _data[idx]; } typename ArrayType::iterator begin() { return _data.begin(); }; typename ArrayType::iterator end() { return _data.end(); }; - ~VerifierInstances(); + VerifierInstances(std::vector> vks) + { + ASSERT(vks.size() == NUM); + for (size_t idx = 0; idx < vks.size(); idx++) { + Instance inst; + inst.verification_key = std::move(vks[idx]); + _data[idx] = inst; + } + }; }; } // namespace proof_system::honk \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/honk/instance/prover_instance.hpp b/barretenberg/cpp/src/barretenberg/honk/instance/prover_instance.hpp index 99bfde23643..041499ce159 100644 --- a/barretenberg/cpp/src/barretenberg/honk/instance/prover_instance.hpp +++ b/barretenberg/cpp/src/barretenberg/honk/instance/prover_instance.hpp @@ -114,6 +114,4 @@ extern template class ProverInstance_; extern template class ProverInstance_; extern template class ProverInstance_; -using ProverInstance = ProverInstance_; - } // namespace proof_system::honk \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_prover.cpp b/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_prover.cpp index 4ed4ab33238..58dffe8d323 100644 --- a/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_prover.cpp @@ -1,10 +1,6 @@ #include "protogalaxy_prover.hpp" #include "barretenberg/proof_system/flavor/flavor.hpp" namespace proof_system::honk { -template -ProtoGalaxyProver_::ProtoGalaxyProver_(ProverInstances insts) - : instances(insts) -{} /** * @brief Prior to folding we need to add all the public inputs to the transcript, labelled by their corresponding @@ -51,8 +47,6 @@ ProverFoldingResult ProtoGalaxyProver_>; -// template class ProtoGalaxyProver_; -// template class ProtoGalaxyProver_; -// template class ProtoGalaxyProver_; - +template class ProtoGalaxyProver_>; +template class ProtoGalaxyProver_>; } // namespace proof_system::honk \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_prover.hpp b/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_prover.hpp index c87c088c045..ddc3179a758 100644 --- a/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_prover.hpp +++ b/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_prover.hpp @@ -16,7 +16,8 @@ template class ProtoGalaxyProver_ { ProverTranscript transcript; - explicit ProtoGalaxyProver_(ProverInstances); + ProtoGalaxyProver_(ProverInstances insts) + : instances(insts){}; ~ProtoGalaxyProver_() = default; void prepare_for_folding(); @@ -25,6 +26,6 @@ template class ProtoGalaxyProver_ { }; extern template class ProtoGalaxyProver_>; -// extern template class ProtoGalaxyProver_; -// extern template class ProtoGalaxyProver_; +extern template class ProtoGalaxyProver_>; +extern template class ProtoGalaxyProver_>; } // namespace proof_system::honk \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_verifier.cpp b/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_verifier.cpp index da323281c1e..65aaaba1258 100644 --- a/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_verifier.cpp +++ b/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_verifier.cpp @@ -1,17 +1,6 @@ #include "protogalaxy_verifier.hpp" #include "barretenberg/honk/utils/grand_product_delta.hpp" namespace proof_system::honk { -template -ProtoGalaxyVerifier_::ProtoGalaxyVerifier_(std::vector> vks) -{ - // TODO(https://github.com/AztecProtocol/barretenberg/issues/391): simplify code with C++23 features - for (const auto& vk : vks) { - Instance inst; - inst.verification_key = std::move(vk); - verifier_instances.emplace_back(inst); - } -} - template VerifierFoldingResult ProtoGalaxyVerifier_< VerifierInstances>::fold_public_parameters(std::vector fold_data) @@ -47,6 +36,6 @@ VerifierFoldingResult ProtoGalaxyVerifier_< } template class ProtoGalaxyVerifier_>; -// template class ProtoGalaxyVerifier_; -// template class ProtoGalaxyVerifier_; +template class ProtoGalaxyVerifier_>; +template class ProtoGalaxyVerifier_>; } // namespace proof_system::honk \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_verifier.hpp b/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_verifier.hpp index 68558aaa94b..dbf2984a37d 100644 --- a/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_verifier.hpp +++ b/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_verifier.hpp @@ -18,12 +18,13 @@ template class ProtoGalaxyVerifier_ { VerifierTranscript transcript; // should the PG verifier be given the VerifierInstances, nah this makes sense yo me - explicit ProtoGalaxyVerifier_(std::vector> vks); + ProtoGalaxyVerifier_(VerifierInstances insts) + : verifier_instances(insts){}; ~ProtoGalaxyVerifier_() = default; VerifierFoldingResult fold_public_parameters(std::vector fold_data); }; extern template class ProtoGalaxyVerifier_>; -// extern template class ProtoGalaxyVerifier_; -// extern template class ProtoGalaxyVerifier_; +extern template class ProtoGalaxyVerifier_>; +extern template class ProtoGalaxyVerifier_>; } // namespace proof_system::honk \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/honk/transcript/transcript.test.cpp b/barretenberg/cpp/src/barretenberg/honk/transcript/transcript.test.cpp index 691545e6b18..86804cbbe98 100644 --- a/barretenberg/cpp/src/barretenberg/honk/transcript/transcript.test.cpp +++ b/barretenberg/cpp/src/barretenberg/honk/transcript/transcript.test.cpp @@ -354,9 +354,10 @@ TEST_F(UltraTranscriptTests, FoldingManifestTest) auto composer = UltraComposer(); auto instance_one = composer.create_instance(builder_one); auto instance_two = composer.create_instance(builder_two); - ProverInstances insts; - insts[0] = instance_one; - insts[1] = instance_two; + + std::vector>> insts; + insts.emplace_back(instance_one); + insts.emplace_back(instance_two); auto prover = composer.create_folding_prover(insts); auto verifier = composer.create_folding_verifier(insts); From 02a11a75674fc2a08355629882985ebc570fc7dd Mon Sep 17 00:00:00 2001 From: maramihali Date: Mon, 25 Sep 2023 11:21:15 +0000 Subject: [PATCH 4/4] make gcc happy --- .../cpp/src/barretenberg/honk/composer/ultra_composer.hpp | 4 ++-- .../cpp/src/barretenberg/honk/instance/instances.hpp | 8 ++++---- .../barretenberg/honk/proof_system/protogalaxy_prover.cpp | 6 +++--- .../barretenberg/honk/proof_system/protogalaxy_prover.hpp | 6 +++--- .../honk/proof_system/protogalaxy_verifier.cpp | 6 +++--- .../honk/proof_system/protogalaxy_verifier.hpp | 6 +++--- 6 files changed, 18 insertions(+), 18 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/honk/composer/ultra_composer.hpp b/barretenberg/cpp/src/barretenberg/honk/composer/ultra_composer.hpp index df8bc2e6907..8cf4c27c8aa 100644 --- a/barretenberg/cpp/src/barretenberg/honk/composer/ultra_composer.hpp +++ b/barretenberg/cpp/src/barretenberg/honk/composer/ultra_composer.hpp @@ -25,8 +25,8 @@ template class UltraComposer_ { using Instance = ProverInstance_; static constexpr size_t NUM_FOLDING = 2; - using ProverInstances = ProverInstances; - using VerifierInstances = VerifierInstances; + using ProverInstances = ProverInstances_; + using VerifierInstances = VerifierInstances_; // offset due to placing zero wires at the start of execution trace static constexpr size_t num_zero_rows = Flavor::has_zero_row ? 1 : 0; diff --git a/barretenberg/cpp/src/barretenberg/honk/instance/instances.hpp b/barretenberg/cpp/src/barretenberg/honk/instance/instances.hpp index 2c5c0584c3f..565757ebb86 100644 --- a/barretenberg/cpp/src/barretenberg/honk/instance/instances.hpp +++ b/barretenberg/cpp/src/barretenberg/honk/instance/instances.hpp @@ -3,7 +3,7 @@ #include "barretenberg/honk/instance/verifier_instance.hpp" namespace proof_system::honk { -template struct ProverInstances { +template struct ProverInstances_ { using Flavor = Flavor_; using Instance = ProverInstance_; using ArrayType = std::array, NUM_>; @@ -14,7 +14,7 @@ template struct ProverInstances { Instance const& operator[](size_t idx) const { return _data[idx]; } typename ArrayType::iterator begin() { return _data.begin(); }; typename ArrayType::iterator end() { return _data.end(); }; - ProverInstances(std::vector> data) + ProverInstances_(std::vector> data) { ASSERT(data.size() == NUM); for (size_t idx = 0; idx < data.size(); idx++) { @@ -23,7 +23,7 @@ template struct ProverInstances { }; }; -template struct VerifierInstances { +template struct VerifierInstances_ { using Flavor = Flavor_; using VerificationKey = typename Flavor::VerificationKey; using Instance = VerifierInstance_; @@ -35,7 +35,7 @@ template struct VerifierInstances { Instance const& operator[](size_t idx) const { return _data[idx]; } typename ArrayType::iterator begin() { return _data.begin(); }; typename ArrayType::iterator end() { return _data.end(); }; - VerifierInstances(std::vector> vks) + VerifierInstances_(std::vector> vks) { ASSERT(vks.size() == NUM); for (size_t idx = 0; idx < vks.size(); idx++) { diff --git a/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_prover.cpp b/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_prover.cpp index 58dffe8d323..0fb90be5d06 100644 --- a/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_prover.cpp @@ -46,7 +46,7 @@ ProverFoldingResult ProtoGalaxyProver_>; -template class ProtoGalaxyProver_>; -template class ProtoGalaxyProver_>; +template class ProtoGalaxyProver_>; +template class ProtoGalaxyProver_>; +template class ProtoGalaxyProver_>; } // namespace proof_system::honk \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_prover.hpp b/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_prover.hpp index ddc3179a758..3874e77d7bd 100644 --- a/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_prover.hpp +++ b/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_prover.hpp @@ -25,7 +25,7 @@ template class ProtoGalaxyProver_ { ProverFoldingResult fold_instances(); }; -extern template class ProtoGalaxyProver_>; -extern template class ProtoGalaxyProver_>; -extern template class ProtoGalaxyProver_>; +extern template class ProtoGalaxyProver_>; +extern template class ProtoGalaxyProver_>; +extern template class ProtoGalaxyProver_>; } // namespace proof_system::honk \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_verifier.cpp b/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_verifier.cpp index 65aaaba1258..d9b8393d120 100644 --- a/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_verifier.cpp +++ b/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_verifier.cpp @@ -35,7 +35,7 @@ VerifierFoldingResult ProtoGalaxyVerifier_< return res; } -template class ProtoGalaxyVerifier_>; -template class ProtoGalaxyVerifier_>; -template class ProtoGalaxyVerifier_>; +template class ProtoGalaxyVerifier_>; +template class ProtoGalaxyVerifier_>; +template class ProtoGalaxyVerifier_>; } // namespace proof_system::honk \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_verifier.hpp b/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_verifier.hpp index dbf2984a37d..eeb64a44c0e 100644 --- a/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_verifier.hpp +++ b/barretenberg/cpp/src/barretenberg/honk/proof_system/protogalaxy_verifier.hpp @@ -24,7 +24,7 @@ template class ProtoGalaxyVerifier_ { VerifierFoldingResult fold_public_parameters(std::vector fold_data); }; -extern template class ProtoGalaxyVerifier_>; -extern template class ProtoGalaxyVerifier_>; -extern template class ProtoGalaxyVerifier_>; +extern template class ProtoGalaxyVerifier_>; +extern template class ProtoGalaxyVerifier_>; +extern template class ProtoGalaxyVerifier_>; } // namespace proof_system::honk \ No newline at end of file