From d132a10bc2180b062ab683defe22202648309177 Mon Sep 17 00:00:00 2001 From: lucasxia01 Date: Tue, 19 Mar 2024 15:46:54 +0000 Subject: [PATCH 01/25] moved sorted_polynomials to proving key --- barretenberg/cpp/src/barretenberg/flavor/flavor.hpp | 1 + .../barretenberg/sumcheck/instance/prover_instance.cpp | 8 ++++---- .../barretenberg/sumcheck/instance/prover_instance.hpp | 4 +--- .../sumcheck/instance/prover_instance.test.cpp | 2 +- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp b/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp index fd80d637de5..14d317ca073 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp @@ -109,6 +109,7 @@ class ProvingKey_ : public PrecomputedPolynomials, public WitnessPolynomials { std::vector recursive_proof_public_input_indices; bb::EvaluationDomain evaluation_domain; std::shared_ptr commitment_key; + std::array sorted_polynomials; // offset due to placing zero wires at the start of execution trace // non-zero for Instances constructed from circuits, this concept doesn't exist for accumulated diff --git a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp index 731619b9e50..6d0f9b2e53a 100644 --- a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp +++ b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp @@ -120,13 +120,13 @@ template void ProverInstance_::compute_sorted_list_accumu // Construct s via Horner, i.e. s = s_1 + η(s_2 + η(s_3 + η*s_4)) for (size_t i = 0; i < circuit_size; ++i) { - FF T0 = sorted_polynomials[3][i]; + FF T0 = proving_key->sorted_polynomials[3][i]; T0 *= eta; - T0 += sorted_polynomials[2][i]; + T0 += proving_key->sorted_polynomials[2][i]; T0 *= eta; - T0 += sorted_polynomials[1][i]; + T0 += proving_key->sorted_polynomials[1][i]; T0 *= eta; - T0 += sorted_polynomials[0][i]; + T0 += proving_key->sorted_polynomials[0][i]; sorted_list_accumulator[i] = T0; } proving_key->sorted_accum = sorted_list_accumulator.share(); diff --git a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp index 4a40250fd6f..7edcec02819 100644 --- a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp +++ b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp @@ -33,8 +33,6 @@ template class ProverInstance_ { std::shared_ptr proving_key; ProverPolynomials prover_polynomials; - std::array sorted_polynomials; - RelationSeparator alphas; bb::RelationParameters relation_parameters; @@ -69,7 +67,7 @@ template class ProverInstance_ { construct_table_polynomials(circuit, dyadic_circuit_size); - sorted_polynomials = construct_sorted_list_polynomials(circuit, dyadic_circuit_size); + proving_key->sorted_polynomials = construct_sorted_list_polynomials(circuit, dyadic_circuit_size); std::span public_wires_source = proving_key->w_r; diff --git a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.test.cpp b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.test.cpp index 2f9d5fa18a4..9d243b9c528 100644 --- a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.test.cpp +++ b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.test.cpp @@ -60,7 +60,7 @@ template class InstanceTests : public testing::Test { // Get random challenge eta auto eta = FF::random_element(); - auto sorted_list_polynomials = instance.sorted_polynomials; + auto sorted_list_polynomials = instance.proving_key->sorted_polynomials; // Method 1: computed sorted list accumulator polynomial using prover library method instance.compute_sorted_list_accumulator(eta); From eec17c630210427157b0e3f67e18dd9c74e618a1 Mon Sep 17 00:00:00 2001 From: lucasxia01 Date: Wed, 20 Mar 2024 18:48:24 +0000 Subject: [PATCH 02/25] make prover polys constructor from proving key --- .../cpp/src/barretenberg/flavor/goblin_ultra.hpp | 11 +++++++++++ barretenberg/cpp/src/barretenberg/flavor/ultra.hpp | 11 +++++++++++ .../sumcheck/instance/prover_instance.cpp | 11 ++--------- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp b/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp index 39f9529314a..0e351c4b3fe 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp @@ -344,6 +344,17 @@ class GoblinUltraFlavor { */ class ProverPolynomials : public AllEntities { public: + ProverPolynomials(std::shared_ptr& proving_key) + { + for (auto [prover_poly, key_poly] : zip_view(this->get_unshifted(), proving_key->get_all())) { + ASSERT(flavor_get_label(*this, prover_poly) == flavor_get_label(*proving_key, key_poly)); + prover_poly = key_poly.share(); + } + for (auto [prover_poly, key_poly] : zip_view(this->get_shifted(), proving_key->get_to_be_shifted())) { + ASSERT(flavor_get_label(*this, prover_poly) == (flavor_get_label(*proving_key, key_poly) + "_shift")); + prover_poly = key_poly.shifted(); + } + } // Define all operations as default, except move construction/assignment ProverPolynomials() = default; ProverPolynomials& operator=(const ProverPolynomials&) = delete; diff --git a/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp b/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp index 32a3a627bea..ce1edc08a17 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp @@ -320,6 +320,17 @@ class UltraFlavor { */ class ProverPolynomials : public AllEntities { public: + ProverPolynomials(std::shared_ptr& proving_key) + { + for (auto [prover_poly, key_poly] : zip_view(this->get_unshifted(), proving_key->get_all())) { + ASSERT(flavor_get_label(*this, prover_poly) == flavor_get_label(*proving_key, key_poly)); + prover_poly = key_poly.share(); + } + for (auto [prover_poly, key_poly] : zip_view(this->get_shifted(), proving_key->get_to_be_shifted())) { + ASSERT(flavor_get_label(*this, prover_poly) == (flavor_get_label(*proving_key, key_poly) + "_shift")); + prover_poly = key_poly.shifted(); + } + } // Define all operations as default, except move construction/assignment ProverPolynomials() = default; ProverPolynomials& operator=(const ProverPolynomials&) = delete; diff --git a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp index 6d0f9b2e53a..98df38e9d1d 100644 --- a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp +++ b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp @@ -76,15 +76,8 @@ void ProverInstance_::construct_table_polynomials(Circuit& circuit, size template void ProverInstance_::initialize_prover_polynomials() { - for (auto [prover_poly, key_poly] : zip_view(prover_polynomials.get_unshifted(), proving_key->get_all())) { - ASSERT(flavor_get_label(prover_polynomials, prover_poly) == flavor_get_label(*proving_key, key_poly)); - prover_poly = key_poly.share(); - } - for (auto [prover_poly, key_poly] : zip_view(prover_polynomials.get_shifted(), proving_key->get_to_be_shifted())) { - ASSERT(flavor_get_label(prover_polynomials, prover_poly) == - (flavor_get_label(*proving_key, key_poly) + "_shift")); - prover_poly = key_poly.shifted(); - } + ProverPolynomials prover_polys(proving_key); + prover_polynomials = std::move(prover_polys); } template void ProverInstance_::compute_sorted_accumulator_polynomials(FF eta) From 45c5ee20f34ece1908e54b91689a408fc4b0ecae Mon Sep 17 00:00:00 2001 From: lucasxia01 Date: Wed, 20 Mar 2024 19:19:00 +0000 Subject: [PATCH 03/25] eliminated initialize_prover_polynomials --- .../cpp/src/barretenberg/protogalaxy/protogalaxy.test.cpp | 2 +- .../src/barretenberg/sumcheck/instance/prover_instance.cpp | 6 ------ .../src/barretenberg/sumcheck/instance/prover_instance.hpp | 2 -- .../cpp/src/barretenberg/ultra_honk/oink_prover.hpp | 2 +- .../barretenberg/ultra_honk/relation_correctness.test.cpp | 4 ++-- .../cpp/src/barretenberg/ultra_honk/sumcheck.test.cpp | 4 ++-- 6 files changed, 6 insertions(+), 14 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy.test.cpp b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy.test.cpp index b013f2e17cf..fdf0423d5cb 100644 --- a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy.test.cpp +++ b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy.test.cpp @@ -117,7 +117,7 @@ template class ProtoGalaxyTests : public testing::Test { construct_circuit(builder); auto instance = std::make_shared(builder); - instance->initialize_prover_polynomials(); + instance->prover_polynomials = ProverPolynomials(instance->proving_key); auto eta = FF::random_element(); auto beta = FF::random_element(); diff --git a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp index 98df38e9d1d..1e9a6f7821c 100644 --- a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp +++ b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp @@ -74,12 +74,6 @@ void ProverInstance_::construct_table_polynomials(Circuit& circuit, size proving_key->table_4 = table_polynomials[3].share(); } -template void ProverInstance_::initialize_prover_polynomials() -{ - ProverPolynomials prover_polys(proving_key); - prover_polynomials = std::move(prover_polys); -} - template void ProverInstance_::compute_sorted_accumulator_polynomials(FF eta) { relation_parameters.eta = eta; diff --git a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp index 7edcec02819..bc55438dd78 100644 --- a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp +++ b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp @@ -86,8 +86,6 @@ template class ProverInstance_ { ProverInstance_() = default; ~ProverInstance_() = default; - void initialize_prover_polynomials(); - void compute_sorted_accumulator_polynomials(FF); void compute_sorted_list_accumulator(FF); diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.hpp b/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.hpp index f113589314e..91b011c32e8 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.hpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.hpp @@ -57,7 +57,7 @@ template class OinkProver { , commitment_key(commitment_key) , domain_separator(std::move(domain_separator)) { - instance->initialize_prover_polynomials(); + instance->prover_polynomials = typename Flavor::ProverPolynomials(instance->proving_key); } void execute_preamble_round(); diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/relation_correctness.test.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/relation_correctness.test.cpp index 848d5144c0e..e708bfb7b40 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/relation_correctness.test.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/relation_correctness.test.cpp @@ -271,7 +271,7 @@ TEST_F(RelationCorrectnessTests, UltraRelationCorrectness) FF beta = FF::random_element(); FF gamma = FF::random_element(); - instance->initialize_prover_polynomials(); + instance->prover_polynomials = Flavor::ProverPolynomials(instance->proving_key); instance->compute_sorted_accumulator_polynomials(eta); instance->compute_grand_product_polynomials(beta, gamma); @@ -323,7 +323,7 @@ TEST_F(RelationCorrectnessTests, GoblinUltraRelationCorrectness) FF beta = FF::random_element(); FF gamma = FF::random_element(); - instance->initialize_prover_polynomials(); + instance->prover_polynomials = Flavor::ProverPolynomials(instance->proving_key); instance->compute_sorted_accumulator_polynomials(eta); instance->compute_logderivative_inverse(beta, gamma); instance->compute_grand_product_polynomials(beta, gamma); diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/sumcheck.test.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/sumcheck.test.cpp index 69b3285d9d6..36dae25f507 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/sumcheck.test.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/sumcheck.test.cpp @@ -147,14 +147,14 @@ TEST_F(SumcheckTestsRealCircuit, Ultra) false); // Create a prover (it will compute proving key and witness) - auto instance = std::make_shared>(builder); + auto instance = std::make_shared>(builder); // Generate eta, beta and gamma FF eta = FF::random_element(); FF beta = FF::random_element(); FF gamma = FF::random_element(); - instance->initialize_prover_polynomials(); + instance->prover_polynomials = Flavor::ProverPolynomials(instance->proving_key); instance->compute_sorted_accumulator_polynomials(eta); instance->compute_grand_product_polynomials(beta, gamma); From 810d369ae9ac38761ea8b1b02b3dadb63da1a3b1 Mon Sep 17 00:00:00 2001 From: lucasxia01 Date: Wed, 20 Mar 2024 19:45:36 +0000 Subject: [PATCH 04/25] moved compute_sorted_list_accumulator to proving_key --- .../cpp/src/barretenberg/flavor/flavor.hpp | 31 ++++++++++++++++ .../sumcheck/instance/prover_instance.cpp | 37 ++----------------- .../sumcheck/instance/prover_instance.hpp | 2 - .../instance/prover_instance.test.cpp | 2 +- 4 files changed, 35 insertions(+), 37 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp b/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp index 14d317ca073..9874d7cfe73 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp @@ -146,6 +146,37 @@ class ProvingKey_ : public PrecomputedPolynomials, public WitnessPolynomials { poly = Polynomial(circuit_size); } }; + + /** + * @brief Construct sorted list accumulator polynomial 's'. + * + * @details Compute s = s_1 + η*s_2 + η²*s_3 + η³*s_4 (via Horner) where s_i are the + * sorted concatenated witness/table polynomials + * + * @param key proving key + * @param sorted_list_polynomials sorted concatenated witness/table polynomials + * @param eta random challenge + * @return Polynomial + */ + void compute_sorted_list_accumulator(FF eta) + { + const size_t circuit_size = this->circuit_size; + + auto sorted_list_accumulator = Polynomial{ circuit_size }; + + // Construct s via Horner, i.e. s = s_1 + η(s_2 + η(s_3 + η*s_4)) + for (size_t i = 0; i < circuit_size; ++i) { + FF T0 = this->sorted_polynomials[3][i]; + T0 *= eta; + T0 += this->sorted_polynomials[2][i]; + T0 *= eta; + T0 += this->sorted_polynomials[1][i]; + T0 *= eta; + T0 += this->sorted_polynomials[0][i]; + sorted_list_accumulator[i] = T0; + } + this->sorted_accum = sorted_list_accumulator.share(); + } }; /** diff --git a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp index 1e9a6f7821c..a5291d981ab 100644 --- a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp +++ b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp @@ -78,47 +78,16 @@ template void ProverInstance_::compute_sorted_accumulator { relation_parameters.eta = eta; // Compute sorted witness-table accumulator - compute_sorted_list_accumulator(eta); - prover_polynomials.sorted_accum = proving_key->sorted_accum.share(); + proving_key->compute_sorted_list_accumulator(eta); + proving_key->sorted_accum = proving_key->sorted_accum.share(); prover_polynomials.sorted_accum_shift = proving_key->sorted_accum.shifted(); // Finalize fourth wire polynomial by adding lookup memory records add_plookup_memory_records_to_wire_4(eta); - prover_polynomials.w_4 = proving_key->w_4.share(); + proving_key->w_4 = proving_key->w_4.share(); prover_polynomials.w_4_shift = proving_key->w_4.shifted(); } -/** - * @brief Construct sorted list accumulator polynomial 's'. - * - * @details Compute s = s_1 + η*s_2 + η²*s_3 + η³*s_4 (via Horner) where s_i are the - * sorted concatenated witness/table polynomials - * - * @param key proving key - * @param sorted_list_polynomials sorted concatenated witness/table polynomials - * @param eta random challenge - * @return Polynomial - */ -template void ProverInstance_::compute_sorted_list_accumulator(FF eta) -{ - const size_t circuit_size = proving_key->circuit_size; - - auto sorted_list_accumulator = Polynomial{ circuit_size }; - - // Construct s via Horner, i.e. s = s_1 + η(s_2 + η(s_3 + η*s_4)) - for (size_t i = 0; i < circuit_size; ++i) { - FF T0 = proving_key->sorted_polynomials[3][i]; - T0 *= eta; - T0 += proving_key->sorted_polynomials[2][i]; - T0 *= eta; - T0 += proving_key->sorted_polynomials[1][i]; - T0 *= eta; - T0 += proving_key->sorted_polynomials[0][i]; - sorted_list_accumulator[i] = T0; - } - proving_key->sorted_accum = sorted_list_accumulator.share(); -} - /** * @brief Add plookup memory records to the fourth wire polynomial * diff --git a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp index bc55438dd78..2aeb66058a5 100644 --- a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp +++ b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp @@ -88,8 +88,6 @@ template class ProverInstance_ { void compute_sorted_accumulator_polynomials(FF); - void compute_sorted_list_accumulator(FF); - void compute_logderivative_inverse(FF, FF) requires IsGoblinFlavor; diff --git a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.test.cpp b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.test.cpp index 9d243b9c528..78f87455419 100644 --- a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.test.cpp +++ b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.test.cpp @@ -63,7 +63,7 @@ template class InstanceTests : public testing::Test { auto sorted_list_polynomials = instance.proving_key->sorted_polynomials; // Method 1: computed sorted list accumulator polynomial using prover library method - instance.compute_sorted_list_accumulator(eta); + instance.proving_key->compute_sorted_list_accumulator(eta); auto sorted_list_accumulator = instance.proving_key->sorted_accum; // Method 2: Compute local sorted list accumulator simply and inefficiently From e76c972cf90ffd8915445b28689b4ef67ecf1001 Mon Sep 17 00:00:00 2001 From: lucasxia01 Date: Wed, 20 Mar 2024 20:14:10 +0000 Subject: [PATCH 05/25] test fix --- .../src/barretenberg/sumcheck/instance/prover_instance.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp index a5291d981ab..af4496bede1 100644 --- a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp +++ b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp @@ -79,12 +79,12 @@ template void ProverInstance_::compute_sorted_accumulator relation_parameters.eta = eta; // Compute sorted witness-table accumulator proving_key->compute_sorted_list_accumulator(eta); - proving_key->sorted_accum = proving_key->sorted_accum.share(); + prover_polynomials.sorted_accum = proving_key->sorted_accum.share(); prover_polynomials.sorted_accum_shift = proving_key->sorted_accum.shifted(); // Finalize fourth wire polynomial by adding lookup memory records add_plookup_memory_records_to_wire_4(eta); - proving_key->w_4 = proving_key->w_4.share(); + prover_polynomials.w_4 = proving_key->w_4.share(); prover_polynomials.w_4_shift = proving_key->w_4.shifted(); } From 6078832c386416541d7c6c7b4163f69099cf9eda Mon Sep 17 00:00:00 2001 From: lucasxia01 Date: Wed, 20 Mar 2024 20:30:57 +0000 Subject: [PATCH 06/25] moved compute_sorted_accumulator_polynomials and made updates to relation_parameters --- .../cpp/src/barretenberg/flavor/flavor.hpp | 31 -------- .../src/barretenberg/flavor/goblin_ultra.hpp | 78 +++++++++++++++++++ .../cpp/src/barretenberg/flavor/ultra.hpp | 78 +++++++++++++++++++ .../protogalaxy/protogalaxy.test.cpp | 17 ++-- .../sumcheck/instance/prover_instance.cpp | 52 ------------- .../sumcheck/instance/prover_instance.hpp | 4 - .../barretenberg/ultra_honk/oink_prover.cpp | 4 +- .../ultra_honk/relation_correctness.test.cpp | 24 +++--- .../barretenberg/ultra_honk/sumcheck.test.cpp | 11 +-- 9 files changed, 187 insertions(+), 112 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp b/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp index 9874d7cfe73..14d317ca073 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp @@ -146,37 +146,6 @@ class ProvingKey_ : public PrecomputedPolynomials, public WitnessPolynomials { poly = Polynomial(circuit_size); } }; - - /** - * @brief Construct sorted list accumulator polynomial 's'. - * - * @details Compute s = s_1 + η*s_2 + η²*s_3 + η³*s_4 (via Horner) where s_i are the - * sorted concatenated witness/table polynomials - * - * @param key proving key - * @param sorted_list_polynomials sorted concatenated witness/table polynomials - * @param eta random challenge - * @return Polynomial - */ - void compute_sorted_list_accumulator(FF eta) - { - const size_t circuit_size = this->circuit_size; - - auto sorted_list_accumulator = Polynomial{ circuit_size }; - - // Construct s via Horner, i.e. s = s_1 + η(s_2 + η(s_3 + η*s_4)) - for (size_t i = 0; i < circuit_size; ++i) { - FF T0 = this->sorted_polynomials[3][i]; - T0 *= eta; - T0 += this->sorted_polynomials[2][i]; - T0 *= eta; - T0 += this->sorted_polynomials[1][i]; - T0 *= eta; - T0 += this->sorted_polynomials[0][i]; - sorted_list_accumulator[i] = T0; - } - this->sorted_accum = sorted_list_accumulator.share(); - } }; /** diff --git a/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp b/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp index 0e351c4b3fe..e54935007f6 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp @@ -276,6 +276,84 @@ class GoblinUltraFlavor { }; // The plookup wires that store plookup read data. auto get_table_column_wires() { return RefArray{ w_l, w_r, w_o }; }; + + /** + * @brief Construct sorted list accumulator polynomial 's'. + * + * @details Compute s = s_1 + η*s_2 + η²*s_3 + η³*s_4 (via Horner) where s_i are the + * sorted concatenated witness/table polynomials + * + * @param key proving key + * @param sorted_list_polynomials sorted concatenated witness/table polynomials + * @param eta random challenge + * @return Polynomial + */ + void compute_sorted_list_accumulator(FF eta) + { + const size_t circuit_size = this->circuit_size; + + auto sorted_list_accumulator = Polynomial{ circuit_size }; + + // Construct s via Horner, i.e. s = s_1 + η(s_2 + η(s_3 + η*s_4)) + for (size_t i = 0; i < circuit_size; ++i) { + FF T0 = this->sorted_polynomials[3][i]; + T0 *= eta; + T0 += this->sorted_polynomials[2][i]; + T0 *= eta; + T0 += this->sorted_polynomials[1][i]; + T0 *= eta; + T0 += this->sorted_polynomials[0][i]; + sorted_list_accumulator[i] = T0; + } + this->sorted_accum = sorted_list_accumulator.share(); + } + + void compute_sorted_accumulator_polynomials(FF eta) + { + // Compute sorted witness-table accumulator + this->compute_sorted_list_accumulator(eta); + + // Finalize fourth wire polynomial by adding lookup memory records + add_plookup_memory_records_to_wire_4(eta); + } + + /** + * @brief Add plookup memory records to the fourth wire polynomial + * + * @details This operation must be performed after the first three wires have been committed to, hence the + * dependence on the `eta` challenge. + * + * @tparam Flavor + * @param eta challenge produced after commitment to first three wire polynomials + */ + void add_plookup_memory_records_to_wire_4(FF eta) + { + // The plookup memory record values are computed at the indicated indices as + // w4 = w3 * eta^3 + w2 * eta^2 + w1 * eta + read_write_flag; + // (See plookup_auxiliary_widget.hpp for details) + auto wires = this->get_wires(); + + // Compute read record values + for (const auto& gate_idx : this->memory_read_records) { + wires[3][gate_idx] += wires[2][gate_idx]; + wires[3][gate_idx] *= eta; + wires[3][gate_idx] += wires[1][gate_idx]; + wires[3][gate_idx] *= eta; + wires[3][gate_idx] += wires[0][gate_idx]; + wires[3][gate_idx] *= eta; + } + + // Compute write record values + for (const auto& gate_idx : this->memory_write_records) { + wires[3][gate_idx] += wires[2][gate_idx]; + wires[3][gate_idx] *= eta; + wires[3][gate_idx] += wires[1][gate_idx]; + wires[3][gate_idx] *= eta; + wires[3][gate_idx] += wires[0][gate_idx]; + wires[3][gate_idx] *= eta; + wires[3][gate_idx] += 1; + } + } }; /** diff --git a/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp b/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp index ce1edc08a17..0c06582e5b9 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp @@ -280,6 +280,84 @@ class UltraFlavor { }; // The plookup wires that store plookup read data. auto get_table_column_wires() { return RefArray{ w_l, w_r, w_o }; }; + + /** + * @brief Construct sorted list accumulator polynomial 's'. + * + * @details Compute s = s_1 + η*s_2 + η²*s_3 + η³*s_4 (via Horner) where s_i are the + * sorted concatenated witness/table polynomials + * + * @param key proving key + * @param sorted_list_polynomials sorted concatenated witness/table polynomials + * @param eta random challenge + * @return Polynomial + */ + void compute_sorted_list_accumulator(FF eta) + { + const size_t circuit_size = this->circuit_size; + + auto sorted_list_accumulator = Polynomial{ circuit_size }; + + // Construct s via Horner, i.e. s = s_1 + η(s_2 + η(s_3 + η*s_4)) + for (size_t i = 0; i < circuit_size; ++i) { + FF T0 = this->sorted_polynomials[3][i]; + T0 *= eta; + T0 += this->sorted_polynomials[2][i]; + T0 *= eta; + T0 += this->sorted_polynomials[1][i]; + T0 *= eta; + T0 += this->sorted_polynomials[0][i]; + sorted_list_accumulator[i] = T0; + } + this->sorted_accum = sorted_list_accumulator.share(); + } + + void compute_sorted_accumulator_polynomials(FF eta) + { + // Compute sorted witness-table accumulator + this->compute_sorted_list_accumulator(eta); + + // Finalize fourth wire polynomial by adding lookup memory records + add_plookup_memory_records_to_wire_4(eta); + } + + /** + * @brief Add plookup memory records to the fourth wire polynomial + * + * @details This operation must be performed after the first three wires have been committed to, hence the + * dependence on the `eta` challenge. + * + * @tparam Flavor + * @param eta challenge produced after commitment to first three wire polynomials + */ + void add_plookup_memory_records_to_wire_4(FF eta) + { + // The plookup memory record values are computed at the indicated indices as + // w4 = w3 * eta^3 + w2 * eta^2 + w1 * eta + read_write_flag; + // (See plookup_auxiliary_widget.hpp for details) + auto wires = this->get_wires(); + + // Compute read record values + for (const auto& gate_idx : this->memory_read_records) { + wires[3][gate_idx] += wires[2][gate_idx]; + wires[3][gate_idx] *= eta; + wires[3][gate_idx] += wires[1][gate_idx]; + wires[3][gate_idx] *= eta; + wires[3][gate_idx] += wires[0][gate_idx]; + wires[3][gate_idx] *= eta; + } + + // Compute write record values + for (const auto& gate_idx : this->memory_write_records) { + wires[3][gate_idx] += wires[2][gate_idx]; + wires[3][gate_idx] *= eta; + wires[3][gate_idx] += wires[1][gate_idx]; + wires[3][gate_idx] *= eta; + wires[3][gate_idx] += wires[0][gate_idx]; + wires[3][gate_idx] *= eta; + wires[3][gate_idx] += 1; + } + } }; /** diff --git a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy.test.cpp b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy.test.cpp index fdf0423d5cb..0bb48697d66 100644 --- a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy.test.cpp +++ b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy.test.cpp @@ -117,16 +117,19 @@ template class ProtoGalaxyTests : public testing::Test { construct_circuit(builder); auto instance = std::make_shared(builder); - instance->prover_polynomials = ProverPolynomials(instance->proving_key); - auto eta = FF::random_element(); - auto beta = FF::random_element(); - auto gamma = FF::random_element(); - instance->compute_sorted_accumulator_polynomials(eta); + instance->relation_parameters.eta = FF::random_element(); + instance->relation_parameters.beta = FF::random_element(); + instance->relation_parameters.gamma = FF::random_element(); + + instance->proving_key->compute_sorted_accumulator_polynomials(instance->relation_parameters.eta); + instance->prover_polynomials = ProverPolynomials(instance->proving_key); if constexpr (IsGoblinFlavor) { - instance->compute_logderivative_inverse(beta, gamma); + instance->compute_logderivative_inverse(instance->relation_parameters.beta, + instance->relation_parameters.gamma); } - instance->compute_grand_product_polynomials(beta, gamma); + instance->compute_grand_product_polynomials(instance->relation_parameters.beta, + instance->relation_parameters.gamma); for (auto& alpha : instance->alphas) { alpha = FF::random_element(); diff --git a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp index af4496bede1..30f9a419dda 100644 --- a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp +++ b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp @@ -74,58 +74,6 @@ void ProverInstance_::construct_table_polynomials(Circuit& circuit, size proving_key->table_4 = table_polynomials[3].share(); } -template void ProverInstance_::compute_sorted_accumulator_polynomials(FF eta) -{ - relation_parameters.eta = eta; - // Compute sorted witness-table accumulator - proving_key->compute_sorted_list_accumulator(eta); - prover_polynomials.sorted_accum = proving_key->sorted_accum.share(); - prover_polynomials.sorted_accum_shift = proving_key->sorted_accum.shifted(); - - // Finalize fourth wire polynomial by adding lookup memory records - add_plookup_memory_records_to_wire_4(eta); - prover_polynomials.w_4 = proving_key->w_4.share(); - prover_polynomials.w_4_shift = proving_key->w_4.shifted(); -} - -/** - * @brief Add plookup memory records to the fourth wire polynomial - * - * @details This operation must be performed after the first three wires have been committed to, hence the dependence on - * the `eta` challenge. - * - * @tparam Flavor - * @param eta challenge produced after commitment to first three wire polynomials - */ -template void ProverInstance_::add_plookup_memory_records_to_wire_4(FF eta) -{ - // The plookup memory record values are computed at the indicated indices as - // w4 = w3 * eta^3 + w2 * eta^2 + w1 * eta + read_write_flag; - // (See plookup_auxiliary_widget.hpp for details) - auto wires = proving_key->get_wires(); - - // Compute read record values - for (const auto& gate_idx : proving_key->memory_read_records) { - wires[3][gate_idx] += wires[2][gate_idx]; - wires[3][gate_idx] *= eta; - wires[3][gate_idx] += wires[1][gate_idx]; - wires[3][gate_idx] *= eta; - wires[3][gate_idx] += wires[0][gate_idx]; - wires[3][gate_idx] *= eta; - } - - // Compute write record values - for (const auto& gate_idx : proving_key->memory_write_records) { - wires[3][gate_idx] += wires[2][gate_idx]; - wires[3][gate_idx] *= eta; - wires[3][gate_idx] += wires[1][gate_idx]; - wires[3][gate_idx] *= eta; - wires[3][gate_idx] += wires[0][gate_idx]; - wires[3][gate_idx] *= eta; - wires[3][gate_idx] += 1; - } -} - /** * @brief Compute the inverse polynomial used in the log derivative lookup argument * diff --git a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp index 2aeb66058a5..a42e56f958c 100644 --- a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp +++ b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp @@ -86,8 +86,6 @@ template class ProverInstance_ { ProverInstance_() = default; ~ProverInstance_() = default; - void compute_sorted_accumulator_polynomials(FF); - void compute_logderivative_inverse(FF, FF) requires IsGoblinFlavor; @@ -107,8 +105,6 @@ template class ProverInstance_ { requires IsGoblinFlavor; void construct_table_polynomials(Circuit&, size_t); - - void add_plookup_memory_records_to_wire_4(FF); }; } // namespace bb diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp index 9f140c5815c..27c98b0bf39 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp @@ -70,8 +70,8 @@ template void OinkProver::execute_wire_commitment template void OinkProver::execute_sorted_list_accumulator_round() { - auto eta = transcript->template get_challenge(domain_separator + "eta"); - instance->compute_sorted_accumulator_polynomials(eta); + instance->relation_parameters.eta = transcript->template get_challenge(domain_separator + "eta"); + instance->proving_key->compute_sorted_accumulator_polynomials(instance->relation_parameters.eta); // Commit to the sorted witness-table accumulator and the finalized (i.e. with memory records) fourth wire // polynomial diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/relation_correctness.test.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/relation_correctness.test.cpp index e708bfb7b40..c773ba082f2 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/relation_correctness.test.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/relation_correctness.test.cpp @@ -267,13 +267,14 @@ TEST_F(RelationCorrectnessTests, UltraRelationCorrectness) auto circuit_size = proving_key->circuit_size; // Generate eta, beta and gamma - FF eta = FF::random_element(); - FF beta = FF::random_element(); - FF gamma = FF::random_element(); + instance->relation_parameters.eta = FF::random_element(); + instance->relation_parameters.beta = FF::random_element(); + instance->relation_parameters.gamma = FF::random_element(); + instance->proving_key->compute_sorted_accumulator_polynomials(instance->relation_parameters.eta); instance->prover_polynomials = Flavor::ProverPolynomials(instance->proving_key); - instance->compute_sorted_accumulator_polynomials(eta); - instance->compute_grand_product_polynomials(beta, gamma); + instance->compute_grand_product_polynomials(instance->relation_parameters.beta, + instance->relation_parameters.gamma); // Check that selectors are nonzero to ensure corresponding relation has nontrivial contribution ensure_non_zero(proving_key->q_arith); @@ -319,14 +320,15 @@ TEST_F(RelationCorrectnessTests, GoblinUltraRelationCorrectness) auto circuit_size = proving_key->circuit_size; // Generate eta, beta and gamma - FF eta = FF::random_element(); - FF beta = FF::random_element(); - FF gamma = FF::random_element(); + instance->relation_parameters.eta = FF::random_element(); + instance->relation_parameters.beta = FF::random_element(); + instance->relation_parameters.gamma = FF::random_element(); + instance->proving_key->compute_sorted_accumulator_polynomials(instance->relation_parameters.eta); instance->prover_polynomials = Flavor::ProverPolynomials(instance->proving_key); - instance->compute_sorted_accumulator_polynomials(eta); - instance->compute_logderivative_inverse(beta, gamma); - instance->compute_grand_product_polynomials(beta, gamma); + instance->compute_logderivative_inverse(instance->relation_parameters.beta, instance->relation_parameters.gamma); + instance->compute_grand_product_polynomials(instance->relation_parameters.beta, + instance->relation_parameters.gamma); // Check that selectors are nonzero to ensure corresponding relation has nontrivial contribution ensure_non_zero(proving_key->q_arith); diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/sumcheck.test.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/sumcheck.test.cpp index 36dae25f507..60e37c9940c 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/sumcheck.test.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/sumcheck.test.cpp @@ -150,13 +150,14 @@ TEST_F(SumcheckTestsRealCircuit, Ultra) auto instance = std::make_shared>(builder); // Generate eta, beta and gamma - FF eta = FF::random_element(); - FF beta = FF::random_element(); - FF gamma = FF::random_element(); + instance->relation_parameters.eta = FF::random_element(); + instance->relation_parameters.beta = FF::random_element(); + instance->relation_parameters.gamma = FF::random_element(); + instance->proving_key->compute_sorted_accumulator_polynomials(instance->relation_parameters.eta); instance->prover_polynomials = Flavor::ProverPolynomials(instance->proving_key); - instance->compute_sorted_accumulator_polynomials(eta); - instance->compute_grand_product_polynomials(beta, gamma); + instance->compute_grand_product_polynomials(instance->relation_parameters.beta, + instance->relation_parameters.gamma); auto prover_transcript = Transcript::prover_init_empty(); auto circuit_size = instance->proving_key->circuit_size; From b0855d51a48f88ffeeef00540e80398f5afbaec5 Mon Sep 17 00:00:00 2001 From: lucasxia01 Date: Wed, 20 Mar 2024 21:35:45 +0000 Subject: [PATCH 07/25] test fix (prover polys wasn't being updated correctly) --- barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp index 27c98b0bf39..ec791463e65 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp @@ -72,7 +72,10 @@ template void OinkProver::execute_sorted_list_acc instance->relation_parameters.eta = transcript->template get_challenge(domain_separator + "eta"); instance->proving_key->compute_sorted_accumulator_polynomials(instance->relation_parameters.eta); - + instance->prover_polynomials.sorted_accum = instance->proving_key->sorted_accum.share(); + instance->prover_polynomials.sorted_accum_shift = instance->proving_key->sorted_accum.shifted(); + instance->prover_polynomials.w_4 = instance->proving_key->w_4.share(); + instance->prover_polynomials.w_4_shift = instance->proving_key->w_4.shifted(); // Commit to the sorted witness-table accumulator and the finalized (i.e. with memory records) fourth wire // polynomial witness_commitments.sorted_accum = commitment_key->commit(instance->proving_key->sorted_accum); From f4aa9799955ebc499245ef3b2a93dce905c42ce5 Mon Sep 17 00:00:00 2001 From: lucasxia01 Date: Thu, 21 Mar 2024 19:13:29 +0000 Subject: [PATCH 08/25] add OinkProverOutput and make one prove() function --- .../protogalaxy/protogalaxy_prover.cpp | 17 ++------ .../sumcheck/instance/prover_instance.cpp | 6 ++- .../barretenberg/ultra_honk/oink_prover.cpp | 42 ++++++++++++++++--- .../barretenberg/ultra_honk/oink_prover.hpp | 6 +++ .../barretenberg/ultra_honk/ultra_prover.cpp | 17 ++------ 5 files changed, 53 insertions(+), 35 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.cpp b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.cpp index cb2df2fb6e2..146a7e9911d 100644 --- a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.cpp @@ -8,20 +8,9 @@ void ProtoGalaxyProver_::finalise_and_send_instance(std::shared { OinkProver oink_prover(instance, commitment_key, transcript, domain_separator + '_'); - // Add circuit size public input size and public inputs to transcript - oink_prover.execute_preamble_round(); - - // Compute first three wire commitments - oink_prover.execute_wire_commitments_round(); - - // Compute sorted list accumulator and commitment - oink_prover.execute_sorted_list_accumulator_round(); - - // Fiat-Shamir: beta & gamma - oink_prover.execute_log_derivative_inverse_round(); - - // Compute grand product(s) and commitments. - oink_prover.execute_grand_product_computation_round(); + auto [relation_params] = oink_prover.prove(); + instance->relation_parameters = std::move(relation_params); + // instance->prover_polynomials = ProverPolynomials(instance->proving_key); // Generate relation separators alphas for sumcheck for (size_t idx = 0; idx < NUM_SUBRELATIONS - 1; idx++) { diff --git a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp index 30f9a419dda..8987736e339 100644 --- a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp +++ b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp @@ -87,10 +87,11 @@ void ProverInstance_::compute_logderivative_inverse(FF beta, FF gamma) { relation_parameters.beta = beta; relation_parameters.gamma = gamma; - + // prover_polynomials = ProverPolynomials(proving_key); // Compute permutation and lookup grand product polynomials bb::compute_logderivative_inverse( prover_polynomials, relation_parameters, proving_key->circuit_size); + // proving_key->lookup_inverses = prover_polynomials.lookup_inverses; } template void ProverInstance_::compute_grand_product_polynomials(FF beta, FF gamma) @@ -104,7 +105,10 @@ template void ProverInstance_::compute_grand_product_poly relation_parameters.lookup_grand_product_delta = lookup_grand_product_delta; // Compute permutation and lookup grand product polynomials + // prover_polynomials = ProverPolynomials(proving_key); compute_grand_products(proving_key, prover_polynomials, relation_parameters); + // proving_key->z_perm = prover_polynomials.z_perm; + // proving_key->z_lookup = prover_polynomials.z_lookup; } template class ProverInstance_; diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp index ec791463e65..dbfc0755921 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp @@ -2,6 +2,34 @@ namespace bb { +/** + * @brief Oink Prover function that runs all the rounds of the verifier + * @details Returns the witness commitments and relation_parameters + * @tparam Flavor + * @return OinkProverOutput + */ +template OinkProverOutput OinkProver::prove() +{ + // Add circuit size public input size and public inputs to transcript-> + execute_preamble_round(); + + // Compute first three wire commitments + execute_wire_commitments_round(); + + // Compute sorted list accumulator and commitment + execute_sorted_list_accumulator_round(); + + // Fiat-Shamir: beta & gamma + execute_log_derivative_inverse_round(); + + // Compute grand product(s) and commitments. + execute_grand_product_computation_round(); + + return OinkProverOutput{ + .relation_parameters = std::move(relation_parameters), + }; +} + /** * @brief Add circuit size, public input size, and public inputs to transcript * @@ -70,8 +98,9 @@ template void OinkProver::execute_wire_commitment template void OinkProver::execute_sorted_list_accumulator_round() { - instance->relation_parameters.eta = transcript->template get_challenge(domain_separator + "eta"); - instance->proving_key->compute_sorted_accumulator_polynomials(instance->relation_parameters.eta); + relation_parameters.eta = transcript->template get_challenge(domain_separator + "eta"); + instance->relation_parameters.eta = relation_parameters.eta; + instance->proving_key->compute_sorted_accumulator_polynomials(relation_parameters.eta); instance->prover_polynomials.sorted_accum = instance->proving_key->sorted_accum.share(); instance->prover_polynomials.sorted_accum_shift = instance->proving_key->sorted_accum.shifted(); instance->prover_polynomials.w_4 = instance->proving_key->w_4.share(); @@ -92,8 +121,8 @@ template void OinkProver::execute_sorted_list_acc template void OinkProver::execute_log_derivative_inverse_round() { auto [beta, gamma] = transcript->template get_challenges(domain_separator + "beta", domain_separator + "gamma"); - instance->relation_parameters.beta = beta; - instance->relation_parameters.gamma = gamma; + relation_parameters.beta = beta; + relation_parameters.gamma = gamma; if constexpr (IsGoblinFlavor) { // Compute and commit to the logderivative inverse used in DataBus instance->compute_logderivative_inverse(beta, gamma); @@ -110,8 +139,9 @@ template void OinkProver::execute_log_derivative_ template void OinkProver::execute_grand_product_computation_round() { - instance->compute_grand_product_polynomials(instance->relation_parameters.beta, - instance->relation_parameters.gamma); + instance->compute_grand_product_polynomials(relation_parameters.beta, relation_parameters.gamma); + relation_parameters.public_input_delta = instance->relation_parameters.public_input_delta; + relation_parameters.lookup_grand_product_delta = instance->relation_parameters.lookup_grand_product_delta; witness_commitments.z_perm = commitment_key->commit(instance->proving_key->z_perm); witness_commitments.z_lookup = commitment_key->commit(instance->proving_key->z_lookup); diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.hpp b/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.hpp index 91b011c32e8..16170058474 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.hpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.hpp @@ -25,6 +25,9 @@ #include "barretenberg/transcript/transcript.hpp" namespace bb { +template struct OinkProverOutput { + bb::RelationParameters relation_parameters; +}; /** * @brief Class for all the oink rounds, which are shared between the folding prover and ultra prover. @@ -48,6 +51,8 @@ template class OinkProver { typename Flavor::WitnessCommitments witness_commitments; typename Flavor::CommitmentLabels commitment_labels; + bb::RelationParameters relation_parameters; + OinkProver(const std::shared_ptr>& inst, const std::shared_ptr& commitment_key, const std::shared_ptr& transcript, @@ -60,6 +65,7 @@ template class OinkProver { instance->prover_polynomials = typename Flavor::ProverPolynomials(instance->proving_key); } + OinkProverOutput prove(); void execute_preamble_round(); void execute_wire_commitments_round(); void execute_sorted_list_accumulator_round(); diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_prover.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_prover.cpp index fe78a0d7d88..aa684bd38d1 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_prover.cpp @@ -79,20 +79,9 @@ template HonkProof& UltraProver_::export_proof() template HonkProof& UltraProver_::construct_proof() { - // Add circuit size public input size and public inputs to transcript-> - oink_prover.execute_preamble_round(); - - // Compute first three wire commitments - oink_prover.execute_wire_commitments_round(); - - // Compute sorted list accumulator and commitment - oink_prover.execute_sorted_list_accumulator_round(); - - // Fiat-Shamir: beta & gamma - oink_prover.execute_log_derivative_inverse_round(); - - // Compute grand product(s) and commitments. - oink_prover.execute_grand_product_computation_round(); + auto [relation_params] = oink_prover.prove(); + instance->relation_parameters = std::move(relation_params); + // instance->prover_polynomials = ProverPolynomials(instance->proving_key); // Fiat-Shamir: alpha // Run sumcheck subprotocol. From 1f4e307e61200a6cd76d1018905eea479eb8ea90 Mon Sep 17 00:00:00 2001 From: lucasxia01 Date: Thu, 21 Mar 2024 19:24:39 +0000 Subject: [PATCH 09/25] proverpolynomials now is just a temporary object during oink --- .../barretenberg/protogalaxy/protogalaxy_prover.cpp | 2 +- .../barretenberg/sumcheck/instance/prover_instance.cpp | 10 +++++----- .../cpp/src/barretenberg/ultra_honk/oink_prover.cpp | 4 ---- .../cpp/src/barretenberg/ultra_honk/oink_prover.hpp | 4 +--- 4 files changed, 7 insertions(+), 13 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.cpp b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.cpp index 146a7e9911d..f053ff1b832 100644 --- a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.cpp @@ -10,7 +10,7 @@ void ProtoGalaxyProver_::finalise_and_send_instance(std::shared auto [relation_params] = oink_prover.prove(); instance->relation_parameters = std::move(relation_params); - // instance->prover_polynomials = ProverPolynomials(instance->proving_key); + instance->prover_polynomials = ProverPolynomials(instance->proving_key); // Generate relation separators alphas for sumcheck for (size_t idx = 0; idx < NUM_SUBRELATIONS - 1; idx++) { diff --git a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp index 8987736e339..4888c9cf7f2 100644 --- a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp +++ b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp @@ -87,11 +87,11 @@ void ProverInstance_::compute_logderivative_inverse(FF beta, FF gamma) { relation_parameters.beta = beta; relation_parameters.gamma = gamma; - // prover_polynomials = ProverPolynomials(proving_key); + prover_polynomials = ProverPolynomials(proving_key); // Compute permutation and lookup grand product polynomials bb::compute_logderivative_inverse( prover_polynomials, relation_parameters, proving_key->circuit_size); - // proving_key->lookup_inverses = prover_polynomials.lookup_inverses; + proving_key->lookup_inverses = prover_polynomials.lookup_inverses; } template void ProverInstance_::compute_grand_product_polynomials(FF beta, FF gamma) @@ -105,10 +105,10 @@ template void ProverInstance_::compute_grand_product_poly relation_parameters.lookup_grand_product_delta = lookup_grand_product_delta; // Compute permutation and lookup grand product polynomials - // prover_polynomials = ProverPolynomials(proving_key); + prover_polynomials = ProverPolynomials(proving_key); compute_grand_products(proving_key, prover_polynomials, relation_parameters); - // proving_key->z_perm = prover_polynomials.z_perm; - // proving_key->z_lookup = prover_polynomials.z_lookup; + proving_key->z_perm = prover_polynomials.z_perm; + proving_key->z_lookup = prover_polynomials.z_lookup; } template class ProverInstance_; diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp index dbfc0755921..902a643b0c3 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp @@ -101,10 +101,6 @@ template void OinkProver::execute_sorted_list_acc relation_parameters.eta = transcript->template get_challenge(domain_separator + "eta"); instance->relation_parameters.eta = relation_parameters.eta; instance->proving_key->compute_sorted_accumulator_polynomials(relation_parameters.eta); - instance->prover_polynomials.sorted_accum = instance->proving_key->sorted_accum.share(); - instance->prover_polynomials.sorted_accum_shift = instance->proving_key->sorted_accum.shifted(); - instance->prover_polynomials.w_4 = instance->proving_key->w_4.share(); - instance->prover_polynomials.w_4_shift = instance->proving_key->w_4.shifted(); // Commit to the sorted witness-table accumulator and the finalized (i.e. with memory records) fourth wire // polynomial witness_commitments.sorted_accum = commitment_key->commit(instance->proving_key->sorted_accum); diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.hpp b/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.hpp index 16170058474..2fcb0ba1a1f 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.hpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.hpp @@ -61,9 +61,7 @@ template class OinkProver { , transcript(transcript) , commitment_key(commitment_key) , domain_separator(std::move(domain_separator)) - { - instance->prover_polynomials = typename Flavor::ProverPolynomials(instance->proving_key); - } + {} OinkProverOutput prove(); void execute_preamble_round(); From 2798eaf5ae8950ad9fba4f3f82e6c3baef1a9270 Mon Sep 17 00:00:00 2001 From: lucasxia01 Date: Thu, 21 Mar 2024 19:37:27 +0000 Subject: [PATCH 10/25] moved compute_logderivative_inverse() from instance to proving_key --- .../src/barretenberg/flavor/goblin_ultra.hpp | 17 ++++++++++++++++ .../protogalaxy/protogalaxy.test.cpp | 5 ++--- .../sumcheck/instance/prover_instance.cpp | 20 ------------------- .../sumcheck/instance/prover_instance.hpp | 3 --- .../barretenberg/ultra_honk/oink_prover.cpp | 2 +- .../ultra_honk/relation_correctness.test.cpp | 2 +- 6 files changed, 21 insertions(+), 28 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp b/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp index 0a1edbb236d..9ae616ed51d 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp @@ -354,6 +354,23 @@ class GoblinUltraFlavor { wires[3][gate_idx] += 1; } } + + /** + * @brief Compute the inverse polynomial used in the log derivative lookup argument + * + * @tparam Flavor + * @param beta + * @param gamma + */ + void compute_logderivative_inverse(RelationParameters& relation_parameters) + { + auto proving_key_ptr = std::make_shared(*this); + auto prover_polynomials = ProverPolynomials(proving_key_ptr); + // Compute permutation and lookup grand product polynomials + bb::compute_logderivative_inverse( + prover_polynomials, relation_parameters, this->circuit_size); + this->lookup_inverses = prover_polynomials.lookup_inverses; + } }; /** diff --git a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy.test.cpp b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy.test.cpp index 0bb48697d66..fa3c83c647f 100644 --- a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy.test.cpp +++ b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy.test.cpp @@ -123,11 +123,10 @@ template class ProtoGalaxyTests : public testing::Test { instance->relation_parameters.gamma = FF::random_element(); instance->proving_key->compute_sorted_accumulator_polynomials(instance->relation_parameters.eta); - instance->prover_polynomials = ProverPolynomials(instance->proving_key); if constexpr (IsGoblinFlavor) { - instance->compute_logderivative_inverse(instance->relation_parameters.beta, - instance->relation_parameters.gamma); + instance->proving_key->compute_logderivative_inverse(instance->relation_parameters); } + instance->prover_polynomials = ProverPolynomials(instance->proving_key); instance->compute_grand_product_polynomials(instance->relation_parameters.beta, instance->relation_parameters.gamma); diff --git a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp index 4888c9cf7f2..dea82c9682e 100644 --- a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp +++ b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp @@ -74,26 +74,6 @@ void ProverInstance_::construct_table_polynomials(Circuit& circuit, size proving_key->table_4 = table_polynomials[3].share(); } -/** - * @brief Compute the inverse polynomial used in the log derivative lookup argument - * - * @tparam Flavor - * @param beta - * @param gamma - */ -template -void ProverInstance_::compute_logderivative_inverse(FF beta, FF gamma) - requires IsGoblinFlavor -{ - relation_parameters.beta = beta; - relation_parameters.gamma = gamma; - prover_polynomials = ProverPolynomials(proving_key); - // Compute permutation and lookup grand product polynomials - bb::compute_logderivative_inverse( - prover_polynomials, relation_parameters, proving_key->circuit_size); - proving_key->lookup_inverses = prover_polynomials.lookup_inverses; -} - template void ProverInstance_::compute_grand_product_polynomials(FF beta, FF gamma) { auto public_input_delta = compute_public_input_delta( diff --git a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp index 9c3b8ad6f68..d7e180495f7 100644 --- a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp +++ b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp @@ -90,9 +90,6 @@ template class ProverInstance_ { ProverInstance_() = default; ~ProverInstance_() = default; - void compute_logderivative_inverse(FF, FF) - requires IsGoblinFlavor; - void compute_databus_id() requires IsGoblinFlavor; diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp index 902a643b0c3..df4fd8f65c8 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp @@ -121,7 +121,7 @@ template void OinkProver::execute_log_derivative_ relation_parameters.gamma = gamma; if constexpr (IsGoblinFlavor) { // Compute and commit to the logderivative inverse used in DataBus - instance->compute_logderivative_inverse(beta, gamma); + instance->proving_key->compute_logderivative_inverse(relation_parameters); witness_commitments.lookup_inverses = commitment_key->commit(instance->proving_key->lookup_inverses); transcript->send_to_verifier(domain_separator + commitment_labels.lookup_inverses, witness_commitments.lookup_inverses); diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/relation_correctness.test.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/relation_correctness.test.cpp index 5057f52cfdb..20217d8630b 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/relation_correctness.test.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/relation_correctness.test.cpp @@ -325,8 +325,8 @@ TEST_F(RelationCorrectnessTests, GoblinUltraRelationCorrectness) instance->relation_parameters.gamma = FF::random_element(); instance->proving_key->compute_sorted_accumulator_polynomials(instance->relation_parameters.eta); + instance->proving_key->compute_logderivative_inverse(instance->relation_parameters); instance->prover_polynomials = Flavor::ProverPolynomials(instance->proving_key); - instance->compute_logderivative_inverse(instance->relation_parameters.beta, instance->relation_parameters.gamma); instance->compute_grand_product_polynomials(instance->relation_parameters.beta, instance->relation_parameters.gamma); From 40307445693cd0773b4cb4d8ffbaa643ecb00d37 Mon Sep 17 00:00:00 2001 From: lucasxia01 Date: Thu, 21 Mar 2024 19:52:13 +0000 Subject: [PATCH 11/25] moved compute_grand_product_polynomials from instance to proving key --- .../src/barretenberg/flavor/goblin_ultra.hpp | 22 ++++++++++++++++++ .../cpp/src/barretenberg/flavor/ultra.hpp | 23 +++++++++++++++++++ .../protogalaxy/protogalaxy.test.cpp | 3 +-- .../sumcheck/instance/prover_instance.cpp | 19 --------------- .../sumcheck/instance/prover_instance.hpp | 2 -- .../barretenberg/ultra_honk/oink_prover.cpp | 4 +--- .../ultra_honk/relation_correctness.test.cpp | 6 ++--- .../barretenberg/ultra_honk/sumcheck.test.cpp | 3 +-- .../barretenberg/ultra_honk/ultra_prover.cpp | 2 +- 9 files changed, 51 insertions(+), 33 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp b/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp index 9ae616ed51d..95bfede8ebd 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp @@ -6,6 +6,8 @@ #include "barretenberg/honk/proof_system/types/proof.hpp" #include "barretenberg/polynomials/univariate.hpp" #include "barretenberg/proof_system/circuit_builder/goblin_ultra_circuit_builder.hpp" +#include "barretenberg/proof_system/library/grand_product_delta.hpp" +#include "barretenberg/proof_system/library/grand_product_library.hpp" #include "barretenberg/relations/auxiliary_relation.hpp" #include "barretenberg/relations/databus_lookup_relation.hpp" #include "barretenberg/relations/ecc_op_queue_relation.hpp" @@ -371,6 +373,26 @@ class GoblinUltraFlavor { prover_polynomials, relation_parameters, this->circuit_size); this->lookup_inverses = prover_polynomials.lookup_inverses; } + + void compute_grand_product_polynomials(RelationParameters& relation_parameters) + { + auto public_input_delta = compute_public_input_delta(this->public_inputs, + relation_parameters.beta, + relation_parameters.gamma, + this->circuit_size, + this->pub_inputs_offset); + relation_parameters.public_input_delta = public_input_delta; + auto lookup_grand_product_delta = compute_lookup_grand_product_delta( + relation_parameters.beta, relation_parameters.gamma, this->circuit_size); + relation_parameters.lookup_grand_product_delta = lookup_grand_product_delta; + + // Compute permutation and lookup grand product polynomials + auto proving_key_ptr = std::make_shared(*this); + auto prover_polynomials = ProverPolynomials(proving_key_ptr); + compute_grand_products(proving_key_ptr, prover_polynomials, relation_parameters); + this->z_perm = prover_polynomials.z_perm; + this->z_lookup = prover_polynomials.z_lookup; + } }; /** diff --git a/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp b/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp index d2d3f5d52f3..0f70f76f8c0 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp @@ -8,11 +8,14 @@ #include "barretenberg/polynomials/polynomial.hpp" #include "barretenberg/polynomials/univariate.hpp" #include "barretenberg/proof_system/circuit_builder/ultra_circuit_builder.hpp" +#include "barretenberg/proof_system/library/grand_product_delta.hpp" +#include "barretenberg/proof_system/library/grand_product_library.hpp" #include "barretenberg/relations/auxiliary_relation.hpp" #include "barretenberg/relations/elliptic_relation.hpp" #include "barretenberg/relations/gen_perm_sort_relation.hpp" #include "barretenberg/relations/lookup_relation.hpp" #include "barretenberg/relations/permutation_relation.hpp" +#include "barretenberg/relations/relation_parameters.hpp" #include "barretenberg/relations/ultra_arithmetic_relation.hpp" #include "barretenberg/transcript/transcript.hpp" @@ -358,6 +361,26 @@ class UltraFlavor { wires[3][gate_idx] += 1; } } + + void compute_grand_product_polynomials(RelationParameters& relation_parameters) + { + auto public_input_delta = compute_public_input_delta(this->public_inputs, + relation_parameters.beta, + relation_parameters.gamma, + this->circuit_size, + this->pub_inputs_offset); + relation_parameters.public_input_delta = public_input_delta; + auto lookup_grand_product_delta = compute_lookup_grand_product_delta( + relation_parameters.beta, relation_parameters.gamma, this->circuit_size); + relation_parameters.lookup_grand_product_delta = lookup_grand_product_delta; + + // Compute permutation and lookup grand product polynomials + auto proving_key_ptr = std::make_shared(*this); + auto prover_polynomials = ProverPolynomials(proving_key_ptr); + compute_grand_products(proving_key_ptr, prover_polynomials, relation_parameters); + this->z_perm = prover_polynomials.z_perm; + this->z_lookup = prover_polynomials.z_lookup; + } }; /** diff --git a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy.test.cpp b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy.test.cpp index fa3c83c647f..1124bfdec23 100644 --- a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy.test.cpp +++ b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy.test.cpp @@ -126,9 +126,8 @@ template class ProtoGalaxyTests : public testing::Test { if constexpr (IsGoblinFlavor) { instance->proving_key->compute_logderivative_inverse(instance->relation_parameters); } + instance->proving_key->compute_grand_product_polynomials(instance->relation_parameters); instance->prover_polynomials = ProverPolynomials(instance->proving_key); - instance->compute_grand_product_polynomials(instance->relation_parameters.beta, - instance->relation_parameters.gamma); for (auto& alpha : instance->alphas) { alpha = FF::random_element(); diff --git a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp index dea82c9682e..7f04ee8401c 100644 --- a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp +++ b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp @@ -2,8 +2,6 @@ #include "barretenberg/honk/proof_system/logderivative_library.hpp" #include "barretenberg/proof_system/circuit_builder/ultra_circuit_builder.hpp" #include "barretenberg/proof_system/composer/permutation_lib.hpp" -#include "barretenberg/proof_system/library/grand_product_delta.hpp" -#include "barretenberg/proof_system/library/grand_product_library.hpp" namespace bb { /** @@ -74,23 +72,6 @@ void ProverInstance_::construct_table_polynomials(Circuit& circuit, size proving_key->table_4 = table_polynomials[3].share(); } -template void ProverInstance_::compute_grand_product_polynomials(FF beta, FF gamma) -{ - auto public_input_delta = compute_public_input_delta( - proving_key->public_inputs, beta, gamma, proving_key->circuit_size, proving_key->pub_inputs_offset); - relation_parameters.beta = beta; - relation_parameters.gamma = gamma; - relation_parameters.public_input_delta = public_input_delta; - auto lookup_grand_product_delta = compute_lookup_grand_product_delta(beta, gamma, proving_key->circuit_size); - relation_parameters.lookup_grand_product_delta = lookup_grand_product_delta; - - // Compute permutation and lookup grand product polynomials - prover_polynomials = ProverPolynomials(proving_key); - compute_grand_products(proving_key, prover_polynomials, relation_parameters); - proving_key->z_perm = prover_polynomials.z_perm; - proving_key->z_lookup = prover_polynomials.z_lookup; -} - template class ProverInstance_; template class ProverInstance_; diff --git a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp index d7e180495f7..b16dd99dbf9 100644 --- a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp +++ b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp @@ -93,8 +93,6 @@ template class ProverInstance_ { void compute_databus_id() requires IsGoblinFlavor; - void compute_grand_product_polynomials(FF, FF); - private: static constexpr size_t num_zero_rows = Flavor::has_zero_row ? 1 : 0; static constexpr size_t NUM_WIRES = Circuit::NUM_WIRES; diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp index df4fd8f65c8..273a8b1cbf2 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp @@ -135,9 +135,7 @@ template void OinkProver::execute_log_derivative_ template void OinkProver::execute_grand_product_computation_round() { - instance->compute_grand_product_polynomials(relation_parameters.beta, relation_parameters.gamma); - relation_parameters.public_input_delta = instance->relation_parameters.public_input_delta; - relation_parameters.lookup_grand_product_delta = instance->relation_parameters.lookup_grand_product_delta; + instance->proving_key->compute_grand_product_polynomials(relation_parameters); witness_commitments.z_perm = commitment_key->commit(instance->proving_key->z_perm); witness_commitments.z_lookup = commitment_key->commit(instance->proving_key->z_lookup); diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/relation_correctness.test.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/relation_correctness.test.cpp index 20217d8630b..d45a41961a5 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/relation_correctness.test.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/relation_correctness.test.cpp @@ -272,9 +272,8 @@ TEST_F(RelationCorrectnessTests, UltraRelationCorrectness) instance->relation_parameters.gamma = FF::random_element(); instance->proving_key->compute_sorted_accumulator_polynomials(instance->relation_parameters.eta); + instance->proving_key->compute_grand_product_polynomials(instance->relation_parameters); instance->prover_polynomials = Flavor::ProverPolynomials(instance->proving_key); - instance->compute_grand_product_polynomials(instance->relation_parameters.beta, - instance->relation_parameters.gamma); // Check that selectors are nonzero to ensure corresponding relation has nontrivial contribution ensure_non_zero(proving_key->q_arith); @@ -326,9 +325,8 @@ TEST_F(RelationCorrectnessTests, GoblinUltraRelationCorrectness) instance->proving_key->compute_sorted_accumulator_polynomials(instance->relation_parameters.eta); instance->proving_key->compute_logderivative_inverse(instance->relation_parameters); + instance->proving_key->compute_grand_product_polynomials(instance->relation_parameters); instance->prover_polynomials = Flavor::ProverPolynomials(instance->proving_key); - instance->compute_grand_product_polynomials(instance->relation_parameters.beta, - instance->relation_parameters.gamma); // Check that selectors are nonzero to ensure corresponding relation has nontrivial contribution ensure_non_zero(proving_key->q_arith); diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/sumcheck.test.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/sumcheck.test.cpp index 60e37c9940c..de6a18f09d5 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/sumcheck.test.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/sumcheck.test.cpp @@ -155,9 +155,8 @@ TEST_F(SumcheckTestsRealCircuit, Ultra) instance->relation_parameters.gamma = FF::random_element(); instance->proving_key->compute_sorted_accumulator_polynomials(instance->relation_parameters.eta); + instance->proving_key->compute_grand_product_polynomials(instance->relation_parameters); instance->prover_polynomials = Flavor::ProverPolynomials(instance->proving_key); - instance->compute_grand_product_polynomials(instance->relation_parameters.beta, - instance->relation_parameters.gamma); auto prover_transcript = Transcript::prover_init_empty(); auto circuit_size = instance->proving_key->circuit_size; diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_prover.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_prover.cpp index aa684bd38d1..6317df1ead3 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_prover.cpp @@ -81,7 +81,7 @@ template HonkProof& UltraProver_::construct_proof { auto [relation_params] = oink_prover.prove(); instance->relation_parameters = std::move(relation_params); - // instance->prover_polynomials = ProverPolynomials(instance->proving_key); + instance->prover_polynomials = ProverPolynomials(instance->proving_key); // Fiat-Shamir: alpha // Run sumcheck subprotocol. From e11bb7e55517a39e8c7d6b13fbac5cb45d9d20d4 Mon Sep 17 00:00:00 2001 From: lucasxia01 Date: Thu, 21 Mar 2024 20:00:56 +0000 Subject: [PATCH 12/25] removed the last instance reference that is non instance->proving_key! --- .../barretenberg/ultra_honk/oink_prover.cpp | 47 +++++++++---------- 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp index 273a8b1cbf2..1a8a8d123d0 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp @@ -36,17 +36,17 @@ template OinkProverOutput OinkProver::pro */ template void OinkProver::execute_preamble_round() { - const auto circuit_size = static_cast(instance->proving_key->circuit_size); - const auto num_public_inputs = static_cast(instance->proving_key->num_public_inputs); + const auto circuit_size = static_cast(proving_key->circuit_size); + const auto num_public_inputs = static_cast(proving_key->num_public_inputs); 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->proving_key->pub_inputs_offset)); + static_cast(proving_key->pub_inputs_offset)); - ASSERT(instance->proving_key->num_public_inputs == instance->proving_key->public_inputs.size()); + ASSERT(proving_key->num_public_inputs == proving_key->public_inputs.size()); - for (size_t i = 0; i < instance->proving_key->num_public_inputs; ++i) { - auto public_input_i = instance->proving_key->public_inputs[i]; + for (size_t i = 0; i < proving_key->num_public_inputs; ++i) { + auto public_input_i = proving_key->public_inputs[i]; transcript->send_to_verifier(domain_separator + "public_input_" + std::to_string(i), public_input_i); } } @@ -60,9 +60,9 @@ template void OinkProver::execute_wire_commitment { // Commit to the first three wire polynomials of the instance // We only commit to the fourth wire polynomial after adding memory recordss - witness_commitments.w_l = commitment_key->commit(instance->proving_key->w_l); - witness_commitments.w_r = commitment_key->commit(instance->proving_key->w_r); - witness_commitments.w_o = commitment_key->commit(instance->proving_key->w_o); + witness_commitments.w_l = commitment_key->commit(proving_key->w_l); + witness_commitments.w_r = commitment_key->commit(proving_key->w_r); + witness_commitments.w_o = commitment_key->commit(proving_key->w_o); auto wire_comms = witness_commitments.get_wires(); auto wire_labels = commitment_labels.get_wires(); @@ -72,10 +72,10 @@ template void OinkProver::execute_wire_commitment if constexpr (IsGoblinFlavor) { // Commit to Goblin ECC op wires - witness_commitments.ecc_op_wire_1 = commitment_key->commit(instance->proving_key->ecc_op_wire_1); - witness_commitments.ecc_op_wire_2 = commitment_key->commit(instance->proving_key->ecc_op_wire_2); - witness_commitments.ecc_op_wire_3 = commitment_key->commit(instance->proving_key->ecc_op_wire_3); - witness_commitments.ecc_op_wire_4 = commitment_key->commit(instance->proving_key->ecc_op_wire_4); + witness_commitments.ecc_op_wire_1 = commitment_key->commit(proving_key->ecc_op_wire_1); + witness_commitments.ecc_op_wire_2 = commitment_key->commit(proving_key->ecc_op_wire_2); + witness_commitments.ecc_op_wire_3 = commitment_key->commit(proving_key->ecc_op_wire_3); + witness_commitments.ecc_op_wire_4 = commitment_key->commit(proving_key->ecc_op_wire_4); auto op_wire_comms = witness_commitments.get_ecc_op_wires(); auto labels = commitment_labels.get_ecc_op_wires(); @@ -83,8 +83,8 @@ template void OinkProver::execute_wire_commitment transcript->send_to_verifier(domain_separator + labels[idx], op_wire_comms[idx]); } // Commit to DataBus columns - witness_commitments.calldata = commitment_key->commit(instance->proving_key->calldata); - witness_commitments.calldata_read_counts = commitment_key->commit(instance->proving_key->calldata_read_counts); + witness_commitments.calldata = commitment_key->commit(proving_key->calldata); + witness_commitments.calldata_read_counts = commitment_key->commit(proving_key->calldata_read_counts); transcript->send_to_verifier(domain_separator + commitment_labels.calldata, witness_commitments.calldata); transcript->send_to_verifier(domain_separator + commitment_labels.calldata_read_counts, witness_commitments.calldata_read_counts); @@ -99,12 +99,11 @@ template void OinkProver::execute_sorted_list_acc { relation_parameters.eta = transcript->template get_challenge(domain_separator + "eta"); - instance->relation_parameters.eta = relation_parameters.eta; - instance->proving_key->compute_sorted_accumulator_polynomials(relation_parameters.eta); + proving_key->compute_sorted_accumulator_polynomials(relation_parameters.eta); // Commit to the sorted witness-table accumulator and the finalized (i.e. with memory records) fourth wire // polynomial - witness_commitments.sorted_accum = commitment_key->commit(instance->proving_key->sorted_accum); - witness_commitments.w_4 = commitment_key->commit(instance->proving_key->w_4); + witness_commitments.sorted_accum = commitment_key->commit(proving_key->sorted_accum); + witness_commitments.w_4 = commitment_key->commit(proving_key->w_4); transcript->send_to_verifier(domain_separator + commitment_labels.sorted_accum, witness_commitments.sorted_accum); transcript->send_to_verifier(domain_separator + commitment_labels.w_4, witness_commitments.w_4); @@ -121,8 +120,8 @@ template void OinkProver::execute_log_derivative_ relation_parameters.gamma = gamma; if constexpr (IsGoblinFlavor) { // Compute and commit to the logderivative inverse used in DataBus - instance->proving_key->compute_logderivative_inverse(relation_parameters); - witness_commitments.lookup_inverses = commitment_key->commit(instance->proving_key->lookup_inverses); + proving_key->compute_logderivative_inverse(relation_parameters); + witness_commitments.lookup_inverses = commitment_key->commit(proving_key->lookup_inverses); transcript->send_to_verifier(domain_separator + commitment_labels.lookup_inverses, witness_commitments.lookup_inverses); } @@ -135,10 +134,10 @@ template void OinkProver::execute_log_derivative_ template void OinkProver::execute_grand_product_computation_round() { - instance->proving_key->compute_grand_product_polynomials(relation_parameters); + proving_key->compute_grand_product_polynomials(relation_parameters); - witness_commitments.z_perm = commitment_key->commit(instance->proving_key->z_perm); - witness_commitments.z_lookup = commitment_key->commit(instance->proving_key->z_lookup); + witness_commitments.z_perm = commitment_key->commit(proving_key->z_perm); + witness_commitments.z_lookup = commitment_key->commit(proving_key->z_lookup); transcript->send_to_verifier(domain_separator + commitment_labels.z_perm, witness_commitments.z_perm); transcript->send_to_verifier(domain_separator + commitment_labels.z_lookup, witness_commitments.z_lookup); From b4c435472f51ffa58e6ee7c32bed3941669bb427 Mon Sep 17 00:00:00 2001 From: lucasxia01 Date: Thu, 21 Mar 2024 20:07:34 +0000 Subject: [PATCH 13/25] =?UTF-8?q?oink=20says=20bye=20bye=20to=20instance?= =?UTF-8?q?=20=F0=9F=91=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/barretenberg/protogalaxy/protogalaxy_prover.cpp | 2 +- .../cpp/src/barretenberg/ultra_honk/oink_prover.hpp | 9 ++++----- .../cpp/src/barretenberg/ultra_honk/ultra_prover.cpp | 4 ++-- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.cpp b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.cpp index f053ff1b832..93d35cad10f 100644 --- a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.cpp @@ -6,7 +6,7 @@ template void ProtoGalaxyProver_::finalise_and_send_instance(std::shared_ptr instance, const std::string& domain_separator) { - OinkProver oink_prover(instance, commitment_key, transcript, domain_separator + '_'); + OinkProver oink_prover(instance->proving_key, commitment_key, transcript, domain_separator + '_'); auto [relation_params] = oink_prover.prove(); instance->relation_parameters = std::move(relation_params); diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.hpp b/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.hpp index 2fcb0ba1a1f..fcf81279651 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.hpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.hpp @@ -21,7 +21,6 @@ #include "barretenberg/flavor/goblin_ultra.hpp" #include "barretenberg/flavor/ultra.hpp" -#include "barretenberg/sumcheck/instance/prover_instance.hpp" #include "barretenberg/transcript/transcript.hpp" namespace bb { @@ -39,12 +38,12 @@ template struct OinkProverOutput { */ template class OinkProver { using CommitmentKey = typename Flavor::CommitmentKey; - using Instance = ProverInstance_; + using ProvingKey = typename Flavor::ProvingKey; using Transcript = typename Flavor::Transcript; using FF = typename Flavor::FF; public: - std::shared_ptr instance; + std::shared_ptr proving_key; std::shared_ptr transcript; std::shared_ptr commitment_key; std::string domain_separator; @@ -53,11 +52,11 @@ template class OinkProver { bb::RelationParameters relation_parameters; - OinkProver(const std::shared_ptr>& inst, + OinkProver(const std::shared_ptr& proving_key, const std::shared_ptr& commitment_key, const std::shared_ptr& transcript, std::string domain_separator = "") - : instance(inst) + : proving_key(proving_key) , transcript(transcript) , commitment_key(commitment_key) , domain_separator(std::move(domain_separator)) diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_prover.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_prover.cpp index 6317df1ead3..a8bce2bfc93 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_prover.cpp @@ -15,7 +15,7 @@ UltraProver_::UltraProver_(const std::shared_ptr& inst, const : instance(std::move(inst)) , transcript(transcript) , commitment_key(instance->proving_key->commitment_key) - , oink_prover(inst, commitment_key, transcript, "") + , oink_prover(inst->proving_key, commitment_key, transcript, "") {} /** @@ -30,7 +30,7 @@ UltraProver_::UltraProver_(Builder& circuit) : instance(std::make_shared(circuit)) , transcript(std::make_shared()) , commitment_key(instance->proving_key->commitment_key) - , oink_prover(instance, commitment_key, transcript, "") + , oink_prover(instance->proving_key, commitment_key, transcript, "") {} /** From 2b67229f53cf176bd55f98544fdcdbc91e265654 Mon Sep 17 00:00:00 2001 From: lucasxia01 Date: Thu, 21 Mar 2024 21:09:22 +0000 Subject: [PATCH 14/25] small fixes to tests --- barretenberg/cpp/scripts/analyze_client_ivc_bench.py | 1 - .../benchmark/ultra_bench/ultra_honk_rounds.bench.cpp | 3 +++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/barretenberg/cpp/scripts/analyze_client_ivc_bench.py b/barretenberg/cpp/scripts/analyze_client_ivc_bench.py index af374d05a5d..7f83664a03e 100644 --- a/barretenberg/cpp/scripts/analyze_client_ivc_bench.py +++ b/barretenberg/cpp/scripts/analyze_client_ivc_bench.py @@ -12,7 +12,6 @@ "ProtogalaxyProver::fold_instances(t)", "Decider::construct_proof(t)", "ECCVMComposer::create_prover(t)", - "GoblinTranslatorComposer::create_prover(t)", "ECCVMProver::construct_proof(t)", "GoblinTranslatorProver::construct_proof(t)", "Goblin::merge(t)" diff --git a/barretenberg/cpp/src/barretenberg/benchmark/ultra_bench/ultra_honk_rounds.bench.cpp b/barretenberg/cpp/src/barretenberg/benchmark/ultra_bench/ultra_honk_rounds.bench.cpp index 5f6fdf186de..2ec4edfdbee 100644 --- a/barretenberg/cpp/src/barretenberg/benchmark/ultra_bench/ultra_honk_rounds.bench.cpp +++ b/barretenberg/cpp/src/barretenberg/benchmark/ultra_bench/ultra_honk_rounds.bench.cpp @@ -49,6 +49,9 @@ BB_PROFILE static void test_round_inner(State& state, GoblinUltraProver& prover, time_if_index(SORTED_LIST_ACCUMULATOR, [&] { prover.oink_prover.execute_sorted_list_accumulator_round(); }); time_if_index(LOG_DERIVATIVE_INVERSE, [&] { prover.oink_prover.execute_log_derivative_inverse_round(); }); time_if_index(GRAND_PRODUCT_COMPUTATION, [&] { prover.oink_prover.execute_grand_product_computation_round(); }); + // we need to get the relation_parameters and prover_polynomials from the oink_prover + prover.instance->relation_parameters = prover.oink_prover.relation_parameters; + prover.instance->prover_polynomials = GoblinUltraFlavor::ProverPolynomials(prover.instance->proving_key); time_if_index(RELATION_CHECK, [&] { prover.execute_relation_check_rounds(); }); time_if_index(ZEROMORPH, [&] { prover.execute_zeromorph_rounds(); }); } From abd0bd74d99caec7097d2790b8ab3e7787a372a4 Mon Sep 17 00:00:00 2001 From: lucasxia01 Date: Thu, 21 Mar 2024 22:04:33 +0000 Subject: [PATCH 15/25] removed stupid shared_ptr calling copy constructor of proving_key (added 900ms) >:( --- .../src/barretenberg/flavor/goblin_ultra.hpp | 19 ++++++++++++++----- .../cpp/src/barretenberg/flavor/ultra.hpp | 16 +++++++++++++--- .../library/grand_product_library.hpp | 6 +++--- .../goblin_translator_prover.cpp | 2 +- 4 files changed, 31 insertions(+), 12 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp b/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp index 95bfede8ebd..59d3369814b 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp @@ -366,8 +366,7 @@ class GoblinUltraFlavor { */ void compute_logderivative_inverse(RelationParameters& relation_parameters) { - auto proving_key_ptr = std::make_shared(*this); - auto prover_polynomials = ProverPolynomials(proving_key_ptr); + auto prover_polynomials = ProverPolynomials(this); // Compute permutation and lookup grand product polynomials bb::compute_logderivative_inverse( prover_polynomials, relation_parameters, this->circuit_size); @@ -387,9 +386,8 @@ class GoblinUltraFlavor { relation_parameters.lookup_grand_product_delta = lookup_grand_product_delta; // Compute permutation and lookup grand product polynomials - auto proving_key_ptr = std::make_shared(*this); - auto prover_polynomials = ProverPolynomials(proving_key_ptr); - compute_grand_products(proving_key_ptr, prover_polynomials, relation_parameters); + auto prover_polynomials = ProverPolynomials(this); + compute_grand_products(*this, prover_polynomials, relation_parameters); this->z_perm = prover_polynomials.z_perm; this->z_lookup = prover_polynomials.z_lookup; } @@ -448,6 +446,17 @@ class GoblinUltraFlavor { */ class ProverPolynomials : public AllEntities { public: + ProverPolynomials(ProvingKey* proving_key) + { + for (auto [prover_poly, key_poly] : zip_view(this->get_unshifted(), proving_key->get_all())) { + ASSERT(flavor_get_label(*this, prover_poly) == flavor_get_label(*proving_key, key_poly)); + prover_poly = key_poly.share(); + } + for (auto [prover_poly, key_poly] : zip_view(this->get_shifted(), proving_key->get_to_be_shifted())) { + ASSERT(flavor_get_label(*this, prover_poly) == (flavor_get_label(*proving_key, key_poly) + "_shift")); + prover_poly = key_poly.shifted(); + } + } ProverPolynomials(std::shared_ptr& proving_key) { for (auto [prover_poly, key_poly] : zip_view(this->get_unshifted(), proving_key->get_all())) { diff --git a/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp b/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp index 0f70f76f8c0..b2043ed9ef1 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp @@ -375,9 +375,8 @@ class UltraFlavor { relation_parameters.lookup_grand_product_delta = lookup_grand_product_delta; // Compute permutation and lookup grand product polynomials - auto proving_key_ptr = std::make_shared(*this); - auto prover_polynomials = ProverPolynomials(proving_key_ptr); - compute_grand_products(proving_key_ptr, prover_polynomials, relation_parameters); + auto prover_polynomials = ProverPolynomials(this); + compute_grand_products(*this, prover_polynomials, relation_parameters); this->z_perm = prover_polynomials.z_perm; this->z_lookup = prover_polynomials.z_lookup; } @@ -408,6 +407,17 @@ class UltraFlavor { */ class ProverPolynomials : public AllEntities { public: + ProverPolynomials(ProvingKey* proving_key) + { + for (auto [prover_poly, key_poly] : zip_view(this->get_unshifted(), proving_key->get_all())) { + ASSERT(flavor_get_label(*this, prover_poly) == flavor_get_label(*proving_key, key_poly)); + prover_poly = key_poly.share(); + } + for (auto [prover_poly, key_poly] : zip_view(this->get_shifted(), proving_key->get_to_be_shifted())) { + ASSERT(flavor_get_label(*this, prover_poly) == (flavor_get_label(*proving_key, key_poly) + "_shift")); + prover_poly = key_poly.shifted(); + } + } ProverPolynomials(std::shared_ptr& proving_key) { for (auto [prover_poly, key_poly] : zip_view(this->get_unshifted(), proving_key->get_all())) { diff --git a/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.hpp b/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.hpp index 897d5a63642..5d2675649bf 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/library/grand_product_library.hpp @@ -142,7 +142,7 @@ void compute_grand_product(const size_t circuit_size, } template -void compute_grand_products(std::shared_ptr& key, +void compute_grand_products(const typename Flavor::ProvingKey& key, typename Flavor::ProverPolynomials& full_polynomials, bb::RelationParameters& relation_parameters) { @@ -157,10 +157,10 @@ void compute_grand_products(std::shared_ptr& key, // For example, for UltraPermutationRelation, this will be `full_polynomials.z_perm` // For example, for LookupRelation, this will be `full_polynomials.z_lookup` bb::Polynomial& full_polynomial = GrandProdRelation::get_grand_product_polynomial(full_polynomials); - auto& key_polynomial = GrandProdRelation::get_grand_product_polynomial(*key); + auto& key_polynomial = GrandProdRelation::get_grand_product_polynomial(key); full_polynomial = key_polynomial.share(); - compute_grand_product(key->circuit_size, full_polynomials, relation_parameters); + compute_grand_product(key.circuit_size, full_polynomials, relation_parameters); bb::Polynomial& full_polynomial_shift = GrandProdRelation::get_shifted_grand_product_polynomial(full_polynomials); full_polynomial_shift = key_polynomial.shifted(); diff --git a/barretenberg/cpp/src/barretenberg/translator_vm/goblin_translator_prover.cpp b/barretenberg/cpp/src/barretenberg/translator_vm/goblin_translator_prover.cpp index 2ddff25fa1e..ffeaa978161 100644 --- a/barretenberg/cpp/src/barretenberg/translator_vm/goblin_translator_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/translator_vm/goblin_translator_prover.cpp @@ -290,7 +290,7 @@ void GoblinTranslatorProver::execute_grand_product_computation_round() }; } // Compute constraint permutation grand product - compute_grand_products(key, prover_polynomials, relation_parameters); + compute_grand_products(*key, prover_polynomials, relation_parameters); transcript->send_to_verifier(commitment_labels.z_perm, commitment_key->commit(key->z_perm)); } From 8923c8c3e524a35b97b56a26b5ff3520330c9f67 Mon Sep 17 00:00:00 2001 From: lucasxia01 Date: Fri, 22 Mar 2024 18:39:42 +0000 Subject: [PATCH 16/25] deleting copy constructor of proving key to prevent copying --- barretenberg/cpp/src/barretenberg/flavor/flavor.hpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp b/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp index 14d317ca073..b9b6533b033 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp @@ -130,6 +130,8 @@ class ProvingKey_ : public PrecomputedPolynomials, public WitnessPolynomials { auto get_precomputed_polynomials() { return PrecomputedPolynomials::get_all(); } auto get_selectors() { return PrecomputedPolynomials::get_selectors(); } ProvingKey_() = default; + ProvingKey_& operator=(const ProvingKey_&) = delete; + ProvingKey_(const ProvingKey_& other) = delete; ProvingKey_(const size_t circuit_size, const size_t num_public_inputs) { this->commitment_key = std::make_shared(circuit_size + 1); From c425e3d5225ad5ce3c3a1eafc84bdcfcfccd54a9 Mon Sep 17 00:00:00 2001 From: lucasxia01 Date: Fri, 22 Mar 2024 19:30:20 +0000 Subject: [PATCH 17/25] updated based on comments --- .../cpp/src/barretenberg/flavor/flavor.hpp | 3 -- .../src/barretenberg/flavor/goblin_ultra.hpp | 28 +++++++++++-------- .../cpp/src/barretenberg/flavor/ultra.hpp | 24 ++++++++++------ 3 files changed, 32 insertions(+), 23 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp b/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp index b9b6533b033..fd80d637de5 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp @@ -109,7 +109,6 @@ class ProvingKey_ : public PrecomputedPolynomials, public WitnessPolynomials { std::vector recursive_proof_public_input_indices; bb::EvaluationDomain evaluation_domain; std::shared_ptr commitment_key; - std::array sorted_polynomials; // offset due to placing zero wires at the start of execution trace // non-zero for Instances constructed from circuits, this concept doesn't exist for accumulated @@ -130,8 +129,6 @@ class ProvingKey_ : public PrecomputedPolynomials, public WitnessPolynomials { auto get_precomputed_polynomials() { return PrecomputedPolynomials::get_all(); } auto get_selectors() { return PrecomputedPolynomials::get_selectors(); } ProvingKey_() = default; - ProvingKey_& operator=(const ProvingKey_&) = delete; - ProvingKey_(const ProvingKey_& other) = delete; ProvingKey_(const size_t circuit_size, const size_t num_public_inputs) { this->commitment_key = std::make_shared(circuit_size + 1); diff --git a/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp b/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp index 59d3369814b..0e1dae4bef5 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp @@ -268,6 +268,7 @@ class GoblinUltraFlavor { std::vector memory_read_records; std::vector memory_write_records; + std::array sorted_polynomials; size_t num_ecc_op_gates; // needed to determine public input offset @@ -290,7 +291,7 @@ class GoblinUltraFlavor { * @param eta random challenge * @return Polynomial */ - void compute_sorted_list_accumulator(FF eta) + void compute_sorted_list_accumulator(const FF& eta) { const size_t circuit_size = this->circuit_size; @@ -310,7 +311,7 @@ class GoblinUltraFlavor { this->sorted_accum = sorted_list_accumulator.share(); } - void compute_sorted_accumulator_polynomials(FF eta) + void compute_sorted_accumulator_polynomials(const FF& eta) { // Compute sorted witness-table accumulator this->compute_sorted_list_accumulator(eta); @@ -328,7 +329,7 @@ class GoblinUltraFlavor { * @tparam Flavor * @param eta challenge produced after commitment to first three wire polynomials */ - void add_plookup_memory_records_to_wire_4(FF eta) + void add_plookup_memory_records_to_wire_4(const FF& eta) { // The plookup memory record values are computed at the indicated indices as // w4 = w3 * eta^3 + w2 * eta^2 + w1 * eta + read_write_flag; @@ -364,15 +365,20 @@ class GoblinUltraFlavor { * @param beta * @param gamma */ - void compute_logderivative_inverse(RelationParameters& relation_parameters) + void compute_logderivative_inverse(const RelationParameters& relation_parameters) { - auto prover_polynomials = ProverPolynomials(this); + auto prover_polynomials = ProverPolynomials(*this); // Compute permutation and lookup grand product polynomials bb::compute_logderivative_inverse( prover_polynomials, relation_parameters, this->circuit_size); this->lookup_inverses = prover_polynomials.lookup_inverses; } + /** + * @brief Computes public_input_delta, lookup_grand_product_delta, the z_perm and z_lookup polynomials + * + * @param relation_parameters + */ void compute_grand_product_polynomials(RelationParameters& relation_parameters) { auto public_input_delta = compute_public_input_delta(this->public_inputs, @@ -386,7 +392,7 @@ class GoblinUltraFlavor { relation_parameters.lookup_grand_product_delta = lookup_grand_product_delta; // Compute permutation and lookup grand product polynomials - auto prover_polynomials = ProverPolynomials(this); + auto prover_polynomials = ProverPolynomials(*this); compute_grand_products(*this, prover_polynomials, relation_parameters); this->z_perm = prover_polynomials.z_perm; this->z_lookup = prover_polynomials.z_lookup; @@ -446,14 +452,14 @@ class GoblinUltraFlavor { */ class ProverPolynomials : public AllEntities { public: - ProverPolynomials(ProvingKey* proving_key) + ProverPolynomials(ProvingKey& proving_key) { - for (auto [prover_poly, key_poly] : zip_view(this->get_unshifted(), proving_key->get_all())) { - ASSERT(flavor_get_label(*this, prover_poly) == flavor_get_label(*proving_key, key_poly)); + for (auto [prover_poly, key_poly] : zip_view(this->get_unshifted(), proving_key.get_all())) { + ASSERT(flavor_get_label(*this, prover_poly) == flavor_get_label(proving_key, key_poly)); prover_poly = key_poly.share(); } - for (auto [prover_poly, key_poly] : zip_view(this->get_shifted(), proving_key->get_to_be_shifted())) { - ASSERT(flavor_get_label(*this, prover_poly) == (flavor_get_label(*proving_key, key_poly) + "_shift")); + for (auto [prover_poly, key_poly] : zip_view(this->get_shifted(), proving_key.get_to_be_shifted())) { + ASSERT(flavor_get_label(*this, prover_poly) == (flavor_get_label(proving_key, key_poly) + "_shift")); prover_poly = key_poly.shifted(); } } diff --git a/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp b/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp index b2043ed9ef1..73e8de19e2a 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp @@ -275,6 +275,7 @@ class UltraFlavor { std::vector memory_read_records; std::vector memory_write_records; + std::array sorted_polynomials; auto get_to_be_shifted() { @@ -295,7 +296,7 @@ class UltraFlavor { * @param eta random challenge * @return Polynomial */ - void compute_sorted_list_accumulator(FF eta) + void compute_sorted_list_accumulator(const FF& eta) { const size_t circuit_size = this->circuit_size; @@ -315,7 +316,7 @@ class UltraFlavor { this->sorted_accum = sorted_list_accumulator.share(); } - void compute_sorted_accumulator_polynomials(FF eta) + void compute_sorted_accumulator_polynomials(const FF& eta) { // Compute sorted witness-table accumulator this->compute_sorted_list_accumulator(eta); @@ -333,7 +334,7 @@ class UltraFlavor { * @tparam Flavor * @param eta challenge produced after commitment to first three wire polynomials */ - void add_plookup_memory_records_to_wire_4(FF eta) + void add_plookup_memory_records_to_wire_4(const FF& eta) { // The plookup memory record values are computed at the indicated indices as // w4 = w3 * eta^3 + w2 * eta^2 + w1 * eta + read_write_flag; @@ -362,6 +363,11 @@ class UltraFlavor { } } + /** + * @brief Computes public_input_delta, lookup_grand_product_delta, the z_perm and z_lookup polynomials + * + * @param relation_parameters + */ void compute_grand_product_polynomials(RelationParameters& relation_parameters) { auto public_input_delta = compute_public_input_delta(this->public_inputs, @@ -375,7 +381,7 @@ class UltraFlavor { relation_parameters.lookup_grand_product_delta = lookup_grand_product_delta; // Compute permutation and lookup grand product polynomials - auto prover_polynomials = ProverPolynomials(this); + auto prover_polynomials = ProverPolynomials(*this); compute_grand_products(*this, prover_polynomials, relation_parameters); this->z_perm = prover_polynomials.z_perm; this->z_lookup = prover_polynomials.z_lookup; @@ -407,14 +413,14 @@ class UltraFlavor { */ class ProverPolynomials : public AllEntities { public: - ProverPolynomials(ProvingKey* proving_key) + ProverPolynomials(ProvingKey& proving_key) { - for (auto [prover_poly, key_poly] : zip_view(this->get_unshifted(), proving_key->get_all())) { - ASSERT(flavor_get_label(*this, prover_poly) == flavor_get_label(*proving_key, key_poly)); + for (auto [prover_poly, key_poly] : zip_view(this->get_unshifted(), proving_key.get_all())) { + ASSERT(flavor_get_label(*this, prover_poly) == flavor_get_label(proving_key, key_poly)); prover_poly = key_poly.share(); } - for (auto [prover_poly, key_poly] : zip_view(this->get_shifted(), proving_key->get_to_be_shifted())) { - ASSERT(flavor_get_label(*this, prover_poly) == (flavor_get_label(*proving_key, key_poly) + "_shift")); + for (auto [prover_poly, key_poly] : zip_view(this->get_shifted(), proving_key.get_to_be_shifted())) { + ASSERT(flavor_get_label(*this, prover_poly) == (flavor_get_label(proving_key, key_poly) + "_shift")); prover_poly = key_poly.shifted(); } } From 2b6aae9fb04e47b7ecb639ddebcd5cda5297c496 Mon Sep 17 00:00:00 2001 From: lucasxia01 Date: Fri, 22 Mar 2024 20:58:54 +0000 Subject: [PATCH 18/25] bye bye shared ptrs for ultra/goblin ultra proving_keys :) --- .../client_ivc/mock_kernel_pinning.test.cpp | 4 +- .../cpp/src/barretenberg/flavor/flavor.hpp | 25 +++++---- .../barretenberg/flavor/goblin_translator.hpp | 20 +++++-- .../src/barretenberg/flavor/goblin_ultra.hpp | 33 +++++++---- .../cpp/src/barretenberg/flavor/ultra.hpp | 33 ++++++----- .../goblin/mock_circuits_pinning.test.cpp | 8 +-- .../plonk/composer/standard_composer.cpp | 2 +- .../plonk/composer/ultra_composer.cpp | 2 +- .../execution_trace/execution_trace.cpp | 55 ++++++++++--------- .../execution_trace/execution_trace.hpp | 9 ++- .../proof_system/instance_inspector.hpp | 2 +- .../protogalaxy/combiner.test.cpp | 12 ++-- .../protogalaxy/decider_prover.cpp | 4 +- .../protogalaxy/protogalaxy.test.cpp | 8 +-- .../protogalaxy/protogalaxy_prover.cpp | 21 +++---- .../protogalaxy/protogalaxy_prover.hpp | 4 +- .../sumcheck/instance/prover_instance.cpp | 14 ++--- .../sumcheck/instance/prover_instance.hpp | 22 ++++---- .../instance/prover_instance.test.cpp | 8 +-- .../goblin_ultra_transcript.test.cpp | 2 +- .../barretenberg/ultra_honk/oink_prover.cpp | 46 ++++++++-------- .../barretenberg/ultra_honk/oink_prover.hpp | 4 +- .../ultra_honk/relation_correctness.test.cpp | 48 ++++++++-------- .../barretenberg/ultra_honk/sumcheck.test.cpp | 6 +- .../ultra_honk/ultra_composer.test.cpp | 6 +- .../barretenberg/ultra_honk/ultra_prover.cpp | 6 +- .../ultra_honk/ultra_transcript.test.cpp | 2 +- 27 files changed, 216 insertions(+), 190 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/client_ivc/mock_kernel_pinning.test.cpp b/barretenberg/cpp/src/barretenberg/client_ivc/mock_kernel_pinning.test.cpp index 5d48c880294..87ec85f94d0 100644 --- a/barretenberg/cpp/src/barretenberg/client_ivc/mock_kernel_pinning.test.cpp +++ b/barretenberg/cpp/src/barretenberg/client_ivc/mock_kernel_pinning.test.cpp @@ -37,7 +37,7 @@ TEST_F(MockKernelTest, PinFoldingKernelSizes) kernel_circuit, { func_fold_proof, ivc.vks.func_vk }, {}, kernel_acc); auto kernel_fold_proof = ivc.accumulate(kernel_circuit); - EXPECT_EQ(ivc.prover_instance->proving_key->log_circuit_size, 17); + EXPECT_EQ(ivc.prover_instance->proving_key.log_circuit_size, 17); GoblinUltraCircuitBuilder circuit_3{ ivc.goblin.op_queue }; GoblinMockCircuits::construct_mock_function_circuit(circuit_3); @@ -49,5 +49,5 @@ TEST_F(MockKernelTest, PinFoldingKernelSizes) { func_fold_proof, ivc.vks.func_vk }, kernel_acc); auto instance = std::make_shared(kernel_circuit); - EXPECT_EQ(instance->proving_key->log_circuit_size, 17); + EXPECT_EQ(instance->proving_key.log_circuit_size, 17); } \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp b/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp index fd80d637de5..af077a3af01 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp @@ -159,6 +159,7 @@ class VerificationKey_ : public PrecomputedCommitments { size_t pub_inputs_offset = 0; VerificationKey_() = default; + // VerificationKey_(const VerificationKey_& other) = default; VerificationKey_(const size_t circuit_size, const size_t num_public_inputs) { this->circuit_size = circuit_size; @@ -166,18 +167,18 @@ class VerificationKey_ : public PrecomputedCommitments { this->num_public_inputs = num_public_inputs; }; - template VerificationKey_(const ProvingKeyPtr& proving_key) - { - this->pcs_verification_key = std::make_shared(); - this->circuit_size = proving_key->circuit_size; - this->log_circuit_size = numeric::get_msb(this->circuit_size); - this->num_public_inputs = proving_key->num_public_inputs; - this->pub_inputs_offset = proving_key->pub_inputs_offset; - - for (auto [polynomial, commitment] : zip_view(proving_key->get_precomputed_polynomials(), this->get_all())) { - commitment = proving_key->commitment_key->commit(polynomial); - } - } + // VerificationKey_(ProvingKey& proving_key) + // { + // this->pcs_verification_key = std::make_shared(); + // this->circuit_size = proving_key.circuit_size; + // this->log_circuit_size = numeric::get_msb(this->circuit_size); + // this->num_public_inputs = proving_key.num_public_inputs; + // this->pub_inputs_offset = proving_key.pub_inputs_offset; + + // for (auto [polynomial, commitment] : zip_view(proving_key.get_precomputed_polynomials(), this->get_all())) { + // commitment = proving_key.commitment_key->commit(polynomial); + // } + // } }; // Because of how Gemini is written, is importat to put the polynomials out in this order. diff --git a/barretenberg/cpp/src/barretenberg/flavor/goblin_translator.hpp b/barretenberg/cpp/src/barretenberg/flavor/goblin_translator.hpp index f69a5814155..0d1f82e3078 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/goblin_translator.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/goblin_translator.hpp @@ -1046,12 +1046,20 @@ class GoblinTranslatorFlavor { VerificationKey(const size_t circuit_size, const size_t num_public_inputs) : VerificationKey_(circuit_size, num_public_inputs) {} - - template - VerificationKey(const ProvingKeyPtr& proving_key) - : VerificationKey_(proving_key) - , public_inputs(proving_key->public_inputs) - {} + VerificationKey(const std::shared_ptr& proving_key) + : public_inputs(proving_key->public_inputs) + { + this->pcs_verification_key = std::make_shared(); + this->circuit_size = proving_key->circuit_size; + this->log_circuit_size = numeric::get_msb(this->circuit_size); + this->num_public_inputs = proving_key->num_public_inputs; + this->pub_inputs_offset = proving_key->pub_inputs_offset; + + for (auto [polynomial, commitment] : + zip_view(proving_key->get_precomputed_polynomials(), this->get_all())) { + commitment = proving_key->commitment_key->commit(polynomial); + } + } }; /** * @brief A field element for each entity of the flavor. These entities represent the prover polynomials diff --git a/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp b/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp index 0e1dae4bef5..2ebb3f54b5e 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp @@ -408,8 +408,27 @@ class GoblinUltraFlavor { * circuits. * @todo TODO(https://github.com/AztecProtocol/barretenberg/issues/876) */ - using VerificationKey = VerificationKey_, VerifierCommitmentKey>; + // using VerificationKey = VerificationKey_, VerifierCommitmentKey>; + class VerificationKey : public VerificationKey_, VerifierCommitmentKey> { + public: + VerificationKey() = default; + VerificationKey(const size_t circuit_size, const size_t num_public_inputs) + : VerificationKey_(circuit_size, num_public_inputs) + {} + VerificationKey(ProvingKey& proving_key) + { + this->pcs_verification_key = std::make_shared(); + this->circuit_size = proving_key.circuit_size; + this->log_circuit_size = numeric::get_msb(this->circuit_size); + this->num_public_inputs = proving_key.num_public_inputs; + this->pub_inputs_offset = proving_key.pub_inputs_offset; + + for (auto [polynomial, commitment] : zip_view(proving_key.get_precomputed_polynomials(), this->get_all())) { + commitment = proving_key.commitment_key->commit(polynomial); + } + } + }; /** * @brief A container for storing the partially evaluated multivariates produced by sumcheck. */ @@ -452,6 +471,7 @@ class GoblinUltraFlavor { */ class ProverPolynomials : public AllEntities { public: + // TODO(https://github.com/AztecProtocol/barretenberg/issues/925), proving_key could be const ref ProverPolynomials(ProvingKey& proving_key) { for (auto [prover_poly, key_poly] : zip_view(this->get_unshifted(), proving_key.get_all())) { @@ -463,17 +483,6 @@ class GoblinUltraFlavor { prover_poly = key_poly.shifted(); } } - ProverPolynomials(std::shared_ptr& proving_key) - { - for (auto [prover_poly, key_poly] : zip_view(this->get_unshifted(), proving_key->get_all())) { - ASSERT(flavor_get_label(*this, prover_poly) == flavor_get_label(*proving_key, key_poly)); - prover_poly = key_poly.share(); - } - for (auto [prover_poly, key_poly] : zip_view(this->get_shifted(), proving_key->get_to_be_shifted())) { - ASSERT(flavor_get_label(*this, prover_poly) == (flavor_get_label(*proving_key, key_poly) + "_shift")); - prover_poly = key_poly.shifted(); - } - } // Define all operations as default, except move construction/assignment ProverPolynomials() = default; ProverPolynomials& operator=(const ProverPolynomials&) = delete; diff --git a/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp b/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp index 73e8de19e2a..b8974f63232 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp @@ -396,8 +396,26 @@ class UltraFlavor { * that, and split out separate PrecomputedPolynomials/Commitments data for clarity but also for portability of our * circuits. */ - using VerificationKey = VerificationKey_, VerifierCommitmentKey>; - + // using VerificationKey = VerificationKey_, VerifierCommitmentKey>; + class VerificationKey : public VerificationKey_, VerifierCommitmentKey> { + public: + VerificationKey() = default; + VerificationKey(const size_t circuit_size, const size_t num_public_inputs) + : VerificationKey_(circuit_size, num_public_inputs) + {} + VerificationKey(ProvingKey& proving_key) + { + this->pcs_verification_key = std::make_shared(); + this->circuit_size = proving_key.circuit_size; + this->log_circuit_size = numeric::get_msb(this->circuit_size); + this->num_public_inputs = proving_key.num_public_inputs; + this->pub_inputs_offset = proving_key.pub_inputs_offset; + + for (auto [polynomial, commitment] : zip_view(proving_key.get_precomputed_polynomials(), this->get_all())) { + commitment = proving_key.commitment_key->commit(polynomial); + } + } + }; /** * @brief A field element for each entity of the flavor. These entities represent the prover polynomials * evaluated at one point. @@ -424,17 +442,6 @@ class UltraFlavor { prover_poly = key_poly.shifted(); } } - ProverPolynomials(std::shared_ptr& proving_key) - { - for (auto [prover_poly, key_poly] : zip_view(this->get_unshifted(), proving_key->get_all())) { - ASSERT(flavor_get_label(*this, prover_poly) == flavor_get_label(*proving_key, key_poly)); - prover_poly = key_poly.share(); - } - for (auto [prover_poly, key_poly] : zip_view(this->get_shifted(), proving_key->get_to_be_shifted())) { - ASSERT(flavor_get_label(*this, prover_poly) == (flavor_get_label(*proving_key, key_poly) + "_shift")); - prover_poly = key_poly.shifted(); - } - } // Define all operations as default, except move construction/assignment ProverPolynomials() = default; ProverPolynomials& operator=(const ProverPolynomials&) = delete; diff --git a/barretenberg/cpp/src/barretenberg/goblin/mock_circuits_pinning.test.cpp b/barretenberg/cpp/src/barretenberg/goblin/mock_circuits_pinning.test.cpp index 752e2b32afb..90caad9ebe6 100644 --- a/barretenberg/cpp/src/barretenberg/goblin/mock_circuits_pinning.test.cpp +++ b/barretenberg/cpp/src/barretenberg/goblin/mock_circuits_pinning.test.cpp @@ -25,9 +25,9 @@ TEST_F(MockCircuitsPinning, FunctionSizes) GoblinMockCircuits::construct_mock_function_circuit(app_circuit, large); auto instance = std::make_shared(app_circuit); if (large) { - EXPECT_EQ(instance->proving_key->log_circuit_size, 19); + EXPECT_EQ(instance->proving_key.log_circuit_size, 19); } else { - EXPECT_EQ(instance->proving_key->log_circuit_size, 17); + EXPECT_EQ(instance->proving_key.log_circuit_size, 17); }; }; run_test(true); @@ -51,9 +51,9 @@ TEST_F(MockCircuitsPinning, RecursionKernelSizes) auto instance = std::make_shared(kernel_circuit); if (large) { - EXPECT_EQ(instance->proving_key->log_circuit_size, 17); + EXPECT_EQ(instance->proving_key.log_circuit_size, 17); } else { - EXPECT_EQ(instance->proving_key->log_circuit_size, 17); + EXPECT_EQ(instance->proving_key.log_circuit_size, 17); }; } }; diff --git a/barretenberg/cpp/src/barretenberg/plonk/composer/standard_composer.cpp b/barretenberg/cpp/src/barretenberg/plonk/composer/standard_composer.cpp index 4647323de23..7fcfe6b9e31 100644 --- a/barretenberg/cpp/src/barretenberg/plonk/composer/standard_composer.cpp +++ b/barretenberg/cpp/src/barretenberg/plonk/composer/standard_composer.cpp @@ -41,7 +41,7 @@ std::shared_ptr StandardComposer::compute_proving_key(Circui subgroup_size, circuit_constructor.public_inputs.size(), crs, CircuitType::STANDARD); // Construct and add to proving key the wire, selector and copy constraint polynomials - Trace::populate(circuit_constructor, circuit_proving_key); + Trace::populate(circuit_constructor, *circuit_proving_key); // Make all selectors nonzero enforce_nonzero_selector_polynomials(circuit_constructor, circuit_proving_key.get()); diff --git a/barretenberg/cpp/src/barretenberg/plonk/composer/ultra_composer.cpp b/barretenberg/cpp/src/barretenberg/plonk/composer/ultra_composer.cpp index 951716ece8c..ded45ec581e 100644 --- a/barretenberg/cpp/src/barretenberg/plonk/composer/ultra_composer.cpp +++ b/barretenberg/cpp/src/barretenberg/plonk/composer/ultra_composer.cpp @@ -166,7 +166,7 @@ std::shared_ptr UltraComposer::compute_proving_key(CircuitBuilder& std::make_shared(subgroup_size, circuit.public_inputs.size(), crs, CircuitType::ULTRA); // Construct and add to proving key the wire, selector and copy constraint polynomials - Trace::populate(circuit, circuit_proving_key); + Trace::populate(circuit, *circuit_proving_key); enforce_nonzero_selector_polynomials(circuit, circuit_proving_key.get()); diff --git a/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.cpp b/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.cpp index a32119bf478..d1e0247a4a0 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.cpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.cpp @@ -6,11 +6,10 @@ namespace bb { template -void ExecutionTrace_::populate(Builder& builder, - const std::shared_ptr& proving_key) +void ExecutionTrace_::populate(Builder& builder, typename Flavor::ProvingKey& proving_key) { // Construct wire polynomials, selector polynomials, and copy cycles from raw circuit data - auto trace_data = construct_trace_data(builder, proving_key->circuit_size); + auto trace_data = construct_trace_data(builder, proving_key.circuit_size); add_wires_and_selectors_to_proving_key(trace_data, builder, proving_key); @@ -23,45 +22,47 @@ void ExecutionTrace_::populate(Builder& builder, } // Compute the permutation argument polynomials (sigma/id) and add them to proving key - compute_permutation_argument_polynomials(builder, proving_key.get(), trace_data.copy_cycles); + compute_permutation_argument_polynomials(builder, &proving_key, trace_data.copy_cycles); } template -void ExecutionTrace_::add_wires_and_selectors_to_proving_key( - TraceData& trace_data, Builder& builder, const std::shared_ptr& proving_key) +void ExecutionTrace_::add_wires_and_selectors_to_proving_key(TraceData& trace_data, + Builder& builder, + typename Flavor::ProvingKey& proving_key) { if constexpr (IsHonkFlavor) { - for (auto [pkey_wire, trace_wire] : zip_view(proving_key->get_wires(), trace_data.wires)) { + for (auto [pkey_wire, trace_wire] : zip_view(proving_key.get_wires(), trace_data.wires)) { pkey_wire = trace_wire.share(); } - for (auto [pkey_selector, trace_selector] : zip_view(proving_key->get_selectors(), trace_data.selectors)) { + for (auto [pkey_selector, trace_selector] : zip_view(proving_key.get_selectors(), trace_data.selectors)) { pkey_selector = trace_selector.share(); } } else if constexpr (IsPlonkFlavor) { for (size_t idx = 0; idx < trace_data.wires.size(); ++idx) { std::string wire_tag = "w_" + std::to_string(idx + 1) + "_lagrange"; - proving_key->polynomial_store.put(wire_tag, std::move(trace_data.wires[idx])); + proving_key.polynomial_store.put(wire_tag, std::move(trace_data.wires[idx])); } for (size_t idx = 0; idx < trace_data.selectors.size(); ++idx) { - proving_key->polynomial_store.put(builder.selector_names[idx] + "_lagrange", - std::move(trace_data.selectors[idx])); + proving_key.polynomial_store.put(builder.selector_names[idx] + "_lagrange", + std::move(trace_data.selectors[idx])); } } } template -void ExecutionTrace_::add_memory_records_to_proving_key( - TraceData& trace_data, Builder& builder, const std::shared_ptr& proving_key) +void ExecutionTrace_::add_memory_records_to_proving_key(TraceData& trace_data, + Builder& builder, + typename Flavor::ProvingKey& proving_key) requires IsUltraPlonkOrHonk { - ASSERT(proving_key->memory_read_records.empty() && proving_key->memory_write_records.empty()); + ASSERT(proving_key.memory_read_records.empty() && proving_key.memory_write_records.empty()); // Update indices of RAM/ROM reads/writes based on where block containing these gates sits in the trace for (auto& index : builder.memory_read_records) { - proving_key->memory_read_records.emplace_back(index + trace_data.ram_rom_offset); + proving_key.memory_read_records.emplace_back(index + trace_data.ram_rom_offset); } for (auto& index : builder.memory_write_records) { - proving_key->memory_write_records.emplace_back(index + trace_data.ram_rom_offset); + proving_key.memory_write_records.emplace_back(index + trace_data.ram_rom_offset); } } @@ -130,20 +131,20 @@ template void ExecutionTrace_::populate_public_inputs_blo } template -void ExecutionTrace_::add_ecc_op_wires_to_proving_key( - Builder& builder, const std::shared_ptr& proving_key) +void ExecutionTrace_::add_ecc_op_wires_to_proving_key(Builder& builder, + typename Flavor::ProvingKey& proving_key) requires IsGoblinFlavor { // Initialize the ecc op wire polynomials to zero on the whole domain std::array op_wire_polynomials; for (auto& poly : op_wire_polynomials) { - poly = Polynomial{ proving_key->circuit_size }; + poly = Polynomial{ proving_key.circuit_size }; } - Polynomial ecc_op_selector{ proving_key->circuit_size }; + Polynomial ecc_op_selector{ proving_key.circuit_size }; // Copy the ecc op data from the conventional wires into the op wires over the range of ecc op gates const size_t op_wire_offset = Flavor::has_zero_row ? 1 : 0; - for (auto [ecc_op_wire, wire] : zip_view(op_wire_polynomials, proving_key->get_wires())) { + for (auto [ecc_op_wire, wire] : zip_view(op_wire_polynomials, proving_key.get_wires())) { for (size_t i = 0; i < builder.num_ecc_op_gates; ++i) { size_t idx = i + op_wire_offset; ecc_op_wire[idx] = wire[idx]; @@ -151,12 +152,12 @@ void ExecutionTrace_::add_ecc_op_wires_to_proving_key( } } - proving_key->num_ecc_op_gates = builder.num_ecc_op_gates; - proving_key->ecc_op_wire_1 = op_wire_polynomials[0].share(); - proving_key->ecc_op_wire_2 = op_wire_polynomials[1].share(); - proving_key->ecc_op_wire_3 = op_wire_polynomials[2].share(); - proving_key->ecc_op_wire_4 = op_wire_polynomials[3].share(); - proving_key->lagrange_ecc_op = ecc_op_selector.share(); + proving_key.num_ecc_op_gates = builder.num_ecc_op_gates; + proving_key.ecc_op_wire_1 = op_wire_polynomials[0].share(); + proving_key.ecc_op_wire_2 = op_wire_polynomials[1].share(); + proving_key.ecc_op_wire_3 = op_wire_polynomials[2].share(); + proving_key.ecc_op_wire_4 = op_wire_polynomials[3].share(); + proving_key.lagrange_ecc_op = ecc_op_selector.share(); } template class ExecutionTrace_; diff --git a/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.hpp b/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.hpp index 55f45e5158b..f9b7024f8cf 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.hpp @@ -42,7 +42,7 @@ template class ExecutionTrace_ { * * @param builder */ - static void populate(Builder& builder, const std::shared_ptr&); + static void populate(Builder& builder, ProvingKey&); private: /** @@ -54,7 +54,7 @@ template class ExecutionTrace_ { */ static void add_wires_and_selectors_to_proving_key(TraceData& trace_data, Builder& builder, - const std::shared_ptr& proving_key); + typename Flavor::ProvingKey& proving_key); /** * @brief Add the memory records indicating which rows correspond to RAM/ROM reads/writes @@ -70,7 +70,7 @@ template class ExecutionTrace_ { */ static void add_memory_records_to_proving_key(TraceData& trace_data, Builder& builder, - const std::shared_ptr& proving_key) + typename Flavor::ProvingKey& proving_key) requires IsUltraPlonkOrHonk; /** @@ -98,8 +98,7 @@ template class ExecutionTrace_ { * @param builder * @param proving_key */ - static void add_ecc_op_wires_to_proving_key(Builder& builder, - const std::shared_ptr& proving_key) + static void add_ecc_op_wires_to_proving_key(Builder& builder, typename Flavor::ProvingKey& proving_key) requires IsGoblinFlavor; }; diff --git a/barretenberg/cpp/src/barretenberg/proof_system/instance_inspector.hpp b/barretenberg/cpp/src/barretenberg/proof_system/instance_inspector.hpp index d0913aef1c4..add3db82ec1 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/instance_inspector.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/instance_inspector.hpp @@ -49,7 +49,7 @@ void print_databus_info(auto& prover_instance) { info("\nInstance Inspector: Printing databus gate info."); auto& key = prover_instance->proving_key; - for (size_t idx = 0; idx < prover_instance->proving_key->circuit_size; ++idx) { + for (size_t idx = 0; idx < prover_instance->proving_key.circuit_size; ++idx) { if (key->q_busread[idx] == 1) { info("idx = ", idx); info("q_busread = ", key->q_busread[idx]); diff --git a/barretenberg/cpp/src/barretenberg/protogalaxy/combiner.test.cpp b/barretenberg/cpp/src/barretenberg/protogalaxy/combiner.test.cpp index 390ccd71779..4d8fcd379d6 100644 --- a/barretenberg/cpp/src/barretenberg/protogalaxy/combiner.test.cpp +++ b/barretenberg/cpp/src/barretenberg/protogalaxy/combiner.test.cpp @@ -45,8 +45,8 @@ TEST(Protogalaxy, CombinerOn2Instances) /*log_circuit_size=*/1, idx * 128); restrict_to_standard_arithmetic_relation(prover_polynomials); instance->prover_polynomials = std::move(prover_polynomials); - instance->proving_key = std::make_shared(); - instance->proving_key->circuit_size = 2; + instance->proving_key = Flavor::ProvingKey(); + instance->proving_key.circuit_size = 2; instance_data[idx] = instance; } @@ -78,8 +78,8 @@ TEST(Protogalaxy, CombinerOn2Instances) /*log_circuit_size=*/1); restrict_to_standard_arithmetic_relation(prover_polynomials); instance->prover_polynomials = std::move(prover_polynomials); - instance->proving_key = std::make_shared(); - instance->proving_key->circuit_size = 2; + instance->proving_key = Flavor::ProvingKey(); + instance->proving_key.circuit_size = 2; instance_data[idx] = instance; } @@ -169,8 +169,8 @@ TEST(Protogalaxy, CombinerOn4Instances) auto prover_polynomials = get_zero_prover_polynomials( /*log_circuit_size=*/1); instance->prover_polynomials = std::move(prover_polynomials); - instance->proving_key = std::make_shared(); - instance->proving_key->circuit_size = 2; + instance->proving_key = Flavor::ProvingKey(); + instance->proving_key.circuit_size = 2; instance_data[idx] = instance; } diff --git a/barretenberg/cpp/src/barretenberg/protogalaxy/decider_prover.cpp b/barretenberg/cpp/src/barretenberg/protogalaxy/decider_prover.cpp index 0b13eefeb37..1175e6d7f8f 100644 --- a/barretenberg/cpp/src/barretenberg/protogalaxy/decider_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/protogalaxy/decider_prover.cpp @@ -17,7 +17,7 @@ DeciderProver_::DeciderProver_(const std::shared_ptr& inst, const std::shared_ptr& transcript) : accumulator(std::move(inst)) , transcript(transcript) - , commitment_key(inst->proving_key->commitment_key) + , commitment_key(inst->proving_key.commitment_key) {} /** @@ -28,7 +28,7 @@ DeciderProver_::DeciderProver_(const std::shared_ptr& inst, template void DeciderProver_::execute_relation_check_rounds() { using Sumcheck = SumcheckProver; - auto instance_size = accumulator->proving_key->circuit_size; + auto instance_size = accumulator->proving_key.circuit_size; auto sumcheck = Sumcheck(instance_size, transcript); sumcheck_output = sumcheck.prove(accumulator); } diff --git a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy.test.cpp b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy.test.cpp index 1124bfdec23..7d857a4f863 100644 --- a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy.test.cpp +++ b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy.test.cpp @@ -79,7 +79,7 @@ template class ProtoGalaxyTests : public testing::Test { static void check_accumulator_target_sum_manual(std::shared_ptr& accumulator, bool expected_result) { - auto instance_size = accumulator->proving_key->circuit_size; + auto instance_size = accumulator->proving_key.circuit_size; auto expected_honk_evals = ProtoGalaxyProver::compute_full_honk_evaluations( accumulator->prover_polynomials, accumulator->alphas, accumulator->relation_parameters); // Construct pow(\vec{betas*}) as in the paper @@ -122,11 +122,11 @@ template class ProtoGalaxyTests : public testing::Test { instance->relation_parameters.beta = FF::random_element(); instance->relation_parameters.gamma = FF::random_element(); - instance->proving_key->compute_sorted_accumulator_polynomials(instance->relation_parameters.eta); + instance->proving_key.compute_sorted_accumulator_polynomials(instance->relation_parameters.eta); if constexpr (IsGoblinFlavor) { - instance->proving_key->compute_logderivative_inverse(instance->relation_parameters); + instance->proving_key.compute_logderivative_inverse(instance->relation_parameters); } - instance->proving_key->compute_grand_product_polynomials(instance->relation_parameters); + instance->proving_key.compute_grand_product_polynomials(instance->relation_parameters); instance->prover_polynomials = ProverPolynomials(instance->proving_key); for (auto& alpha : instance->alphas) { diff --git a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.cpp b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.cpp index 93d35cad10f..6786a84cc3b 100644 --- a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.cpp @@ -27,7 +27,7 @@ template void ProtoGalaxyProver_::prepa if (!instance->is_accumulator) { finalise_and_send_instance(instance, domain_separator); instance->target_sum = 0; - instance->gate_challenges = std::vector(instance->proving_key->log_circuit_size, 0); + instance->gate_challenges = std::vector(instance->proving_key.log_circuit_size, 0); } idx++; @@ -57,7 +57,7 @@ std::shared_ptr ProtoGalaxyProver_(); next_accumulator->is_accumulator = true; - next_accumulator->proving_key = instances[0]->proving_key; + next_accumulator->proving_key = std::move(instances[0]->proving_key); // Compute the next target sum and send the next folding parameters to the verifier FF next_target_sum = @@ -69,7 +69,7 @@ std::shared_ptr ProtoGalaxyProver_proving_key->circuit_size); + polynomial = typename Flavor::Polynomial(next_accumulator->proving_key.circuit_size); } // Fold the prover polynomials @@ -92,14 +92,15 @@ std::shared_ptr ProtoGalaxyProver_proving_key->public_inputs = std::vector(instances[0]->proving_key->public_inputs.size(), 0); + next_accumulator->proving_key.public_inputs = + std::vector(next_accumulator->proving_key.public_inputs.size(), 0); size_t el_idx = 0; - for (auto& el : next_accumulator->proving_key->public_inputs) { + for (auto& el : next_accumulator->proving_key.public_inputs) { size_t inst = 0; for (auto& instance : instances) { // TODO(https://github.com/AztecProtocol/barretenberg/issues/830) - if (instance->proving_key->num_public_inputs >= next_accumulator->proving_key->num_public_inputs) { - el += instance->proving_key->public_inputs[el_idx] * lagranges[inst]; + if (instance->proving_key.num_public_inputs >= next_accumulator->proving_key.num_public_inputs) { + el += instance->proving_key.public_inputs[el_idx] * lagranges[inst]; inst++; }; } @@ -138,14 +139,14 @@ template void ProtoGalaxyProver_::pertu BB_OP_COUNT_TIME_NAME("ProtoGalaxyProver_::perturbator_round"); state.accumulator = get_accumulator(); FF delta = transcript->template get_challenge("delta"); - state.deltas = compute_round_challenge_pows(state.accumulator->proving_key->log_circuit_size, delta); - state.perturbator = Polynomial(state.accumulator->proving_key->log_circuit_size + 1); // initialize to all zeros + state.deltas = compute_round_challenge_pows(state.accumulator->proving_key.log_circuit_size, delta); + state.perturbator = Polynomial(state.accumulator->proving_key.log_circuit_size + 1); // initialize to all zeros // compute perturbator only if this is not the first round and has an accumulator if (state.accumulator->is_accumulator) { state.perturbator = compute_perturbator(state.accumulator, state.deltas); // Prover doesn't send the constant coefficient of F because this is supposed to be equal to the target sum of // the accumulator which the folding verifier has from the previous iteration. - for (size_t idx = 1; idx <= state.accumulator->proving_key->log_circuit_size; idx++) { + for (size_t idx = 1; idx <= state.accumulator->proving_key.log_circuit_size; idx++) { transcript->send_to_verifier("perturbator_" + std::to_string(idx), state.perturbator[idx]); } } diff --git a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.hpp b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.hpp index bb4be8dbb3d..51634921dc3 100644 --- a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.hpp +++ b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.hpp @@ -70,7 +70,7 @@ template class ProtoGalaxyProver_ { ProtoGalaxyProver_(const std::vector>& insts) : instances(ProverInstances(insts)) // TODO(https://github.com/AztecProtocol/barretenberg/issues/878) - , commitment_key(instances[1]->proving_key->commitment_key){}; + , commitment_key(instances[1]->proving_key.commitment_key){}; ~ProtoGalaxyProver_() = default; /** @@ -306,7 +306,7 @@ template class ProtoGalaxyProver_ { ExtendedUnivariateWithRandomization compute_combiner(const ProverInstances& instances, PowPolynomial& pow_betas) { BB_OP_COUNT_TIME(); - size_t common_instance_size = instances[0]->proving_key->circuit_size; + size_t common_instance_size = instances[0]->proving_key.circuit_size; pow_betas.compute_values(); // Determine number of threads for multithreading. // Note: Multithreading is "on" for every round but we reduce the number of threads from the max available based diff --git a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp index 7f04ee8401c..d963dfdf1cf 100644 --- a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp +++ b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp @@ -57,19 +57,19 @@ void ProverInstance_::construct_databus_polynomials(Circuit& circuit) databus_id[i] = i; } - proving_key->calldata = public_calldata.share(); - proving_key->calldata_read_counts = calldata_read_counts.share(); - proving_key->databus_id = databus_id.share(); + proving_key.calldata = public_calldata.share(); + proving_key.calldata_read_counts = calldata_read_counts.share(); + proving_key.databus_id = databus_id.share(); } template void ProverInstance_::construct_table_polynomials(Circuit& circuit, size_t dyadic_circuit_size) { auto table_polynomials = construct_lookup_table_polynomials(circuit, dyadic_circuit_size); - proving_key->table_1 = table_polynomials[0].share(); - proving_key->table_2 = table_polynomials[1].share(); - proving_key->table_3 = table_polynomials[2].share(); - proving_key->table_4 = table_polynomials[3].share(); + proving_key.table_1 = table_polynomials[0].share(); + proving_key.table_2 = table_polynomials[1].share(); + proving_key.table_3 = table_polynomials[2].share(); + proving_key.table_4 = table_polynomials[3].share(); } template class ProverInstance_; diff --git a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp index b16dd99dbf9..6a680a004e1 100644 --- a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp +++ b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp @@ -30,7 +30,7 @@ template class ProverInstance_ { using Trace = ExecutionTrace_; public: - std::shared_ptr proving_key; + ProvingKey proving_key; ProverPolynomials prover_polynomials; RelationSeparator alphas; @@ -53,7 +53,7 @@ template class ProverInstance_ { dyadic_circuit_size = compute_dyadic_size(circuit); - proving_key = std::make_shared(dyadic_circuit_size, circuit.public_inputs.size()); + proving_key = std::move(ProvingKey(dyadic_circuit_size, circuit.public_inputs.size())); // Construct and add to proving key the wire, selector and copy constraint polynomials Trace::populate(circuit, proving_key); @@ -66,24 +66,24 @@ template class ProverInstance_ { // First and last lagrange polynomials (in the full circuit size) const auto [lagrange_first, lagrange_last] = compute_first_and_last_lagrange_polynomials(dyadic_circuit_size); - proving_key->lagrange_first = lagrange_first; - proving_key->lagrange_last = lagrange_last; + proving_key.lagrange_first = lagrange_first; + proving_key.lagrange_last = lagrange_last; construct_table_polynomials(circuit, dyadic_circuit_size); - proving_key->sorted_polynomials = construct_sorted_list_polynomials(circuit, dyadic_circuit_size); + proving_key.sorted_polynomials = construct_sorted_list_polynomials(circuit, dyadic_circuit_size); - std::span public_wires_source = proving_key->w_r; + std::span public_wires_source = proving_key.w_r; // Determine public input offsets in the circuit relative to the 0th index for Ultra flavors - proving_key->pub_inputs_offset = Flavor::has_zero_row ? 1 : 0; + proving_key.pub_inputs_offset = Flavor::has_zero_row ? 1 : 0; if constexpr (IsGoblinFlavor) { - proving_key->pub_inputs_offset += proving_key->num_ecc_op_gates; + proving_key.pub_inputs_offset += proving_key.num_ecc_op_gates; } // Construct the public inputs array - for (size_t i = 0; i < proving_key->num_public_inputs; ++i) { - size_t idx = i + proving_key->pub_inputs_offset; - proving_key->public_inputs.emplace_back(public_wires_source[idx]); + for (size_t i = 0; i < proving_key.num_public_inputs; ++i) { + size_t idx = i + proving_key.pub_inputs_offset; + proving_key.public_inputs.emplace_back(public_wires_source[idx]); } } diff --git a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.test.cpp b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.test.cpp index 78f87455419..050afa5bc7b 100644 --- a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.test.cpp +++ b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.test.cpp @@ -60,11 +60,11 @@ template class InstanceTests : public testing::Test { // Get random challenge eta auto eta = FF::random_element(); - auto sorted_list_polynomials = instance.proving_key->sorted_polynomials; + auto sorted_list_polynomials = instance.proving_key.sorted_polynomials; // Method 1: computed sorted list accumulator polynomial using prover library method - instance.proving_key->compute_sorted_list_accumulator(eta); - auto sorted_list_accumulator = instance.proving_key->sorted_accum; + instance.proving_key.compute_sorted_list_accumulator(eta); + auto sorted_list_accumulator = instance.proving_key.sorted_accum; // Method 2: Compute local sorted list accumulator simply and inefficiently const FF eta_sqr = eta.sqr(); @@ -72,7 +72,7 @@ template class InstanceTests : public testing::Test { // Compute s = s_1 + η*s_2 + η²*s_3 + η³*s_4 Polynomial sorted_list_accumulator_expected{ sorted_list_polynomials[0] }; - for (size_t i = 0; i < instance.proving_key->circuit_size; ++i) { + for (size_t i = 0; i < instance.proving_key.circuit_size; ++i) { sorted_list_accumulator_expected[i] += sorted_list_polynomials[1][i] * eta + sorted_list_polynomials[2][i] * eta_sqr + sorted_list_polynomials[3][i] * eta_cube; diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/goblin_ultra_transcript.test.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/goblin_ultra_transcript.test.cpp index 82370a525e5..5364924fd13 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/goblin_ultra_transcript.test.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/goblin_ultra_transcript.test.cpp @@ -153,7 +153,7 @@ TEST_F(GoblinUltraTranscriptTests, ProverManifestConsistency) auto proof = prover.construct_proof(); // Check that the prover generated manifest agrees with the manifest hard coded in this suite - auto manifest_expected = construct_goblin_ultra_honk_manifest(instance->proving_key->circuit_size); + auto manifest_expected = construct_goblin_ultra_honk_manifest(instance->proving_key.circuit_size); auto prover_manifest = prover.transcript->get_manifest(); // Note: a manifest can be printed using manifest.print() for (size_t round = 0; round < manifest_expected.size(); ++round) { diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp index 1a8a8d123d0..d934c34858e 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp @@ -36,17 +36,17 @@ template OinkProverOutput OinkProver::pro */ template void OinkProver::execute_preamble_round() { - const auto circuit_size = static_cast(proving_key->circuit_size); - const auto num_public_inputs = static_cast(proving_key->num_public_inputs); + const auto circuit_size = static_cast(proving_key.circuit_size); + const auto num_public_inputs = static_cast(proving_key.num_public_inputs); 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(proving_key->pub_inputs_offset)); + static_cast(proving_key.pub_inputs_offset)); - ASSERT(proving_key->num_public_inputs == proving_key->public_inputs.size()); + ASSERT(proving_key.num_public_inputs == proving_key.public_inputs.size()); - for (size_t i = 0; i < proving_key->num_public_inputs; ++i) { - auto public_input_i = proving_key->public_inputs[i]; + for (size_t i = 0; i < proving_key.num_public_inputs; ++i) { + auto public_input_i = proving_key.public_inputs[i]; transcript->send_to_verifier(domain_separator + "public_input_" + std::to_string(i), public_input_i); } } @@ -60,9 +60,9 @@ template void OinkProver::execute_wire_commitment { // Commit to the first three wire polynomials of the instance // We only commit to the fourth wire polynomial after adding memory recordss - witness_commitments.w_l = commitment_key->commit(proving_key->w_l); - witness_commitments.w_r = commitment_key->commit(proving_key->w_r); - witness_commitments.w_o = commitment_key->commit(proving_key->w_o); + witness_commitments.w_l = commitment_key->commit(proving_key.w_l); + witness_commitments.w_r = commitment_key->commit(proving_key.w_r); + witness_commitments.w_o = commitment_key->commit(proving_key.w_o); auto wire_comms = witness_commitments.get_wires(); auto wire_labels = commitment_labels.get_wires(); @@ -72,10 +72,10 @@ template void OinkProver::execute_wire_commitment if constexpr (IsGoblinFlavor) { // Commit to Goblin ECC op wires - witness_commitments.ecc_op_wire_1 = commitment_key->commit(proving_key->ecc_op_wire_1); - witness_commitments.ecc_op_wire_2 = commitment_key->commit(proving_key->ecc_op_wire_2); - witness_commitments.ecc_op_wire_3 = commitment_key->commit(proving_key->ecc_op_wire_3); - witness_commitments.ecc_op_wire_4 = commitment_key->commit(proving_key->ecc_op_wire_4); + witness_commitments.ecc_op_wire_1 = commitment_key->commit(proving_key.ecc_op_wire_1); + witness_commitments.ecc_op_wire_2 = commitment_key->commit(proving_key.ecc_op_wire_2); + witness_commitments.ecc_op_wire_3 = commitment_key->commit(proving_key.ecc_op_wire_3); + witness_commitments.ecc_op_wire_4 = commitment_key->commit(proving_key.ecc_op_wire_4); auto op_wire_comms = witness_commitments.get_ecc_op_wires(); auto labels = commitment_labels.get_ecc_op_wires(); @@ -83,8 +83,8 @@ template void OinkProver::execute_wire_commitment transcript->send_to_verifier(domain_separator + labels[idx], op_wire_comms[idx]); } // Commit to DataBus columns - witness_commitments.calldata = commitment_key->commit(proving_key->calldata); - witness_commitments.calldata_read_counts = commitment_key->commit(proving_key->calldata_read_counts); + witness_commitments.calldata = commitment_key->commit(proving_key.calldata); + witness_commitments.calldata_read_counts = commitment_key->commit(proving_key.calldata_read_counts); transcript->send_to_verifier(domain_separator + commitment_labels.calldata, witness_commitments.calldata); transcript->send_to_verifier(domain_separator + commitment_labels.calldata_read_counts, witness_commitments.calldata_read_counts); @@ -99,11 +99,11 @@ template void OinkProver::execute_sorted_list_acc { relation_parameters.eta = transcript->template get_challenge(domain_separator + "eta"); - proving_key->compute_sorted_accumulator_polynomials(relation_parameters.eta); + proving_key.compute_sorted_accumulator_polynomials(relation_parameters.eta); // Commit to the sorted witness-table accumulator and the finalized (i.e. with memory records) fourth wire // polynomial - witness_commitments.sorted_accum = commitment_key->commit(proving_key->sorted_accum); - witness_commitments.w_4 = commitment_key->commit(proving_key->w_4); + witness_commitments.sorted_accum = commitment_key->commit(proving_key.sorted_accum); + witness_commitments.w_4 = commitment_key->commit(proving_key.w_4); transcript->send_to_verifier(domain_separator + commitment_labels.sorted_accum, witness_commitments.sorted_accum); transcript->send_to_verifier(domain_separator + commitment_labels.w_4, witness_commitments.w_4); @@ -120,8 +120,8 @@ template void OinkProver::execute_log_derivative_ relation_parameters.gamma = gamma; if constexpr (IsGoblinFlavor) { // Compute and commit to the logderivative inverse used in DataBus - proving_key->compute_logderivative_inverse(relation_parameters); - witness_commitments.lookup_inverses = commitment_key->commit(proving_key->lookup_inverses); + proving_key.compute_logderivative_inverse(relation_parameters); + witness_commitments.lookup_inverses = commitment_key->commit(proving_key.lookup_inverses); transcript->send_to_verifier(domain_separator + commitment_labels.lookup_inverses, witness_commitments.lookup_inverses); } @@ -134,10 +134,10 @@ template void OinkProver::execute_log_derivative_ template void OinkProver::execute_grand_product_computation_round() { - proving_key->compute_grand_product_polynomials(relation_parameters); + proving_key.compute_grand_product_polynomials(relation_parameters); - witness_commitments.z_perm = commitment_key->commit(proving_key->z_perm); - witness_commitments.z_lookup = commitment_key->commit(proving_key->z_lookup); + witness_commitments.z_perm = commitment_key->commit(proving_key.z_perm); + witness_commitments.z_lookup = commitment_key->commit(proving_key.z_lookup); transcript->send_to_verifier(domain_separator + commitment_labels.z_perm, witness_commitments.z_perm); transcript->send_to_verifier(domain_separator + commitment_labels.z_lookup, witness_commitments.z_lookup); diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.hpp b/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.hpp index fcf81279651..f6106642008 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.hpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.hpp @@ -43,7 +43,7 @@ template class OinkProver { using FF = typename Flavor::FF; public: - std::shared_ptr proving_key; + ProvingKey& proving_key; std::shared_ptr transcript; std::shared_ptr commitment_key; std::string domain_separator; @@ -52,7 +52,7 @@ template class OinkProver { bb::RelationParameters relation_parameters; - OinkProver(const std::shared_ptr& proving_key, + OinkProver(ProvingKey& proving_key, const std::shared_ptr& commitment_key, const std::shared_ptr& transcript, std::string domain_separator = "") diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/relation_correctness.test.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/relation_correctness.test.cpp index d45a41961a5..2ac8ae59e6d 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/relation_correctness.test.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/relation_correctness.test.cpp @@ -264,23 +264,23 @@ TEST_F(RelationCorrectnessTests, UltraRelationCorrectness) // Create a prover (it will compute proving key and witness) auto instance = std::make_shared>(builder); auto proving_key = instance->proving_key; - auto circuit_size = proving_key->circuit_size; + auto circuit_size = proving_key.circuit_size; // Generate eta, beta and gamma instance->relation_parameters.eta = FF::random_element(); instance->relation_parameters.beta = FF::random_element(); instance->relation_parameters.gamma = FF::random_element(); - instance->proving_key->compute_sorted_accumulator_polynomials(instance->relation_parameters.eta); - instance->proving_key->compute_grand_product_polynomials(instance->relation_parameters); + instance->proving_key.compute_sorted_accumulator_polynomials(instance->relation_parameters.eta); + instance->proving_key.compute_grand_product_polynomials(instance->relation_parameters); instance->prover_polynomials = Flavor::ProverPolynomials(instance->proving_key); // Check that selectors are nonzero to ensure corresponding relation has nontrivial contribution - ensure_non_zero(proving_key->q_arith); - ensure_non_zero(proving_key->q_sort); - ensure_non_zero(proving_key->q_lookup); - ensure_non_zero(proving_key->q_elliptic); - ensure_non_zero(proving_key->q_aux); + ensure_non_zero(proving_key.q_arith); + ensure_non_zero(proving_key.q_sort); + ensure_non_zero(proving_key.q_lookup); + ensure_non_zero(proving_key.q_elliptic); + ensure_non_zero(proving_key.q_aux); // Construct the round for applying sumcheck relations and results for storing computed results using Relations = typename Flavor::Relations; @@ -316,31 +316,31 @@ TEST_F(RelationCorrectnessTests, GoblinUltraRelationCorrectness) // Create a prover (it will compute proving key and witness) auto instance = std::make_shared>(builder); auto proving_key = instance->proving_key; - auto circuit_size = proving_key->circuit_size; + auto circuit_size = proving_key.circuit_size; // Generate eta, beta and gamma instance->relation_parameters.eta = FF::random_element(); instance->relation_parameters.beta = FF::random_element(); instance->relation_parameters.gamma = FF::random_element(); - instance->proving_key->compute_sorted_accumulator_polynomials(instance->relation_parameters.eta); - instance->proving_key->compute_logderivative_inverse(instance->relation_parameters); - instance->proving_key->compute_grand_product_polynomials(instance->relation_parameters); + instance->proving_key.compute_sorted_accumulator_polynomials(instance->relation_parameters.eta); + instance->proving_key.compute_logderivative_inverse(instance->relation_parameters); + instance->proving_key.compute_grand_product_polynomials(instance->relation_parameters); instance->prover_polynomials = Flavor::ProverPolynomials(instance->proving_key); // Check that selectors are nonzero to ensure corresponding relation has nontrivial contribution - ensure_non_zero(proving_key->q_arith); - ensure_non_zero(proving_key->q_sort); - ensure_non_zero(proving_key->q_lookup); - ensure_non_zero(proving_key->q_elliptic); - ensure_non_zero(proving_key->q_aux); - ensure_non_zero(proving_key->q_busread); - ensure_non_zero(proving_key->q_poseidon2_external); - ensure_non_zero(proving_key->q_poseidon2_internal); - - ensure_non_zero(proving_key->calldata); - ensure_non_zero(proving_key->calldata_read_counts); - ensure_non_zero(proving_key->lookup_inverses); + ensure_non_zero(proving_key.q_arith); + ensure_non_zero(proving_key.q_sort); + ensure_non_zero(proving_key.q_lookup); + ensure_non_zero(proving_key.q_elliptic); + ensure_non_zero(proving_key.q_aux); + ensure_non_zero(proving_key.q_busread); + ensure_non_zero(proving_key.q_poseidon2_external); + ensure_non_zero(proving_key.q_poseidon2_internal); + + ensure_non_zero(proving_key.calldata); + ensure_non_zero(proving_key.calldata_read_counts); + ensure_non_zero(proving_key.lookup_inverses); // Construct the round for applying sumcheck relations and results for storing computed results using Relations = typename Flavor::Relations; diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/sumcheck.test.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/sumcheck.test.cpp index de6a18f09d5..8e46f15c446 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/sumcheck.test.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/sumcheck.test.cpp @@ -154,12 +154,12 @@ TEST_F(SumcheckTestsRealCircuit, Ultra) instance->relation_parameters.beta = FF::random_element(); instance->relation_parameters.gamma = FF::random_element(); - instance->proving_key->compute_sorted_accumulator_polynomials(instance->relation_parameters.eta); - instance->proving_key->compute_grand_product_polynomials(instance->relation_parameters); + instance->proving_key.compute_sorted_accumulator_polynomials(instance->relation_parameters.eta); + instance->proving_key.compute_grand_product_polynomials(instance->relation_parameters); instance->prover_polynomials = Flavor::ProverPolynomials(instance->proving_key); auto prover_transcript = Transcript::prover_init_empty(); - auto circuit_size = instance->proving_key->circuit_size; + auto circuit_size = instance->proving_key.circuit_size; auto log_circuit_size = numeric::get_msb(circuit_size); RelationSeparator prover_alphas; diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_composer.test.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_composer.test.cpp index 43d1ad26498..cf9dd85da91 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_composer.test.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_composer.test.cpp @@ -72,15 +72,15 @@ TEST_F(UltraHonkComposerTests, ANonZeroPolynomialIsAGoodPolynomial) auto proof = prover.construct_proof(); auto proving_key = instance->proving_key; - for (auto& poly : proving_key->get_selectors()) { + for (auto& poly : proving_key.get_selectors()) { ensure_non_zero(poly); } - for (auto& poly : proving_key->get_table_polynomials()) { + for (auto& poly : proving_key.get_table_polynomials()) { ensure_non_zero(poly); } - for (auto& poly : proving_key->get_wires()) { + for (auto& poly : proving_key.get_wires()) { ensure_non_zero(poly); } } diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_prover.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_prover.cpp index a8bce2bfc93..bf2087e7f19 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_prover.cpp @@ -14,7 +14,7 @@ template UltraProver_::UltraProver_(const std::shared_ptr& inst, const std::shared_ptr& transcript) : instance(std::move(inst)) , transcript(transcript) - , commitment_key(instance->proving_key->commitment_key) + , commitment_key(instance->proving_key.commitment_key) , oink_prover(inst->proving_key, commitment_key, transcript, "") {} @@ -29,7 +29,7 @@ template UltraProver_::UltraProver_(Builder& circuit) : instance(std::make_shared(circuit)) , transcript(std::make_shared()) - , commitment_key(instance->proving_key->commitment_key) + , commitment_key(instance->proving_key.commitment_key) , oink_prover(instance->proving_key, commitment_key, transcript, "") {} @@ -40,7 +40,7 @@ UltraProver_::UltraProver_(Builder& circuit) template void UltraProver_::execute_relation_check_rounds() { using Sumcheck = SumcheckProver; - auto circuit_size = instance->proving_key->circuit_size; + auto circuit_size = instance->proving_key.circuit_size; auto sumcheck = Sumcheck(circuit_size, transcript); RelationSeparator alphas; for (size_t idx = 0; idx < alphas.size(); idx++) { diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_transcript.test.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_transcript.test.cpp index 17383a15d2c..36dadc0af1e 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_transcript.test.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_transcript.test.cpp @@ -140,7 +140,7 @@ TEST_F(UltraTranscriptTests, ProverManifestConsistency) auto proof = prover.construct_proof(); // Check that the prover generated manifest agrees with the manifest hard coded in this suite - auto manifest_expected = construct_ultra_honk_manifest(instance->proving_key->circuit_size); + auto manifest_expected = construct_ultra_honk_manifest(instance->proving_key.circuit_size); auto prover_manifest = prover.transcript->get_manifest(); // Note: a manifest can be printed using manifest.print() for (size_t round = 0; round < manifest_expected.size(); ++round) { From 2d019cd3053132318704d0ed2527b0d1baef9208 Mon Sep 17 00:00:00 2001 From: lucasxia01 Date: Fri, 22 Mar 2024 20:58:54 +0000 Subject: [PATCH 19/25] bye bye shared ptrs for ultra/goblin ultra proving_keys :) --- .../client_ivc/mock_kernel_pinning.test.cpp | 4 +- .../cpp/src/barretenberg/flavor/flavor.hpp | 25 +++++---- .../barretenberg/flavor/goblin_translator.hpp | 20 +++++-- .../src/barretenberg/flavor/goblin_ultra.hpp | 33 +++++++---- .../cpp/src/barretenberg/flavor/ultra.hpp | 33 ++++++----- .../goblin/mock_circuits_pinning.test.cpp | 8 +-- .../plonk/composer/standard_composer.cpp | 2 +- .../plonk/composer/ultra_composer.cpp | 2 +- .../execution_trace/execution_trace.cpp | 55 ++++++++++--------- .../execution_trace/execution_trace.hpp | 9 ++- .../proof_system/instance_inspector.hpp | 2 +- .../protogalaxy/combiner.test.cpp | 12 ++-- .../protogalaxy/decider_prover.cpp | 4 +- .../protogalaxy/protogalaxy.test.cpp | 8 +-- .../protogalaxy/protogalaxy_prover.cpp | 21 +++---- .../protogalaxy/protogalaxy_prover.hpp | 4 +- .../sumcheck/instance/prover_instance.cpp | 14 ++--- .../sumcheck/instance/prover_instance.hpp | 22 ++++---- .../instance/prover_instance.test.cpp | 8 +-- .../goblin_ultra_transcript.test.cpp | 2 +- .../barretenberg/ultra_honk/oink_prover.cpp | 46 ++++++++-------- .../barretenberg/ultra_honk/oink_prover.hpp | 4 +- .../ultra_honk/relation_correctness.test.cpp | 48 ++++++++-------- .../barretenberg/ultra_honk/sumcheck.test.cpp | 6 +- .../ultra_honk/ultra_composer.test.cpp | 6 +- .../barretenberg/ultra_honk/ultra_prover.cpp | 6 +- .../ultra_honk/ultra_transcript.test.cpp | 2 +- 27 files changed, 216 insertions(+), 190 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/client_ivc/mock_kernel_pinning.test.cpp b/barretenberg/cpp/src/barretenberg/client_ivc/mock_kernel_pinning.test.cpp index 5d48c880294..87ec85f94d0 100644 --- a/barretenberg/cpp/src/barretenberg/client_ivc/mock_kernel_pinning.test.cpp +++ b/barretenberg/cpp/src/barretenberg/client_ivc/mock_kernel_pinning.test.cpp @@ -37,7 +37,7 @@ TEST_F(MockKernelTest, PinFoldingKernelSizes) kernel_circuit, { func_fold_proof, ivc.vks.func_vk }, {}, kernel_acc); auto kernel_fold_proof = ivc.accumulate(kernel_circuit); - EXPECT_EQ(ivc.prover_instance->proving_key->log_circuit_size, 17); + EXPECT_EQ(ivc.prover_instance->proving_key.log_circuit_size, 17); GoblinUltraCircuitBuilder circuit_3{ ivc.goblin.op_queue }; GoblinMockCircuits::construct_mock_function_circuit(circuit_3); @@ -49,5 +49,5 @@ TEST_F(MockKernelTest, PinFoldingKernelSizes) { func_fold_proof, ivc.vks.func_vk }, kernel_acc); auto instance = std::make_shared(kernel_circuit); - EXPECT_EQ(instance->proving_key->log_circuit_size, 17); + EXPECT_EQ(instance->proving_key.log_circuit_size, 17); } \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp b/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp index fd80d637de5..af077a3af01 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp @@ -159,6 +159,7 @@ class VerificationKey_ : public PrecomputedCommitments { size_t pub_inputs_offset = 0; VerificationKey_() = default; + // VerificationKey_(const VerificationKey_& other) = default; VerificationKey_(const size_t circuit_size, const size_t num_public_inputs) { this->circuit_size = circuit_size; @@ -166,18 +167,18 @@ class VerificationKey_ : public PrecomputedCommitments { this->num_public_inputs = num_public_inputs; }; - template VerificationKey_(const ProvingKeyPtr& proving_key) - { - this->pcs_verification_key = std::make_shared(); - this->circuit_size = proving_key->circuit_size; - this->log_circuit_size = numeric::get_msb(this->circuit_size); - this->num_public_inputs = proving_key->num_public_inputs; - this->pub_inputs_offset = proving_key->pub_inputs_offset; - - for (auto [polynomial, commitment] : zip_view(proving_key->get_precomputed_polynomials(), this->get_all())) { - commitment = proving_key->commitment_key->commit(polynomial); - } - } + // VerificationKey_(ProvingKey& proving_key) + // { + // this->pcs_verification_key = std::make_shared(); + // this->circuit_size = proving_key.circuit_size; + // this->log_circuit_size = numeric::get_msb(this->circuit_size); + // this->num_public_inputs = proving_key.num_public_inputs; + // this->pub_inputs_offset = proving_key.pub_inputs_offset; + + // for (auto [polynomial, commitment] : zip_view(proving_key.get_precomputed_polynomials(), this->get_all())) { + // commitment = proving_key.commitment_key->commit(polynomial); + // } + // } }; // Because of how Gemini is written, is importat to put the polynomials out in this order. diff --git a/barretenberg/cpp/src/barretenberg/flavor/goblin_translator.hpp b/barretenberg/cpp/src/barretenberg/flavor/goblin_translator.hpp index 211171f0087..25733521d5e 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/goblin_translator.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/goblin_translator.hpp @@ -1046,12 +1046,20 @@ class GoblinTranslatorFlavor { VerificationKey(const size_t circuit_size, const size_t num_public_inputs) : VerificationKey_(circuit_size, num_public_inputs) {} - - template - VerificationKey(const ProvingKeyPtr& proving_key) - : VerificationKey_(proving_key) - , public_inputs(proving_key->public_inputs) - {} + VerificationKey(const std::shared_ptr& proving_key) + : public_inputs(proving_key->public_inputs) + { + this->pcs_verification_key = std::make_shared(); + this->circuit_size = proving_key->circuit_size; + this->log_circuit_size = numeric::get_msb(this->circuit_size); + this->num_public_inputs = proving_key->num_public_inputs; + this->pub_inputs_offset = proving_key->pub_inputs_offset; + + for (auto [polynomial, commitment] : + zip_view(proving_key->get_precomputed_polynomials(), this->get_all())) { + commitment = proving_key->commitment_key->commit(polynomial); + } + } }; /** * @brief A field element for each entity of the flavor. These entities represent the prover polynomials diff --git a/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp b/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp index 944a6142d1d..bd85dd2062a 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/goblin_ultra.hpp @@ -408,8 +408,27 @@ class GoblinUltraFlavor { * circuits. * @todo TODO(https://github.com/AztecProtocol/barretenberg/issues/876) */ - using VerificationKey = VerificationKey_, VerifierCommitmentKey>; + // using VerificationKey = VerificationKey_, VerifierCommitmentKey>; + class VerificationKey : public VerificationKey_, VerifierCommitmentKey> { + public: + VerificationKey() = default; + VerificationKey(const size_t circuit_size, const size_t num_public_inputs) + : VerificationKey_(circuit_size, num_public_inputs) + {} + VerificationKey(ProvingKey& proving_key) + { + this->pcs_verification_key = std::make_shared(); + this->circuit_size = proving_key.circuit_size; + this->log_circuit_size = numeric::get_msb(this->circuit_size); + this->num_public_inputs = proving_key.num_public_inputs; + this->pub_inputs_offset = proving_key.pub_inputs_offset; + + for (auto [polynomial, commitment] : zip_view(proving_key.get_precomputed_polynomials(), this->get_all())) { + commitment = proving_key.commitment_key->commit(polynomial); + } + } + }; /** * @brief A container for storing the partially evaluated multivariates produced by sumcheck. */ @@ -452,6 +471,7 @@ class GoblinUltraFlavor { */ class ProverPolynomials : public AllEntities { public: + // TODO(https://github.com/AztecProtocol/barretenberg/issues/925), proving_key could be const ref ProverPolynomials(ProvingKey& proving_key) { for (auto [prover_poly, key_poly] : zip_view(this->get_unshifted(), proving_key.get_all())) { @@ -463,17 +483,6 @@ class GoblinUltraFlavor { prover_poly = key_poly.shifted(); } } - ProverPolynomials(std::shared_ptr& proving_key) - { - for (auto [prover_poly, key_poly] : zip_view(this->get_unshifted(), proving_key->get_all())) { - ASSERT(flavor_get_label(*this, prover_poly) == flavor_get_label(*proving_key, key_poly)); - prover_poly = key_poly.share(); - } - for (auto [prover_poly, key_poly] : zip_view(this->get_shifted(), proving_key->get_to_be_shifted())) { - ASSERT(flavor_get_label(*this, prover_poly) == (flavor_get_label(*proving_key, key_poly) + "_shift")); - prover_poly = key_poly.shifted(); - } - } // Define all operations as default, except move construction/assignment ProverPolynomials() = default; ProverPolynomials& operator=(const ProverPolynomials&) = delete; diff --git a/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp b/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp index b2f0d8901c8..af31d3d9c99 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/ultra.hpp @@ -396,8 +396,26 @@ class UltraFlavor { * that, and split out separate PrecomputedPolynomials/Commitments data for clarity but also for portability of our * circuits. */ - using VerificationKey = VerificationKey_, VerifierCommitmentKey>; - + // using VerificationKey = VerificationKey_, VerifierCommitmentKey>; + class VerificationKey : public VerificationKey_, VerifierCommitmentKey> { + public: + VerificationKey() = default; + VerificationKey(const size_t circuit_size, const size_t num_public_inputs) + : VerificationKey_(circuit_size, num_public_inputs) + {} + VerificationKey(ProvingKey& proving_key) + { + this->pcs_verification_key = std::make_shared(); + this->circuit_size = proving_key.circuit_size; + this->log_circuit_size = numeric::get_msb(this->circuit_size); + this->num_public_inputs = proving_key.num_public_inputs; + this->pub_inputs_offset = proving_key.pub_inputs_offset; + + for (auto [polynomial, commitment] : zip_view(proving_key.get_precomputed_polynomials(), this->get_all())) { + commitment = proving_key.commitment_key->commit(polynomial); + } + } + }; /** * @brief A field element for each entity of the flavor. These entities represent the prover polynomials * evaluated at one point. @@ -424,17 +442,6 @@ class UltraFlavor { prover_poly = key_poly.shifted(); } } - ProverPolynomials(std::shared_ptr& proving_key) - { - for (auto [prover_poly, key_poly] : zip_view(this->get_unshifted(), proving_key->get_all())) { - ASSERT(flavor_get_label(*this, prover_poly) == flavor_get_label(*proving_key, key_poly)); - prover_poly = key_poly.share(); - } - for (auto [prover_poly, key_poly] : zip_view(this->get_shifted(), proving_key->get_to_be_shifted())) { - ASSERT(flavor_get_label(*this, prover_poly) == (flavor_get_label(*proving_key, key_poly) + "_shift")); - prover_poly = key_poly.shifted(); - } - } // Define all operations as default, except move construction/assignment ProverPolynomials() = default; ProverPolynomials& operator=(const ProverPolynomials&) = delete; diff --git a/barretenberg/cpp/src/barretenberg/goblin/mock_circuits_pinning.test.cpp b/barretenberg/cpp/src/barretenberg/goblin/mock_circuits_pinning.test.cpp index 752e2b32afb..90caad9ebe6 100644 --- a/barretenberg/cpp/src/barretenberg/goblin/mock_circuits_pinning.test.cpp +++ b/barretenberg/cpp/src/barretenberg/goblin/mock_circuits_pinning.test.cpp @@ -25,9 +25,9 @@ TEST_F(MockCircuitsPinning, FunctionSizes) GoblinMockCircuits::construct_mock_function_circuit(app_circuit, large); auto instance = std::make_shared(app_circuit); if (large) { - EXPECT_EQ(instance->proving_key->log_circuit_size, 19); + EXPECT_EQ(instance->proving_key.log_circuit_size, 19); } else { - EXPECT_EQ(instance->proving_key->log_circuit_size, 17); + EXPECT_EQ(instance->proving_key.log_circuit_size, 17); }; }; run_test(true); @@ -51,9 +51,9 @@ TEST_F(MockCircuitsPinning, RecursionKernelSizes) auto instance = std::make_shared(kernel_circuit); if (large) { - EXPECT_EQ(instance->proving_key->log_circuit_size, 17); + EXPECT_EQ(instance->proving_key.log_circuit_size, 17); } else { - EXPECT_EQ(instance->proving_key->log_circuit_size, 17); + EXPECT_EQ(instance->proving_key.log_circuit_size, 17); }; } }; diff --git a/barretenberg/cpp/src/barretenberg/plonk/composer/standard_composer.cpp b/barretenberg/cpp/src/barretenberg/plonk/composer/standard_composer.cpp index 4647323de23..7fcfe6b9e31 100644 --- a/barretenberg/cpp/src/barretenberg/plonk/composer/standard_composer.cpp +++ b/barretenberg/cpp/src/barretenberg/plonk/composer/standard_composer.cpp @@ -41,7 +41,7 @@ std::shared_ptr StandardComposer::compute_proving_key(Circui subgroup_size, circuit_constructor.public_inputs.size(), crs, CircuitType::STANDARD); // Construct and add to proving key the wire, selector and copy constraint polynomials - Trace::populate(circuit_constructor, circuit_proving_key); + Trace::populate(circuit_constructor, *circuit_proving_key); // Make all selectors nonzero enforce_nonzero_selector_polynomials(circuit_constructor, circuit_proving_key.get()); diff --git a/barretenberg/cpp/src/barretenberg/plonk/composer/ultra_composer.cpp b/barretenberg/cpp/src/barretenberg/plonk/composer/ultra_composer.cpp index 951716ece8c..ded45ec581e 100644 --- a/barretenberg/cpp/src/barretenberg/plonk/composer/ultra_composer.cpp +++ b/barretenberg/cpp/src/barretenberg/plonk/composer/ultra_composer.cpp @@ -166,7 +166,7 @@ std::shared_ptr UltraComposer::compute_proving_key(CircuitBuilder& std::make_shared(subgroup_size, circuit.public_inputs.size(), crs, CircuitType::ULTRA); // Construct and add to proving key the wire, selector and copy constraint polynomials - Trace::populate(circuit, circuit_proving_key); + Trace::populate(circuit, *circuit_proving_key); enforce_nonzero_selector_polynomials(circuit, circuit_proving_key.get()); diff --git a/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.cpp b/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.cpp index a32119bf478..d1e0247a4a0 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.cpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.cpp @@ -6,11 +6,10 @@ namespace bb { template -void ExecutionTrace_::populate(Builder& builder, - const std::shared_ptr& proving_key) +void ExecutionTrace_::populate(Builder& builder, typename Flavor::ProvingKey& proving_key) { // Construct wire polynomials, selector polynomials, and copy cycles from raw circuit data - auto trace_data = construct_trace_data(builder, proving_key->circuit_size); + auto trace_data = construct_trace_data(builder, proving_key.circuit_size); add_wires_and_selectors_to_proving_key(trace_data, builder, proving_key); @@ -23,45 +22,47 @@ void ExecutionTrace_::populate(Builder& builder, } // Compute the permutation argument polynomials (sigma/id) and add them to proving key - compute_permutation_argument_polynomials(builder, proving_key.get(), trace_data.copy_cycles); + compute_permutation_argument_polynomials(builder, &proving_key, trace_data.copy_cycles); } template -void ExecutionTrace_::add_wires_and_selectors_to_proving_key( - TraceData& trace_data, Builder& builder, const std::shared_ptr& proving_key) +void ExecutionTrace_::add_wires_and_selectors_to_proving_key(TraceData& trace_data, + Builder& builder, + typename Flavor::ProvingKey& proving_key) { if constexpr (IsHonkFlavor) { - for (auto [pkey_wire, trace_wire] : zip_view(proving_key->get_wires(), trace_data.wires)) { + for (auto [pkey_wire, trace_wire] : zip_view(proving_key.get_wires(), trace_data.wires)) { pkey_wire = trace_wire.share(); } - for (auto [pkey_selector, trace_selector] : zip_view(proving_key->get_selectors(), trace_data.selectors)) { + for (auto [pkey_selector, trace_selector] : zip_view(proving_key.get_selectors(), trace_data.selectors)) { pkey_selector = trace_selector.share(); } } else if constexpr (IsPlonkFlavor) { for (size_t idx = 0; idx < trace_data.wires.size(); ++idx) { std::string wire_tag = "w_" + std::to_string(idx + 1) + "_lagrange"; - proving_key->polynomial_store.put(wire_tag, std::move(trace_data.wires[idx])); + proving_key.polynomial_store.put(wire_tag, std::move(trace_data.wires[idx])); } for (size_t idx = 0; idx < trace_data.selectors.size(); ++idx) { - proving_key->polynomial_store.put(builder.selector_names[idx] + "_lagrange", - std::move(trace_data.selectors[idx])); + proving_key.polynomial_store.put(builder.selector_names[idx] + "_lagrange", + std::move(trace_data.selectors[idx])); } } } template -void ExecutionTrace_::add_memory_records_to_proving_key( - TraceData& trace_data, Builder& builder, const std::shared_ptr& proving_key) +void ExecutionTrace_::add_memory_records_to_proving_key(TraceData& trace_data, + Builder& builder, + typename Flavor::ProvingKey& proving_key) requires IsUltraPlonkOrHonk { - ASSERT(proving_key->memory_read_records.empty() && proving_key->memory_write_records.empty()); + ASSERT(proving_key.memory_read_records.empty() && proving_key.memory_write_records.empty()); // Update indices of RAM/ROM reads/writes based on where block containing these gates sits in the trace for (auto& index : builder.memory_read_records) { - proving_key->memory_read_records.emplace_back(index + trace_data.ram_rom_offset); + proving_key.memory_read_records.emplace_back(index + trace_data.ram_rom_offset); } for (auto& index : builder.memory_write_records) { - proving_key->memory_write_records.emplace_back(index + trace_data.ram_rom_offset); + proving_key.memory_write_records.emplace_back(index + trace_data.ram_rom_offset); } } @@ -130,20 +131,20 @@ template void ExecutionTrace_::populate_public_inputs_blo } template -void ExecutionTrace_::add_ecc_op_wires_to_proving_key( - Builder& builder, const std::shared_ptr& proving_key) +void ExecutionTrace_::add_ecc_op_wires_to_proving_key(Builder& builder, + typename Flavor::ProvingKey& proving_key) requires IsGoblinFlavor { // Initialize the ecc op wire polynomials to zero on the whole domain std::array op_wire_polynomials; for (auto& poly : op_wire_polynomials) { - poly = Polynomial{ proving_key->circuit_size }; + poly = Polynomial{ proving_key.circuit_size }; } - Polynomial ecc_op_selector{ proving_key->circuit_size }; + Polynomial ecc_op_selector{ proving_key.circuit_size }; // Copy the ecc op data from the conventional wires into the op wires over the range of ecc op gates const size_t op_wire_offset = Flavor::has_zero_row ? 1 : 0; - for (auto [ecc_op_wire, wire] : zip_view(op_wire_polynomials, proving_key->get_wires())) { + for (auto [ecc_op_wire, wire] : zip_view(op_wire_polynomials, proving_key.get_wires())) { for (size_t i = 0; i < builder.num_ecc_op_gates; ++i) { size_t idx = i + op_wire_offset; ecc_op_wire[idx] = wire[idx]; @@ -151,12 +152,12 @@ void ExecutionTrace_::add_ecc_op_wires_to_proving_key( } } - proving_key->num_ecc_op_gates = builder.num_ecc_op_gates; - proving_key->ecc_op_wire_1 = op_wire_polynomials[0].share(); - proving_key->ecc_op_wire_2 = op_wire_polynomials[1].share(); - proving_key->ecc_op_wire_3 = op_wire_polynomials[2].share(); - proving_key->ecc_op_wire_4 = op_wire_polynomials[3].share(); - proving_key->lagrange_ecc_op = ecc_op_selector.share(); + proving_key.num_ecc_op_gates = builder.num_ecc_op_gates; + proving_key.ecc_op_wire_1 = op_wire_polynomials[0].share(); + proving_key.ecc_op_wire_2 = op_wire_polynomials[1].share(); + proving_key.ecc_op_wire_3 = op_wire_polynomials[2].share(); + proving_key.ecc_op_wire_4 = op_wire_polynomials[3].share(); + proving_key.lagrange_ecc_op = ecc_op_selector.share(); } template class ExecutionTrace_; diff --git a/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.hpp b/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.hpp index 55f45e5158b..f9b7024f8cf 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/execution_trace/execution_trace.hpp @@ -42,7 +42,7 @@ template class ExecutionTrace_ { * * @param builder */ - static void populate(Builder& builder, const std::shared_ptr&); + static void populate(Builder& builder, ProvingKey&); private: /** @@ -54,7 +54,7 @@ template class ExecutionTrace_ { */ static void add_wires_and_selectors_to_proving_key(TraceData& trace_data, Builder& builder, - const std::shared_ptr& proving_key); + typename Flavor::ProvingKey& proving_key); /** * @brief Add the memory records indicating which rows correspond to RAM/ROM reads/writes @@ -70,7 +70,7 @@ template class ExecutionTrace_ { */ static void add_memory_records_to_proving_key(TraceData& trace_data, Builder& builder, - const std::shared_ptr& proving_key) + typename Flavor::ProvingKey& proving_key) requires IsUltraPlonkOrHonk; /** @@ -98,8 +98,7 @@ template class ExecutionTrace_ { * @param builder * @param proving_key */ - static void add_ecc_op_wires_to_proving_key(Builder& builder, - const std::shared_ptr& proving_key) + static void add_ecc_op_wires_to_proving_key(Builder& builder, typename Flavor::ProvingKey& proving_key) requires IsGoblinFlavor; }; diff --git a/barretenberg/cpp/src/barretenberg/proof_system/instance_inspector.hpp b/barretenberg/cpp/src/barretenberg/proof_system/instance_inspector.hpp index d0913aef1c4..add3db82ec1 100644 --- a/barretenberg/cpp/src/barretenberg/proof_system/instance_inspector.hpp +++ b/barretenberg/cpp/src/barretenberg/proof_system/instance_inspector.hpp @@ -49,7 +49,7 @@ void print_databus_info(auto& prover_instance) { info("\nInstance Inspector: Printing databus gate info."); auto& key = prover_instance->proving_key; - for (size_t idx = 0; idx < prover_instance->proving_key->circuit_size; ++idx) { + for (size_t idx = 0; idx < prover_instance->proving_key.circuit_size; ++idx) { if (key->q_busread[idx] == 1) { info("idx = ", idx); info("q_busread = ", key->q_busread[idx]); diff --git a/barretenberg/cpp/src/barretenberg/protogalaxy/combiner.test.cpp b/barretenberg/cpp/src/barretenberg/protogalaxy/combiner.test.cpp index b9fd0f9d8c0..a7c7c24981f 100644 --- a/barretenberg/cpp/src/barretenberg/protogalaxy/combiner.test.cpp +++ b/barretenberg/cpp/src/barretenberg/protogalaxy/combiner.test.cpp @@ -45,8 +45,8 @@ TEST(Protogalaxy, CombinerOn2Instances) /*log_circuit_size=*/1, idx * 128); restrict_to_standard_arithmetic_relation(prover_polynomials); instance->prover_polynomials = std::move(prover_polynomials); - instance->proving_key = std::make_shared(); - instance->proving_key->circuit_size = 2; + instance->proving_key = Flavor::ProvingKey(); + instance->proving_key.circuit_size = 2; instance_data[idx] = instance; } @@ -78,8 +78,8 @@ TEST(Protogalaxy, CombinerOn2Instances) /*log_circuit_size=*/1); restrict_to_standard_arithmetic_relation(prover_polynomials); instance->prover_polynomials = std::move(prover_polynomials); - instance->proving_key = std::make_shared(); - instance->proving_key->circuit_size = 2; + instance->proving_key = Flavor::ProvingKey(); + instance->proving_key.circuit_size = 2; instance_data[idx] = instance; } @@ -169,8 +169,8 @@ TEST(Protogalaxy, CombinerOn4Instances) auto prover_polynomials = get_zero_prover_polynomials( /*log_circuit_size=*/1); instance->prover_polynomials = std::move(prover_polynomials); - instance->proving_key = std::make_shared(); - instance->proving_key->circuit_size = 2; + instance->proving_key = Flavor::ProvingKey(); + instance->proving_key.circuit_size = 2; instance_data[idx] = instance; } diff --git a/barretenberg/cpp/src/barretenberg/protogalaxy/decider_prover.cpp b/barretenberg/cpp/src/barretenberg/protogalaxy/decider_prover.cpp index 0b13eefeb37..1175e6d7f8f 100644 --- a/barretenberg/cpp/src/barretenberg/protogalaxy/decider_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/protogalaxy/decider_prover.cpp @@ -17,7 +17,7 @@ DeciderProver_::DeciderProver_(const std::shared_ptr& inst, const std::shared_ptr& transcript) : accumulator(std::move(inst)) , transcript(transcript) - , commitment_key(inst->proving_key->commitment_key) + , commitment_key(inst->proving_key.commitment_key) {} /** @@ -28,7 +28,7 @@ DeciderProver_::DeciderProver_(const std::shared_ptr& inst, template void DeciderProver_::execute_relation_check_rounds() { using Sumcheck = SumcheckProver; - auto instance_size = accumulator->proving_key->circuit_size; + auto instance_size = accumulator->proving_key.circuit_size; auto sumcheck = Sumcheck(instance_size, transcript); sumcheck_output = sumcheck.prove(accumulator); } diff --git a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy.test.cpp b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy.test.cpp index 1124bfdec23..7d857a4f863 100644 --- a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy.test.cpp +++ b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy.test.cpp @@ -79,7 +79,7 @@ template class ProtoGalaxyTests : public testing::Test { static void check_accumulator_target_sum_manual(std::shared_ptr& accumulator, bool expected_result) { - auto instance_size = accumulator->proving_key->circuit_size; + auto instance_size = accumulator->proving_key.circuit_size; auto expected_honk_evals = ProtoGalaxyProver::compute_full_honk_evaluations( accumulator->prover_polynomials, accumulator->alphas, accumulator->relation_parameters); // Construct pow(\vec{betas*}) as in the paper @@ -122,11 +122,11 @@ template class ProtoGalaxyTests : public testing::Test { instance->relation_parameters.beta = FF::random_element(); instance->relation_parameters.gamma = FF::random_element(); - instance->proving_key->compute_sorted_accumulator_polynomials(instance->relation_parameters.eta); + instance->proving_key.compute_sorted_accumulator_polynomials(instance->relation_parameters.eta); if constexpr (IsGoblinFlavor) { - instance->proving_key->compute_logderivative_inverse(instance->relation_parameters); + instance->proving_key.compute_logderivative_inverse(instance->relation_parameters); } - instance->proving_key->compute_grand_product_polynomials(instance->relation_parameters); + instance->proving_key.compute_grand_product_polynomials(instance->relation_parameters); instance->prover_polynomials = ProverPolynomials(instance->proving_key); for (auto& alpha : instance->alphas) { diff --git a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.cpp b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.cpp index 93d35cad10f..6786a84cc3b 100644 --- a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.cpp @@ -27,7 +27,7 @@ template void ProtoGalaxyProver_::prepa if (!instance->is_accumulator) { finalise_and_send_instance(instance, domain_separator); instance->target_sum = 0; - instance->gate_challenges = std::vector(instance->proving_key->log_circuit_size, 0); + instance->gate_challenges = std::vector(instance->proving_key.log_circuit_size, 0); } idx++; @@ -57,7 +57,7 @@ std::shared_ptr ProtoGalaxyProver_(); next_accumulator->is_accumulator = true; - next_accumulator->proving_key = instances[0]->proving_key; + next_accumulator->proving_key = std::move(instances[0]->proving_key); // Compute the next target sum and send the next folding parameters to the verifier FF next_target_sum = @@ -69,7 +69,7 @@ std::shared_ptr ProtoGalaxyProver_proving_key->circuit_size); + polynomial = typename Flavor::Polynomial(next_accumulator->proving_key.circuit_size); } // Fold the prover polynomials @@ -92,14 +92,15 @@ std::shared_ptr ProtoGalaxyProver_proving_key->public_inputs = std::vector(instances[0]->proving_key->public_inputs.size(), 0); + next_accumulator->proving_key.public_inputs = + std::vector(next_accumulator->proving_key.public_inputs.size(), 0); size_t el_idx = 0; - for (auto& el : next_accumulator->proving_key->public_inputs) { + for (auto& el : next_accumulator->proving_key.public_inputs) { size_t inst = 0; for (auto& instance : instances) { // TODO(https://github.com/AztecProtocol/barretenberg/issues/830) - if (instance->proving_key->num_public_inputs >= next_accumulator->proving_key->num_public_inputs) { - el += instance->proving_key->public_inputs[el_idx] * lagranges[inst]; + if (instance->proving_key.num_public_inputs >= next_accumulator->proving_key.num_public_inputs) { + el += instance->proving_key.public_inputs[el_idx] * lagranges[inst]; inst++; }; } @@ -138,14 +139,14 @@ template void ProtoGalaxyProver_::pertu BB_OP_COUNT_TIME_NAME("ProtoGalaxyProver_::perturbator_round"); state.accumulator = get_accumulator(); FF delta = transcript->template get_challenge("delta"); - state.deltas = compute_round_challenge_pows(state.accumulator->proving_key->log_circuit_size, delta); - state.perturbator = Polynomial(state.accumulator->proving_key->log_circuit_size + 1); // initialize to all zeros + state.deltas = compute_round_challenge_pows(state.accumulator->proving_key.log_circuit_size, delta); + state.perturbator = Polynomial(state.accumulator->proving_key.log_circuit_size + 1); // initialize to all zeros // compute perturbator only if this is not the first round and has an accumulator if (state.accumulator->is_accumulator) { state.perturbator = compute_perturbator(state.accumulator, state.deltas); // Prover doesn't send the constant coefficient of F because this is supposed to be equal to the target sum of // the accumulator which the folding verifier has from the previous iteration. - for (size_t idx = 1; idx <= state.accumulator->proving_key->log_circuit_size; idx++) { + for (size_t idx = 1; idx <= state.accumulator->proving_key.log_circuit_size; idx++) { transcript->send_to_verifier("perturbator_" + std::to_string(idx), state.perturbator[idx]); } } diff --git a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.hpp b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.hpp index bb4be8dbb3d..51634921dc3 100644 --- a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.hpp +++ b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.hpp @@ -70,7 +70,7 @@ template class ProtoGalaxyProver_ { ProtoGalaxyProver_(const std::vector>& insts) : instances(ProverInstances(insts)) // TODO(https://github.com/AztecProtocol/barretenberg/issues/878) - , commitment_key(instances[1]->proving_key->commitment_key){}; + , commitment_key(instances[1]->proving_key.commitment_key){}; ~ProtoGalaxyProver_() = default; /** @@ -306,7 +306,7 @@ template class ProtoGalaxyProver_ { ExtendedUnivariateWithRandomization compute_combiner(const ProverInstances& instances, PowPolynomial& pow_betas) { BB_OP_COUNT_TIME(); - size_t common_instance_size = instances[0]->proving_key->circuit_size; + size_t common_instance_size = instances[0]->proving_key.circuit_size; pow_betas.compute_values(); // Determine number of threads for multithreading. // Note: Multithreading is "on" for every round but we reduce the number of threads from the max available based diff --git a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp index 7f04ee8401c..d963dfdf1cf 100644 --- a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp +++ b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp @@ -57,19 +57,19 @@ void ProverInstance_::construct_databus_polynomials(Circuit& circuit) databus_id[i] = i; } - proving_key->calldata = public_calldata.share(); - proving_key->calldata_read_counts = calldata_read_counts.share(); - proving_key->databus_id = databus_id.share(); + proving_key.calldata = public_calldata.share(); + proving_key.calldata_read_counts = calldata_read_counts.share(); + proving_key.databus_id = databus_id.share(); } template void ProverInstance_::construct_table_polynomials(Circuit& circuit, size_t dyadic_circuit_size) { auto table_polynomials = construct_lookup_table_polynomials(circuit, dyadic_circuit_size); - proving_key->table_1 = table_polynomials[0].share(); - proving_key->table_2 = table_polynomials[1].share(); - proving_key->table_3 = table_polynomials[2].share(); - proving_key->table_4 = table_polynomials[3].share(); + proving_key.table_1 = table_polynomials[0].share(); + proving_key.table_2 = table_polynomials[1].share(); + proving_key.table_3 = table_polynomials[2].share(); + proving_key.table_4 = table_polynomials[3].share(); } template class ProverInstance_; diff --git a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp index b16dd99dbf9..6a680a004e1 100644 --- a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp +++ b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.hpp @@ -30,7 +30,7 @@ template class ProverInstance_ { using Trace = ExecutionTrace_; public: - std::shared_ptr proving_key; + ProvingKey proving_key; ProverPolynomials prover_polynomials; RelationSeparator alphas; @@ -53,7 +53,7 @@ template class ProverInstance_ { dyadic_circuit_size = compute_dyadic_size(circuit); - proving_key = std::make_shared(dyadic_circuit_size, circuit.public_inputs.size()); + proving_key = std::move(ProvingKey(dyadic_circuit_size, circuit.public_inputs.size())); // Construct and add to proving key the wire, selector and copy constraint polynomials Trace::populate(circuit, proving_key); @@ -66,24 +66,24 @@ template class ProverInstance_ { // First and last lagrange polynomials (in the full circuit size) const auto [lagrange_first, lagrange_last] = compute_first_and_last_lagrange_polynomials(dyadic_circuit_size); - proving_key->lagrange_first = lagrange_first; - proving_key->lagrange_last = lagrange_last; + proving_key.lagrange_first = lagrange_first; + proving_key.lagrange_last = lagrange_last; construct_table_polynomials(circuit, dyadic_circuit_size); - proving_key->sorted_polynomials = construct_sorted_list_polynomials(circuit, dyadic_circuit_size); + proving_key.sorted_polynomials = construct_sorted_list_polynomials(circuit, dyadic_circuit_size); - std::span public_wires_source = proving_key->w_r; + std::span public_wires_source = proving_key.w_r; // Determine public input offsets in the circuit relative to the 0th index for Ultra flavors - proving_key->pub_inputs_offset = Flavor::has_zero_row ? 1 : 0; + proving_key.pub_inputs_offset = Flavor::has_zero_row ? 1 : 0; if constexpr (IsGoblinFlavor) { - proving_key->pub_inputs_offset += proving_key->num_ecc_op_gates; + proving_key.pub_inputs_offset += proving_key.num_ecc_op_gates; } // Construct the public inputs array - for (size_t i = 0; i < proving_key->num_public_inputs; ++i) { - size_t idx = i + proving_key->pub_inputs_offset; - proving_key->public_inputs.emplace_back(public_wires_source[idx]); + for (size_t i = 0; i < proving_key.num_public_inputs; ++i) { + size_t idx = i + proving_key.pub_inputs_offset; + proving_key.public_inputs.emplace_back(public_wires_source[idx]); } } diff --git a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.test.cpp b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.test.cpp index 78f87455419..050afa5bc7b 100644 --- a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.test.cpp +++ b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.test.cpp @@ -60,11 +60,11 @@ template class InstanceTests : public testing::Test { // Get random challenge eta auto eta = FF::random_element(); - auto sorted_list_polynomials = instance.proving_key->sorted_polynomials; + auto sorted_list_polynomials = instance.proving_key.sorted_polynomials; // Method 1: computed sorted list accumulator polynomial using prover library method - instance.proving_key->compute_sorted_list_accumulator(eta); - auto sorted_list_accumulator = instance.proving_key->sorted_accum; + instance.proving_key.compute_sorted_list_accumulator(eta); + auto sorted_list_accumulator = instance.proving_key.sorted_accum; // Method 2: Compute local sorted list accumulator simply and inefficiently const FF eta_sqr = eta.sqr(); @@ -72,7 +72,7 @@ template class InstanceTests : public testing::Test { // Compute s = s_1 + η*s_2 + η²*s_3 + η³*s_4 Polynomial sorted_list_accumulator_expected{ sorted_list_polynomials[0] }; - for (size_t i = 0; i < instance.proving_key->circuit_size; ++i) { + for (size_t i = 0; i < instance.proving_key.circuit_size; ++i) { sorted_list_accumulator_expected[i] += sorted_list_polynomials[1][i] * eta + sorted_list_polynomials[2][i] * eta_sqr + sorted_list_polynomials[3][i] * eta_cube; diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/goblin_ultra_transcript.test.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/goblin_ultra_transcript.test.cpp index 82370a525e5..5364924fd13 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/goblin_ultra_transcript.test.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/goblin_ultra_transcript.test.cpp @@ -153,7 +153,7 @@ TEST_F(GoblinUltraTranscriptTests, ProverManifestConsistency) auto proof = prover.construct_proof(); // Check that the prover generated manifest agrees with the manifest hard coded in this suite - auto manifest_expected = construct_goblin_ultra_honk_manifest(instance->proving_key->circuit_size); + auto manifest_expected = construct_goblin_ultra_honk_manifest(instance->proving_key.circuit_size); auto prover_manifest = prover.transcript->get_manifest(); // Note: a manifest can be printed using manifest.print() for (size_t round = 0; round < manifest_expected.size(); ++round) { diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp index 1a8a8d123d0..d934c34858e 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp @@ -36,17 +36,17 @@ template OinkProverOutput OinkProver::pro */ template void OinkProver::execute_preamble_round() { - const auto circuit_size = static_cast(proving_key->circuit_size); - const auto num_public_inputs = static_cast(proving_key->num_public_inputs); + const auto circuit_size = static_cast(proving_key.circuit_size); + const auto num_public_inputs = static_cast(proving_key.num_public_inputs); 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(proving_key->pub_inputs_offset)); + static_cast(proving_key.pub_inputs_offset)); - ASSERT(proving_key->num_public_inputs == proving_key->public_inputs.size()); + ASSERT(proving_key.num_public_inputs == proving_key.public_inputs.size()); - for (size_t i = 0; i < proving_key->num_public_inputs; ++i) { - auto public_input_i = proving_key->public_inputs[i]; + for (size_t i = 0; i < proving_key.num_public_inputs; ++i) { + auto public_input_i = proving_key.public_inputs[i]; transcript->send_to_verifier(domain_separator + "public_input_" + std::to_string(i), public_input_i); } } @@ -60,9 +60,9 @@ template void OinkProver::execute_wire_commitment { // Commit to the first three wire polynomials of the instance // We only commit to the fourth wire polynomial after adding memory recordss - witness_commitments.w_l = commitment_key->commit(proving_key->w_l); - witness_commitments.w_r = commitment_key->commit(proving_key->w_r); - witness_commitments.w_o = commitment_key->commit(proving_key->w_o); + witness_commitments.w_l = commitment_key->commit(proving_key.w_l); + witness_commitments.w_r = commitment_key->commit(proving_key.w_r); + witness_commitments.w_o = commitment_key->commit(proving_key.w_o); auto wire_comms = witness_commitments.get_wires(); auto wire_labels = commitment_labels.get_wires(); @@ -72,10 +72,10 @@ template void OinkProver::execute_wire_commitment if constexpr (IsGoblinFlavor) { // Commit to Goblin ECC op wires - witness_commitments.ecc_op_wire_1 = commitment_key->commit(proving_key->ecc_op_wire_1); - witness_commitments.ecc_op_wire_2 = commitment_key->commit(proving_key->ecc_op_wire_2); - witness_commitments.ecc_op_wire_3 = commitment_key->commit(proving_key->ecc_op_wire_3); - witness_commitments.ecc_op_wire_4 = commitment_key->commit(proving_key->ecc_op_wire_4); + witness_commitments.ecc_op_wire_1 = commitment_key->commit(proving_key.ecc_op_wire_1); + witness_commitments.ecc_op_wire_2 = commitment_key->commit(proving_key.ecc_op_wire_2); + witness_commitments.ecc_op_wire_3 = commitment_key->commit(proving_key.ecc_op_wire_3); + witness_commitments.ecc_op_wire_4 = commitment_key->commit(proving_key.ecc_op_wire_4); auto op_wire_comms = witness_commitments.get_ecc_op_wires(); auto labels = commitment_labels.get_ecc_op_wires(); @@ -83,8 +83,8 @@ template void OinkProver::execute_wire_commitment transcript->send_to_verifier(domain_separator + labels[idx], op_wire_comms[idx]); } // Commit to DataBus columns - witness_commitments.calldata = commitment_key->commit(proving_key->calldata); - witness_commitments.calldata_read_counts = commitment_key->commit(proving_key->calldata_read_counts); + witness_commitments.calldata = commitment_key->commit(proving_key.calldata); + witness_commitments.calldata_read_counts = commitment_key->commit(proving_key.calldata_read_counts); transcript->send_to_verifier(domain_separator + commitment_labels.calldata, witness_commitments.calldata); transcript->send_to_verifier(domain_separator + commitment_labels.calldata_read_counts, witness_commitments.calldata_read_counts); @@ -99,11 +99,11 @@ template void OinkProver::execute_sorted_list_acc { relation_parameters.eta = transcript->template get_challenge(domain_separator + "eta"); - proving_key->compute_sorted_accumulator_polynomials(relation_parameters.eta); + proving_key.compute_sorted_accumulator_polynomials(relation_parameters.eta); // Commit to the sorted witness-table accumulator and the finalized (i.e. with memory records) fourth wire // polynomial - witness_commitments.sorted_accum = commitment_key->commit(proving_key->sorted_accum); - witness_commitments.w_4 = commitment_key->commit(proving_key->w_4); + witness_commitments.sorted_accum = commitment_key->commit(proving_key.sorted_accum); + witness_commitments.w_4 = commitment_key->commit(proving_key.w_4); transcript->send_to_verifier(domain_separator + commitment_labels.sorted_accum, witness_commitments.sorted_accum); transcript->send_to_verifier(domain_separator + commitment_labels.w_4, witness_commitments.w_4); @@ -120,8 +120,8 @@ template void OinkProver::execute_log_derivative_ relation_parameters.gamma = gamma; if constexpr (IsGoblinFlavor) { // Compute and commit to the logderivative inverse used in DataBus - proving_key->compute_logderivative_inverse(relation_parameters); - witness_commitments.lookup_inverses = commitment_key->commit(proving_key->lookup_inverses); + proving_key.compute_logderivative_inverse(relation_parameters); + witness_commitments.lookup_inverses = commitment_key->commit(proving_key.lookup_inverses); transcript->send_to_verifier(domain_separator + commitment_labels.lookup_inverses, witness_commitments.lookup_inverses); } @@ -134,10 +134,10 @@ template void OinkProver::execute_log_derivative_ template void OinkProver::execute_grand_product_computation_round() { - proving_key->compute_grand_product_polynomials(relation_parameters); + proving_key.compute_grand_product_polynomials(relation_parameters); - witness_commitments.z_perm = commitment_key->commit(proving_key->z_perm); - witness_commitments.z_lookup = commitment_key->commit(proving_key->z_lookup); + witness_commitments.z_perm = commitment_key->commit(proving_key.z_perm); + witness_commitments.z_lookup = commitment_key->commit(proving_key.z_lookup); transcript->send_to_verifier(domain_separator + commitment_labels.z_perm, witness_commitments.z_perm); transcript->send_to_verifier(domain_separator + commitment_labels.z_lookup, witness_commitments.z_lookup); diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.hpp b/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.hpp index fcf81279651..f6106642008 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.hpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.hpp @@ -43,7 +43,7 @@ template class OinkProver { using FF = typename Flavor::FF; public: - std::shared_ptr proving_key; + ProvingKey& proving_key; std::shared_ptr transcript; std::shared_ptr commitment_key; std::string domain_separator; @@ -52,7 +52,7 @@ template class OinkProver { bb::RelationParameters relation_parameters; - OinkProver(const std::shared_ptr& proving_key, + OinkProver(ProvingKey& proving_key, const std::shared_ptr& commitment_key, const std::shared_ptr& transcript, std::string domain_separator = "") diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/relation_correctness.test.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/relation_correctness.test.cpp index 4f7e2c1ed41..ae46c1bf8c9 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/relation_correctness.test.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/relation_correctness.test.cpp @@ -264,23 +264,23 @@ TEST_F(RelationCorrectnessTests, UltraRelationCorrectness) // Create a prover (it will compute proving key and witness) auto instance = std::make_shared>(builder); auto proving_key = instance->proving_key; - auto circuit_size = proving_key->circuit_size; + auto circuit_size = proving_key.circuit_size; // Generate eta, beta and gamma instance->relation_parameters.eta = FF::random_element(); instance->relation_parameters.beta = FF::random_element(); instance->relation_parameters.gamma = FF::random_element(); - instance->proving_key->compute_sorted_accumulator_polynomials(instance->relation_parameters.eta); - instance->proving_key->compute_grand_product_polynomials(instance->relation_parameters); + instance->proving_key.compute_sorted_accumulator_polynomials(instance->relation_parameters.eta); + instance->proving_key.compute_grand_product_polynomials(instance->relation_parameters); instance->prover_polynomials = Flavor::ProverPolynomials(instance->proving_key); // Check that selectors are nonzero to ensure corresponding relation has nontrivial contribution - ensure_non_zero(proving_key->q_arith); - ensure_non_zero(proving_key->q_delta_range); - ensure_non_zero(proving_key->q_lookup); - ensure_non_zero(proving_key->q_elliptic); - ensure_non_zero(proving_key->q_aux); + ensure_non_zero(proving_key.q_arith); + ensure_non_zero(proving_key.q_delta_range); + ensure_non_zero(proving_key.q_lookup); + ensure_non_zero(proving_key.q_elliptic); + ensure_non_zero(proving_key.q_aux); // Construct the round for applying sumcheck relations and results for storing computed results using Relations = typename Flavor::Relations; @@ -316,31 +316,31 @@ TEST_F(RelationCorrectnessTests, GoblinUltraRelationCorrectness) // Create a prover (it will compute proving key and witness) auto instance = std::make_shared>(builder); auto proving_key = instance->proving_key; - auto circuit_size = proving_key->circuit_size; + auto circuit_size = proving_key.circuit_size; // Generate eta, beta and gamma instance->relation_parameters.eta = FF::random_element(); instance->relation_parameters.beta = FF::random_element(); instance->relation_parameters.gamma = FF::random_element(); - instance->proving_key->compute_sorted_accumulator_polynomials(instance->relation_parameters.eta); - instance->proving_key->compute_logderivative_inverse(instance->relation_parameters); - instance->proving_key->compute_grand_product_polynomials(instance->relation_parameters); + instance->proving_key.compute_sorted_accumulator_polynomials(instance->relation_parameters.eta); + instance->proving_key.compute_logderivative_inverse(instance->relation_parameters); + instance->proving_key.compute_grand_product_polynomials(instance->relation_parameters); instance->prover_polynomials = Flavor::ProverPolynomials(instance->proving_key); // Check that selectors are nonzero to ensure corresponding relation has nontrivial contribution - ensure_non_zero(proving_key->q_arith); - ensure_non_zero(proving_key->q_delta_range); - ensure_non_zero(proving_key->q_lookup); - ensure_non_zero(proving_key->q_elliptic); - ensure_non_zero(proving_key->q_aux); - ensure_non_zero(proving_key->q_busread); - ensure_non_zero(proving_key->q_poseidon2_external); - ensure_non_zero(proving_key->q_poseidon2_internal); - - ensure_non_zero(proving_key->calldata); - ensure_non_zero(proving_key->calldata_read_counts); - ensure_non_zero(proving_key->lookup_inverses); + ensure_non_zero(proving_key.q_arith); + ensure_non_zero(proving_key.q_delta_range); + ensure_non_zero(proving_key.q_lookup); + ensure_non_zero(proving_key.q_elliptic); + ensure_non_zero(proving_key.q_aux); + ensure_non_zero(proving_key.q_busread); + ensure_non_zero(proving_key.q_poseidon2_external); + ensure_non_zero(proving_key.q_poseidon2_internal); + + ensure_non_zero(proving_key.calldata); + ensure_non_zero(proving_key.calldata_read_counts); + ensure_non_zero(proving_key.lookup_inverses); // Construct the round for applying sumcheck relations and results for storing computed results using Relations = typename Flavor::Relations; diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/sumcheck.test.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/sumcheck.test.cpp index 0cd4c773619..d64e94ff668 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/sumcheck.test.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/sumcheck.test.cpp @@ -154,12 +154,12 @@ TEST_F(SumcheckTestsRealCircuit, Ultra) instance->relation_parameters.beta = FF::random_element(); instance->relation_parameters.gamma = FF::random_element(); - instance->proving_key->compute_sorted_accumulator_polynomials(instance->relation_parameters.eta); - instance->proving_key->compute_grand_product_polynomials(instance->relation_parameters); + instance->proving_key.compute_sorted_accumulator_polynomials(instance->relation_parameters.eta); + instance->proving_key.compute_grand_product_polynomials(instance->relation_parameters); instance->prover_polynomials = Flavor::ProverPolynomials(instance->proving_key); auto prover_transcript = Transcript::prover_init_empty(); - auto circuit_size = instance->proving_key->circuit_size; + auto circuit_size = instance->proving_key.circuit_size; auto log_circuit_size = numeric::get_msb(circuit_size); RelationSeparator prover_alphas; diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_composer.test.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_composer.test.cpp index 43d1ad26498..cf9dd85da91 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_composer.test.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_composer.test.cpp @@ -72,15 +72,15 @@ TEST_F(UltraHonkComposerTests, ANonZeroPolynomialIsAGoodPolynomial) auto proof = prover.construct_proof(); auto proving_key = instance->proving_key; - for (auto& poly : proving_key->get_selectors()) { + for (auto& poly : proving_key.get_selectors()) { ensure_non_zero(poly); } - for (auto& poly : proving_key->get_table_polynomials()) { + for (auto& poly : proving_key.get_table_polynomials()) { ensure_non_zero(poly); } - for (auto& poly : proving_key->get_wires()) { + for (auto& poly : proving_key.get_wires()) { ensure_non_zero(poly); } } diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_prover.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_prover.cpp index a8bce2bfc93..bf2087e7f19 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_prover.cpp @@ -14,7 +14,7 @@ template UltraProver_::UltraProver_(const std::shared_ptr& inst, const std::shared_ptr& transcript) : instance(std::move(inst)) , transcript(transcript) - , commitment_key(instance->proving_key->commitment_key) + , commitment_key(instance->proving_key.commitment_key) , oink_prover(inst->proving_key, commitment_key, transcript, "") {} @@ -29,7 +29,7 @@ template UltraProver_::UltraProver_(Builder& circuit) : instance(std::make_shared(circuit)) , transcript(std::make_shared()) - , commitment_key(instance->proving_key->commitment_key) + , commitment_key(instance->proving_key.commitment_key) , oink_prover(instance->proving_key, commitment_key, transcript, "") {} @@ -40,7 +40,7 @@ UltraProver_::UltraProver_(Builder& circuit) template void UltraProver_::execute_relation_check_rounds() { using Sumcheck = SumcheckProver; - auto circuit_size = instance->proving_key->circuit_size; + auto circuit_size = instance->proving_key.circuit_size; auto sumcheck = Sumcheck(circuit_size, transcript); RelationSeparator alphas; for (size_t idx = 0; idx < alphas.size(); idx++) { diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_transcript.test.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_transcript.test.cpp index 17383a15d2c..36dadc0af1e 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_transcript.test.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_transcript.test.cpp @@ -140,7 +140,7 @@ TEST_F(UltraTranscriptTests, ProverManifestConsistency) auto proof = prover.construct_proof(); // Check that the prover generated manifest agrees with the manifest hard coded in this suite - auto manifest_expected = construct_ultra_honk_manifest(instance->proving_key->circuit_size); + auto manifest_expected = construct_ultra_honk_manifest(instance->proving_key.circuit_size); auto prover_manifest = prover.transcript->get_manifest(); // Note: a manifest can be printed using manifest.print() for (size_t round = 0; round < manifest_expected.size(); ++round) { From de50495d3de54df13b53e97c2e7dfc689a2bc02d Mon Sep 17 00:00:00 2001 From: lucasxia01 Date: Fri, 22 Mar 2024 21:37:50 +0000 Subject: [PATCH 20/25] fixed pg prover (shouldn't move too early) --- .../src/barretenberg/protogalaxy/protogalaxy_prover.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.cpp b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.cpp index 6786a84cc3b..28c5e9be4d6 100644 --- a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.cpp @@ -57,7 +57,6 @@ std::shared_ptr ProtoGalaxyProver_(); next_accumulator->is_accumulator = true; - next_accumulator->proving_key = std::move(instances[0]->proving_key); // Compute the next target sum and send the next folding parameters to the verifier FF next_target_sum = @@ -69,7 +68,7 @@ std::shared_ptr ProtoGalaxyProver_proving_key.circuit_size); + polynomial = typename Flavor::Polynomial(instances[0]->proving_key.circuit_size); } // Fold the prover polynomials @@ -92,8 +91,8 @@ std::shared_ptr ProtoGalaxyProver_proving_key.public_inputs = - std::vector(next_accumulator->proving_key.public_inputs.size(), 0); + next_accumulator->proving_key.num_public_inputs = instances[0]->proving_key.num_public_inputs; + next_accumulator->proving_key.public_inputs = std::vector(instances[0]->proving_key.public_inputs.size(), 0); size_t el_idx = 0; for (auto& el : next_accumulator->proving_key.public_inputs) { size_t inst = 0; @@ -125,6 +124,7 @@ std::shared_ptr ProtoGalaxyProver_relation_parameters = folded_relation_parameters; + next_accumulator->proving_key = std::move(instances[0]->proving_key); return next_accumulator; } From c7192bcf7f3d61ea8e1a20429c93f2d96d6e4e48 Mon Sep 17 00:00:00 2001 From: lucasxia01 Date: Fri, 22 Mar 2024 21:42:47 +0000 Subject: [PATCH 21/25] remove comments --- .../cpp/src/barretenberg/flavor/flavor.hpp | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp b/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp index af077a3af01..7fcf8537f3e 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp @@ -159,26 +159,12 @@ class VerificationKey_ : public PrecomputedCommitments { size_t pub_inputs_offset = 0; VerificationKey_() = default; - // VerificationKey_(const VerificationKey_& other) = default; VerificationKey_(const size_t circuit_size, const size_t num_public_inputs) { this->circuit_size = circuit_size; this->log_circuit_size = numeric::get_msb(circuit_size); this->num_public_inputs = num_public_inputs; }; - - // VerificationKey_(ProvingKey& proving_key) - // { - // this->pcs_verification_key = std::make_shared(); - // this->circuit_size = proving_key.circuit_size; - // this->log_circuit_size = numeric::get_msb(this->circuit_size); - // this->num_public_inputs = proving_key.num_public_inputs; - // this->pub_inputs_offset = proving_key.pub_inputs_offset; - - // for (auto [polynomial, commitment] : zip_view(proving_key.get_precomputed_polynomials(), this->get_all())) { - // commitment = proving_key.commitment_key->commit(polynomial); - // } - // } }; // Because of how Gemini is written, is importat to put the polynomials out in this order. From 7e27f9c75d5d21d06f142dfea3e483e77d297544 Mon Sep 17 00:00:00 2001 From: lucasxia01 Date: Fri, 22 Mar 2024 22:09:31 +0000 Subject: [PATCH 22/25] proving key gets copied instead of shared --- .../src/barretenberg/ultra_honk/relation_correctness.test.cpp | 4 ++-- .../cpp/src/barretenberg/ultra_honk/ultra_composer.test.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/relation_correctness.test.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/relation_correctness.test.cpp index ae46c1bf8c9..9d95c900262 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/relation_correctness.test.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/relation_correctness.test.cpp @@ -263,7 +263,7 @@ TEST_F(RelationCorrectnessTests, UltraRelationCorrectness) // Create a prover (it will compute proving key and witness) auto instance = std::make_shared>(builder); - auto proving_key = instance->proving_key; + auto& proving_key = instance->proving_key; auto circuit_size = proving_key.circuit_size; // Generate eta, beta and gamma @@ -315,7 +315,7 @@ TEST_F(RelationCorrectnessTests, GoblinUltraRelationCorrectness) // Create a prover (it will compute proving key and witness) auto instance = std::make_shared>(builder); - auto proving_key = instance->proving_key; + auto& proving_key = instance->proving_key; auto circuit_size = proving_key.circuit_size; // Generate eta, beta and gamma diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_composer.test.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_composer.test.cpp index cf9dd85da91..b61a4adbdc9 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_composer.test.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_composer.test.cpp @@ -70,7 +70,7 @@ TEST_F(UltraHonkComposerTests, ANonZeroPolynomialIsAGoodPolynomial) auto instance = std::make_shared(circuit_builder); UltraProver prover(instance); auto proof = prover.construct_proof(); - auto proving_key = instance->proving_key; + auto& proving_key = instance->proving_key; for (auto& poly : proving_key.get_selectors()) { ensure_non_zero(poly); From 03238e82eba23b090afd1456a1aaa5453cb1cbb9 Mon Sep 17 00:00:00 2001 From: lucasxia01 Date: Tue, 26 Mar 2024 18:18:00 +0000 Subject: [PATCH 23/25] get rid of reference member var and use std::move()s instead --- .../cpp/src/barretenberg/protogalaxy/protogalaxy_prover.cpp | 4 ++-- barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp | 5 ++--- barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.hpp | 5 +++-- .../cpp/src/barretenberg/ultra_honk/ultra_prover.cpp | 3 ++- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.cpp b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.cpp index 44e50cfa607..8b181696499 100644 --- a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.cpp @@ -75,7 +75,7 @@ std::shared_ptr ProtoGalaxyProver_proving_key->get_all(); + auto input_polys = instances[inst_idx]->proving_key.get_all(); run_loop_in_parallel(Flavor::NUM_FOLDED_ENTITIES, [&](size_t start_idx, size_t end_idx) { for (size_t poly_idx = start_idx; poly_idx < end_idx; poly_idx++) { auto& acc_poly = accumulator_polys[poly_idx]; @@ -87,7 +87,7 @@ std::shared_ptr ProtoGalaxyProver_proving_key->get_all(), acc_proving_key_polys.get_all())) { + zip_view(next_accumulator->proving_key.get_all(), acc_proving_key_polys.get_all())) { next_acc_poly = std::move(acc_poly); } diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp index b621110093a..757366bc958 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp @@ -25,9 +25,8 @@ template OinkProverOutput OinkProver::pro // Compute grand product(s) and commitments. execute_grand_product_computation_round(); - return OinkProverOutput - { - .proving_key = std::move(proving_key); + return OinkProverOutput{ + .proving_key = std::move(proving_key), .relation_parameters = std::move(relation_parameters), }; } diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.hpp b/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.hpp index 494269a51b9..62b56944658 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.hpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.hpp @@ -25,6 +25,7 @@ namespace bb { template struct OinkProverOutput { + typename Flavor::ProvingKey proving_key; bb::RelationParameters relation_parameters; }; @@ -43,7 +44,7 @@ template class OinkProver { using FF = typename Flavor::FF; public: - ProvingKey& proving_key; + ProvingKey proving_key; std::shared_ptr transcript; std::shared_ptr commitment_key; std::string domain_separator; @@ -56,7 +57,7 @@ template class OinkProver { const std::shared_ptr& commitment_key, const std::shared_ptr& transcript, std::string domain_separator = "") - : proving_key(proving_key) + : proving_key(std::move(proving_key)) , transcript(transcript) , commitment_key(commitment_key) , domain_separator(std::move(domain_separator)) diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_prover.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_prover.cpp index bf2087e7f19..f6433c61abb 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_prover.cpp @@ -79,7 +79,8 @@ template HonkProof& UltraProver_::export_proof() template HonkProof& UltraProver_::construct_proof() { - auto [relation_params] = oink_prover.prove(); + auto [proving_key, relation_params] = oink_prover.prove(); + instance->proving_key = std::move(proving_key); instance->relation_parameters = std::move(relation_params); instance->prover_polynomials = ProverPolynomials(instance->proving_key); From 35ae332650de6a041c779105bc585d32ad789bb9 Mon Sep 17 00:00:00 2001 From: lucasxia01 Date: Tue, 26 Mar 2024 19:50:37 +0000 Subject: [PATCH 24/25] fix for pg tests --- .../src/barretenberg/protogalaxy/protogalaxy_prover.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.cpp b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.cpp index 8b181696499..457d01c2834 100644 --- a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.cpp @@ -66,13 +66,13 @@ std::shared_ptr ProtoGalaxyProver_target_sum = next_target_sum; next_accumulator->gate_challenges = instances.next_gate_challenges; - // Initialize prover polynomials + // Initialize proving key polynomials ProvingKey acc_proving_key_polys; for (auto& polynomial : acc_proving_key_polys.get_all()) { polynomial = typename Flavor::Polynomial(instances[0]->proving_key.circuit_size); } - // Fold the prover key polynomials + // Fold the proving key polynomials for (size_t inst_idx = 0; inst_idx < ProverInstances::NUM; inst_idx++) { auto accumulator_polys = acc_proving_key_polys.get_all(); auto input_polys = instances[inst_idx]->proving_key.get_all(); @@ -86,8 +86,9 @@ std::shared_ptr ProtoGalaxyProver_proving_key.get_all(), acc_proving_key_polys.get_all())) { + zip_view(instances[0]->proving_key.get_all(), acc_proving_key_polys.get_all())) { next_acc_poly = std::move(acc_poly); } From 7b4a20eca22b7a2487f668500efe3853975e1e81 Mon Sep 17 00:00:00 2001 From: lucasxia01 Date: Tue, 26 Mar 2024 20:19:50 +0000 Subject: [PATCH 25/25] removing oink prover as a member variable of ultra_prover to fix tests temporarily --- .../ultra_bench/ultra_honk_rounds.bench.cpp | 16 +++++++++------- .../protogalaxy/protogalaxy_prover.cpp | 2 +- .../src/barretenberg/ultra_honk/oink_prover.hpp | 3 +-- .../src/barretenberg/ultra_honk/ultra_prover.cpp | 4 ++-- .../src/barretenberg/ultra_honk/ultra_prover.hpp | 3 --- 5 files changed, 13 insertions(+), 15 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/benchmark/ultra_bench/ultra_honk_rounds.bench.cpp b/barretenberg/cpp/src/barretenberg/benchmark/ultra_bench/ultra_honk_rounds.bench.cpp index e9093518f54..a5304ea6098 100644 --- a/barretenberg/cpp/src/barretenberg/benchmark/ultra_bench/ultra_honk_rounds.bench.cpp +++ b/barretenberg/cpp/src/barretenberg/benchmark/ultra_bench/ultra_honk_rounds.bench.cpp @@ -3,6 +3,7 @@ #include "barretenberg/benchmark/ultra_bench/mock_circuits.hpp" #include "barretenberg/common/op_count_google_bench.hpp" #include "barretenberg/stdlib_circuit_builders/ultra_circuit_builder.hpp" +#include "barretenberg/ultra_honk/oink_prover.hpp" #include "barretenberg/ultra_honk/ultra_prover.hpp" using namespace benchmark; @@ -43,14 +44,15 @@ BB_PROFILE static void test_round_inner(State& state, GoblinUltraProver& prover, BB_REPORT_OP_COUNT_BENCH_CANCEL(); } }; - - time_if_index(PREAMBLE, [&] { prover.oink_prover.execute_preamble_round(); }); - time_if_index(WIRE_COMMITMENTS, [&] { prover.oink_prover.execute_wire_commitments_round(); }); - time_if_index(SORTED_LIST_ACCUMULATOR, [&] { prover.oink_prover.execute_sorted_list_accumulator_round(); }); - time_if_index(LOG_DERIVATIVE_INVERSE, [&] { prover.oink_prover.execute_log_derivative_inverse_round(); }); - time_if_index(GRAND_PRODUCT_COMPUTATION, [&] { prover.oink_prover.execute_grand_product_computation_round(); }); + OinkProver oink_prover(prover.instance->proving_key, prover.transcript); + time_if_index(PREAMBLE, [&] { oink_prover.execute_preamble_round(); }); + time_if_index(WIRE_COMMITMENTS, [&] { oink_prover.execute_wire_commitments_round(); }); + time_if_index(SORTED_LIST_ACCUMULATOR, [&] { oink_prover.execute_sorted_list_accumulator_round(); }); + time_if_index(LOG_DERIVATIVE_INVERSE, [&] { oink_prover.execute_log_derivative_inverse_round(); }); + time_if_index(GRAND_PRODUCT_COMPUTATION, [&] { oink_prover.execute_grand_product_computation_round(); }); // we need to get the relation_parameters and prover_polynomials from the oink_prover - prover.instance->relation_parameters = prover.oink_prover.relation_parameters; + prover.instance->proving_key = std::move(oink_prover.proving_key); + prover.instance->relation_parameters = oink_prover.relation_parameters; prover.instance->prover_polynomials = GoblinUltraFlavor::ProverPolynomials(prover.instance->proving_key); time_if_index(RELATION_CHECK, [&] { prover.execute_relation_check_rounds(); }); time_if_index(ZEROMORPH, [&] { prover.execute_zeromorph_rounds(); }); diff --git a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.cpp b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.cpp index 457d01c2834..65318197ff0 100644 --- a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy_prover.cpp @@ -6,7 +6,7 @@ template void ProtoGalaxyProver_::finalise_and_send_instance(std::shared_ptr instance, const std::string& domain_separator) { - OinkProver oink_prover(instance->proving_key, commitment_key, transcript, domain_separator + '_'); + OinkProver oink_prover(instance->proving_key, transcript, domain_separator + '_'); auto [proving_key, relation_params] = oink_prover.prove(); instance->proving_key = std::move(proving_key); diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.hpp b/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.hpp index 62b56944658..f573b2510bd 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.hpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.hpp @@ -54,12 +54,11 @@ template class OinkProver { bb::RelationParameters relation_parameters; OinkProver(ProvingKey& proving_key, - const std::shared_ptr& commitment_key, const std::shared_ptr& transcript, std::string domain_separator = "") : proving_key(std::move(proving_key)) , transcript(transcript) - , commitment_key(commitment_key) + , commitment_key(this->proving_key.commitment_key) , domain_separator(std::move(domain_separator)) {} diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_prover.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_prover.cpp index f6433c61abb..72a226c8f4f 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_prover.cpp @@ -1,5 +1,6 @@ #include "ultra_prover.hpp" #include "barretenberg/sumcheck/sumcheck.hpp" +#include "barretenberg/ultra_honk/oink_prover.hpp" namespace bb { @@ -15,7 +16,6 @@ UltraProver_::UltraProver_(const std::shared_ptr& inst, const : instance(std::move(inst)) , transcript(transcript) , commitment_key(instance->proving_key.commitment_key) - , oink_prover(inst->proving_key, commitment_key, transcript, "") {} /** @@ -30,7 +30,6 @@ UltraProver_::UltraProver_(Builder& circuit) : instance(std::make_shared(circuit)) , transcript(std::make_shared()) , commitment_key(instance->proving_key.commitment_key) - , oink_prover(instance->proving_key, commitment_key, transcript, "") {} /** @@ -79,6 +78,7 @@ template HonkProof& UltraProver_::export_proof() template HonkProof& UltraProver_::construct_proof() { + OinkProver oink_prover(instance->proving_key, transcript); auto [proving_key, relation_params] = oink_prover.prove(); instance->proving_key = std::move(proving_key); instance->relation_parameters = std::move(relation_params); diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_prover.hpp b/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_prover.hpp index e5831b778ca..a01b6d31e75 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_prover.hpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_prover.hpp @@ -7,7 +7,6 @@ #include "barretenberg/sumcheck/instance/prover_instance.hpp" #include "barretenberg/sumcheck/sumcheck_output.hpp" #include "barretenberg/transcript/transcript.hpp" -#include "barretenberg/ultra_honk/oink_prover.hpp" namespace bb { @@ -40,8 +39,6 @@ template class UltraProver_ { std::shared_ptr commitment_key; - OinkProver oink_prover; - explicit UltraProver_(const std::shared_ptr&, const std::shared_ptr& transcript = std::make_shared());