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 79b53abb683c..f113305191cd 100644 --- a/barretenberg/cpp/src/barretenberg/benchmark/ultra_bench/ultra_honk_rounds.bench.cpp +++ b/barretenberg/cpp/src/barretenberg/benchmark/ultra_bench/ultra_honk_rounds.bench.cpp @@ -3,6 +3,7 @@ #include "barretenberg/benchmark/ultra_bench/mock_circuits.hpp" #include "barretenberg/common/op_count_google_bench.hpp" #include "barretenberg/stdlib_circuit_builders/ultra_circuit_builder.hpp" +#include "barretenberg/ultra_honk/decider_prover.hpp" #include "barretenberg/ultra_honk/oink_prover.hpp" #include "barretenberg/ultra_honk/ultra_prover.hpp" @@ -53,10 +54,13 @@ BB_PROFILE static void test_round_inner(State& state, GoblinUltraProver& prover, time_if_index(GRAND_PRODUCT_COMPUTATION, [&] { oink_prover.execute_grand_product_computation_round(); }); time_if_index(GENERATE_ALPHAS, [&] { prover.instance->alphas = oink_prover.generate_alphas_round(); }); // we need to get the relation_parameters and prover_polynomials from the oink_prover - prover.instance->proving_key = std::move(oink_prover.proving_key); prover.instance->relation_parameters = oink_prover.relation_parameters; - time_if_index(RELATION_CHECK, [&] { prover.execute_relation_check_rounds(); }); - time_if_index(ZEROMORPH, [&] { prover.execute_zeromorph_rounds(); }); + + prover.generate_gate_challenges(); + + DeciderProver_ decider_prover(prover.instance, prover.transcript); + time_if_index(RELATION_CHECK, [&] { decider_prover.execute_relation_check_rounds(); }); + time_if_index(ZEROMORPH, [&] { decider_prover.execute_zeromorph_rounds(); }); } BB_PROFILE static void test_round(State& state, size_t index) noexcept { diff --git a/barretenberg/cpp/src/barretenberg/client_ivc/client_ivc.hpp b/barretenberg/cpp/src/barretenberg/client_ivc/client_ivc.hpp index f2e0ee309c3b..763aa8bfa512 100644 --- a/barretenberg/cpp/src/barretenberg/client_ivc/client_ivc.hpp +++ b/barretenberg/cpp/src/barretenberg/client_ivc/client_ivc.hpp @@ -2,11 +2,11 @@ #include "barretenberg/goblin/goblin.hpp" #include "barretenberg/goblin/mock_circuits.hpp" -#include "barretenberg/protogalaxy/decider_prover.hpp" #include "barretenberg/protogalaxy/decider_verifier.hpp" #include "barretenberg/protogalaxy/protogalaxy_prover.hpp" #include "barretenberg/protogalaxy/protogalaxy_verifier.hpp" #include "barretenberg/sumcheck/instance/instances.hpp" +#include "barretenberg/ultra_honk/decider_prover.hpp" namespace bb { diff --git a/barretenberg/cpp/src/barretenberg/eccvm/eccvm_prover.cpp b/barretenberg/cpp/src/barretenberg/eccvm/eccvm_prover.cpp index ea860e1e4c71..538963c3f29f 100644 --- a/barretenberg/cpp/src/barretenberg/eccvm/eccvm_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/eccvm/eccvm_prover.cpp @@ -184,13 +184,13 @@ void ECCVMProver::execute_transcript_consistency_univariate_opening_round() translation_batching_challenge_v = transcript->template get_challenge("Translation:batching_challenge"); } -HonkProof& ECCVMProver::export_proof() +HonkProof ECCVMProver::export_proof() { proof = transcript->export_proof(); return proof; } -HonkProof& ECCVMProver::construct_proof() +HonkProof ECCVMProver::construct_proof() { BB_OP_COUNT_TIME_NAME("ECCVMProver::construct_proof"); diff --git a/barretenberg/cpp/src/barretenberg/eccvm/eccvm_prover.hpp b/barretenberg/cpp/src/barretenberg/eccvm/eccvm_prover.hpp index a4f99d8cde0e..24c6349d20ea 100644 --- a/barretenberg/cpp/src/barretenberg/eccvm/eccvm_prover.hpp +++ b/barretenberg/cpp/src/barretenberg/eccvm/eccvm_prover.hpp @@ -37,8 +37,8 @@ class ECCVMProver { BB_PROFILE void execute_zeromorph_rounds(); BB_PROFILE void execute_transcript_consistency_univariate_opening_round(); - HonkProof& export_proof(); - HonkProof& construct_proof(); + HonkProof export_proof(); + HonkProof construct_proof(); std::shared_ptr transcript; diff --git a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy.test.cpp b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy.test.cpp index 3148c54cd406..f925de29c27b 100644 --- a/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy.test.cpp +++ b/barretenberg/cpp/src/barretenberg/protogalaxy/protogalaxy.test.cpp @@ -1,10 +1,10 @@ #include "barretenberg/goblin/mock_circuits.hpp" #include "barretenberg/polynomials/pow.hpp" -#include "barretenberg/protogalaxy/decider_prover.hpp" #include "barretenberg/protogalaxy/decider_verifier.hpp" #include "barretenberg/protogalaxy/protogalaxy_prover.hpp" #include "barretenberg/protogalaxy/protogalaxy_verifier.hpp" #include "barretenberg/stdlib_circuit_builders/mock_circuits.hpp" +#include "barretenberg/ultra_honk/decider_prover.hpp" #include diff --git a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/protogalaxy_recursive_verifier.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/protogalaxy_recursive_verifier.test.cpp index 4d18d9f59d5b..673d7234df95 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/protogalaxy_recursive_verifier.test.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/protogalaxy_recursive_verifier.test.cpp @@ -1,7 +1,6 @@ #include "barretenberg/stdlib/honk_recursion/verifier/protogalaxy_recursive_verifier.hpp" #include "barretenberg/circuit_checker/circuit_checker.hpp" #include "barretenberg/common/test.hpp" -#include "barretenberg/protogalaxy/decider_prover.hpp" #include "barretenberg/protogalaxy/decider_verifier.hpp" #include "barretenberg/protogalaxy/protogalaxy_prover.hpp" #include "barretenberg/protogalaxy/protogalaxy_verifier.hpp" @@ -11,6 +10,7 @@ #include "barretenberg/stdlib/primitives/curves/bn254.hpp" #include "barretenberg/stdlib_circuit_builders/ultra_recursive_flavor.hpp" #include "barretenberg/sumcheck/instance/instances.hpp" +#include "barretenberg/ultra_honk/decider_prover.hpp" #include "barretenberg/ultra_honk/ultra_prover.hpp" #include "barretenberg/ultra_honk/ultra_verifier.hpp" 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 52776acbe42d..6453f6092a9f 100644 --- a/barretenberg/cpp/src/barretenberg/translator_vm/goblin_translator_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/translator_vm/goblin_translator_prover.cpp @@ -183,13 +183,13 @@ void GoblinTranslatorProver::execute_zeromorph_rounds() key->polynomials.get_concatenation_groups()); } -HonkProof& GoblinTranslatorProver::export_proof() +HonkProof GoblinTranslatorProver::export_proof() { proof = transcript->export_proof(); return proof; } -HonkProof& GoblinTranslatorProver::construct_proof() +HonkProof GoblinTranslatorProver::construct_proof() { BB_OP_COUNT_TIME_NAME("GoblinTranslatorProver::construct_proof"); diff --git a/barretenberg/cpp/src/barretenberg/translator_vm/goblin_translator_prover.hpp b/barretenberg/cpp/src/barretenberg/translator_vm/goblin_translator_prover.hpp index 077632dfc044..8dedc08ae413 100644 --- a/barretenberg/cpp/src/barretenberg/translator_vm/goblin_translator_prover.hpp +++ b/barretenberg/cpp/src/barretenberg/translator_vm/goblin_translator_prover.hpp @@ -37,8 +37,8 @@ class GoblinTranslatorProver { BB_PROFILE void execute_grand_product_computation_round(); BB_PROFILE void execute_relation_check_rounds(); BB_PROFILE void execute_zeromorph_rounds(); - HonkProof& export_proof(); - HonkProof& construct_proof(); + HonkProof export_proof(); + HonkProof construct_proof(); std::shared_ptr transcript = std::make_shared(); diff --git a/barretenberg/cpp/src/barretenberg/protogalaxy/decider_prover.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/decider_prover.cpp similarity index 91% rename from barretenberg/cpp/src/barretenberg/protogalaxy/decider_prover.cpp rename to barretenberg/cpp/src/barretenberg/ultra_honk/decider_prover.cpp index 7c17c906600e..75d90707ee4c 100644 --- a/barretenberg/cpp/src/barretenberg/protogalaxy/decider_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/decider_prover.cpp @@ -17,7 +17,7 @@ DeciderProver_::DeciderProver_(const std::shared_ptr& inst, const std::shared_ptr& transcript) : accumulator(std::move(inst)) , transcript(transcript) - , commitment_key(inst->proving_key.commitment_key) + , commitment_key(accumulator->proving_key.commitment_key) {} /** @@ -49,13 +49,13 @@ template void DeciderProver_::execute_zeromorph_r transcript); } -template HonkProof& DeciderProver_::export_proof() +template HonkProof DeciderProver_::export_proof() { proof = transcript->proof_data; return proof; } -template HonkProof& DeciderProver_::construct_proof() +template HonkProof DeciderProver_::construct_proof() { BB_OP_COUNT_TIME_NAME("Decider::construct_proof"); diff --git a/barretenberg/cpp/src/barretenberg/protogalaxy/decider_prover.hpp b/barretenberg/cpp/src/barretenberg/ultra_honk/decider_prover.hpp similarity index 96% rename from barretenberg/cpp/src/barretenberg/protogalaxy/decider_prover.hpp rename to barretenberg/cpp/src/barretenberg/ultra_honk/decider_prover.hpp index 977605f5a7db..3df1166b635e 100644 --- a/barretenberg/cpp/src/barretenberg/protogalaxy/decider_prover.hpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/decider_prover.hpp @@ -30,8 +30,8 @@ template class DeciderProver_ { BB_PROFILE void execute_relation_check_rounds(); BB_PROFILE void execute_zeromorph_rounds(); - HonkProof& export_proof(); - HonkProof& construct_proof(); + HonkProof export_proof(); + HonkProof construct_proof(); std::shared_ptr accumulator; diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/merge_verifier.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/merge_verifier.cpp index 18e30a1cdafd..72cadbe963cb 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/merge_verifier.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/merge_verifier.cpp @@ -17,7 +17,7 @@ MergeVerifier_::MergeVerifier_() * Schwartz-Zippel check. Evaluations are checked via batched KZG. * * @tparam Flavor - * @return HonkProof& + * @return bool */ template bool MergeVerifier_::verify_proof(const HonkProof& proof) { diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_prover.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_prover.cpp index 7030f194cb40..fb7bdbc768db 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_prover.cpp @@ -1,7 +1,7 @@ #include "ultra_prover.hpp" #include "barretenberg/sumcheck/sumcheck.hpp" +#include "barretenberg/ultra_honk/decider_prover.hpp" #include "barretenberg/ultra_honk/oink_prover.hpp" - namespace bb { /** @@ -32,64 +32,32 @@ UltraProver_::UltraProver_(Builder& circuit) , commitment_key(instance->proving_key.commitment_key) {} -/** - * @brief Run Sumcheck resulting in u = (u_1,...,u_d) challenges and all evaluations at u being calculated. - * - */ -template void UltraProver_::execute_relation_check_rounds() +template HonkProof UltraProver_::export_proof() { - using Sumcheck = SumcheckProver; - auto circuit_size = instance->proving_key.circuit_size; - auto sumcheck = Sumcheck(circuit_size, transcript); - - std::vector gate_challenges(numeric::get_msb(circuit_size)); + proof = transcript->proof_data; + return proof; +} +template void UltraProver_::generate_gate_challenges() +{ + std::vector gate_challenges(numeric::get_msb(instance->proving_key.circuit_size)); for (size_t idx = 0; idx < gate_challenges.size(); idx++) { gate_challenges[idx] = transcript->template get_challenge("Sumcheck:gate_challenge_" + std::to_string(idx)); } instance->gate_challenges = gate_challenges; - sumcheck_output = sumcheck.prove(instance); } -/** - * @brief Execute the ZeroMorph protocol to prove the multilinear evaluations produced by Sumcheck - * @details See https://hackmd.io/dlf9xEwhTQyE3hiGbq4FsA?view for a complete description of the unrolled protocol. - * - * */ -template void UltraProver_::execute_zeromorph_rounds() -{ - ZeroMorph::prove(instance->proving_key.polynomials.get_unshifted(), - instance->proving_key.polynomials.get_to_be_shifted(), - sumcheck_output.claimed_evaluations.get_unshifted(), - sumcheck_output.claimed_evaluations.get_shifted(), - sumcheck_output.challenge, - commitment_key, - transcript); -} - -template HonkProof& UltraProver_::export_proof() -{ - proof = transcript->proof_data; - return proof; -} - -template HonkProof& UltraProver_::construct_proof() +template HonkProof UltraProver_::construct_proof() { OinkProver oink_prover(instance->proving_key, transcript); auto [proving_key, relation_params, alphas] = oink_prover.prove(); instance->proving_key = std::move(proving_key); - instance->relation_parameters = std::move(relation_params); instance->alphas = alphas; - // Fiat-Shamir: alpha - // Run sumcheck subprotocol. - execute_relation_check_rounds(); - - // Fiat-Shamir: rho, y, x, z - // Execute Zeromorph multilinear PCS - execute_zeromorph_rounds(); + generate_gate_challenges(); - return export_proof(); + DeciderProver_ decider_prover(instance, transcript); + return decider_prover.construct_proof(); } template class UltraProver_; diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_prover.hpp b/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_prover.hpp index 279890e614bd..d0b5641081b2 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_prover.hpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/ultra_prover.hpp @@ -43,16 +43,10 @@ template class UltraProver_ { explicit UltraProver_(Builder&); - BB_PROFILE void execute_preamble_round(); - BB_PROFILE void execute_wire_commitments_round(); - BB_PROFILE void execute_sorted_list_accumulator_round(); - BB_PROFILE void execute_log_derivative_inverse_round(); - BB_PROFILE void execute_grand_product_computation_round(); - BB_PROFILE void execute_relation_check_rounds(); - BB_PROFILE void execute_zeromorph_rounds(); + BB_PROFILE void generate_gate_challenges(); - HonkProof& export_proof(); - HonkProof& construct_proof(); + HonkProof export_proof(); + HonkProof construct_proof(); private: HonkProof proof; diff --git a/barretenberg/cpp/src/barretenberg/vm/generated/avm_prover.cpp b/barretenberg/cpp/src/barretenberg/vm/generated/avm_prover.cpp index 064a1e7e3ac4..ccb49ac80706 100644 --- a/barretenberg/cpp/src/barretenberg/vm/generated/avm_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/vm/generated/avm_prover.cpp @@ -605,13 +605,13 @@ void AvmProver::execute_zeromorph_rounds() transcript); } -HonkProof& AvmProver::export_proof() +HonkProof AvmProver::export_proof() { proof = transcript->proof_data; return proof; } -HonkProof& AvmProver::construct_proof() +HonkProof AvmProver::construct_proof() { // Add circuit size public input size and public inputs to transcript. execute_preamble_round(); diff --git a/barretenberg/cpp/src/barretenberg/vm/generated/avm_prover.hpp b/barretenberg/cpp/src/barretenberg/vm/generated/avm_prover.hpp index 47e2603a9caa..74d504446a30 100644 --- a/barretenberg/cpp/src/barretenberg/vm/generated/avm_prover.hpp +++ b/barretenberg/cpp/src/barretenberg/vm/generated/avm_prover.hpp @@ -32,8 +32,8 @@ class AvmProver { void execute_relation_check_rounds(); void execute_zeromorph_rounds(); - HonkProof& export_proof(); - HonkProof& construct_proof(); + HonkProof export_proof(); + HonkProof construct_proof(); std::shared_ptr transcript = std::make_shared();