From d132a10bc2180b062ab683defe22202648309177 Mon Sep 17 00:00:00 2001 From: lucasxia01 Date: Tue, 19 Mar 2024 15:46:54 +0000 Subject: [PATCH 01/17] 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/17] 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/17] 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/17] 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/17] 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/17] 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/17] 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/17] 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/17] 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/17] 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/17] 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/17] 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/17] =?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/17] 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/17] 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/17] 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/17] 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(); } }