diff --git a/barretenberg/cpp/.clangd b/barretenberg/cpp/.clangd index 6ad597298fa0..c38612ce84f4 100644 --- a/barretenberg/cpp/.clangd +++ b/barretenberg/cpp/.clangd @@ -1,5 +1,5 @@ CompileFlags: # Tweak the parse settings - Remove: -fconstexpr-ops-limit=* + Remove: -fconstexpr-ops-limit=* -Wfatal-errors --- # Applies all barretenberg source files If: diff --git a/barretenberg/cpp/src/barretenberg/benchmark/simulator_bench/simulator.bench.cpp b/barretenberg/cpp/src/barretenberg/benchmark/simulator_bench/simulator.bench.cpp index 7414d58b559d..cd19252f6833 100644 --- a/barretenberg/cpp/src/barretenberg/benchmark/simulator_bench/simulator.bench.cpp +++ b/barretenberg/cpp/src/barretenberg/benchmark/simulator_bench/simulator.bench.cpp @@ -1,6 +1,8 @@ #include "barretenberg/goblin/goblin.hpp" #include "barretenberg/goblin/mock_circuits.hpp" #include "barretenberg/stdlib_circuit_builders/ultra_circuit_builder.hpp" +#include "barretenberg/ultra_honk/ultra_prover.hpp" +#include "barretenberg/ultra_honk/ultra_verifier.hpp" #include using namespace benchmark; diff --git a/barretenberg/cpp/src/barretenberg/client_ivc/client_ivc.hpp b/barretenberg/cpp/src/barretenberg/client_ivc/client_ivc.hpp index 06b1f20e5351..638a3d16fcc9 100644 --- a/barretenberg/cpp/src/barretenberg/client_ivc/client_ivc.hpp +++ b/barretenberg/cpp/src/barretenberg/client_ivc/client_ivc.hpp @@ -5,11 +5,14 @@ #include "barretenberg/plonk_honk_shared/execution_trace/execution_trace_usage_tracker.hpp" #include "barretenberg/protogalaxy/protogalaxy_prover.hpp" #include "barretenberg/protogalaxy/protogalaxy_verifier.hpp" +#include "barretenberg/stdlib/goblin_verifier/merge_recursive_verifier.hpp" #include "barretenberg/stdlib/honk_verifier/decider_recursive_verifier.hpp" #include "barretenberg/stdlib/primitives/databus/databus.hpp" #include "barretenberg/ultra_honk/decider_keys.hpp" #include "barretenberg/ultra_honk/decider_prover.hpp" #include "barretenberg/ultra_honk/decider_verifier.hpp" +#include "barretenberg/ultra_honk/ultra_prover.hpp" +#include "barretenberg/ultra_honk/ultra_verifier.hpp" #include namespace bb { diff --git a/barretenberg/cpp/src/barretenberg/goblin/goblin.cpp b/barretenberg/cpp/src/barretenberg/goblin/goblin.cpp index a21aaa2ca06c..15af11ca2da3 100644 --- a/barretenberg/cpp/src/barretenberg/goblin/goblin.cpp +++ b/barretenberg/cpp/src/barretenberg/goblin/goblin.cpp @@ -1 +1,94 @@ -// NB: This file is here so that goblin_objects will be created \ No newline at end of file +#include "goblin.hpp" +#include "barretenberg/eccvm/eccvm_verifier.hpp" +#include "barretenberg/stdlib_circuit_builders/mock_circuits.hpp" +#include "barretenberg/translator_vm/translator_prover.hpp" +#include "barretenberg/translator_vm/translator_proving_key.hpp" +#include "barretenberg/translator_vm/translator_verifier.hpp" +#include "barretenberg/ultra_honk/merge_verifier.hpp" + +namespace bb { + +Goblin::Goblin(const std::shared_ptr>& bn254_commitment_key) + : commitment_key(bn254_commitment_key) +{} + +Goblin::MergeProof Goblin::prove_merge(MegaBuilder& circuit_builder) +{ + PROFILE_THIS_NAME("Goblin::merge"); + if (circuit_builder.blocks.ecc_op.size() == 0) { + MockCircuits::construct_goblin_ecc_op_circuit(circuit_builder); + } + + MergeProver merge_prover{ circuit_builder.op_queue, commitment_key }; + merge_proof = merge_prover.construct_proof(); + return merge_proof; +} + +void Goblin::prove_eccvm() +{ + ECCVMBuilder eccvm_builder(op_queue); + ECCVMProver eccvm_prover(eccvm_builder); + goblin_proof.eccvm_proof = eccvm_prover.construct_proof(); + + translation_batching_challenge_v = eccvm_prover.batching_challenge_v; + evaluation_challenge_x = eccvm_prover.evaluation_challenge_x; + transcript = eccvm_prover.transcript; + goblin_proof.translation_evaluations = eccvm_prover.translation_evaluations; +} + +void Goblin::prove_translator() +{ + PROFILE_THIS_NAME("Create TranslatorBuilder and TranslatorProver"); + TranslatorBuilder translator_builder(translation_batching_challenge_v, evaluation_challenge_x, op_queue); + auto translator_key = std::make_shared(translator_builder, commitment_key); + TranslatorProver translator_prover(translator_key, transcript); + goblin_proof.translator_proof = translator_prover.construct_proof(); +} + +GoblinProof Goblin::prove(MergeProof merge_proof_in) +{ + PROFILE_THIS_NAME("Goblin::prove"); + + info("Constructing a Goblin proof with num ultra ops = ", op_queue->get_ultra_ops_table_num_rows()); + + goblin_proof.merge_proof = merge_proof_in.empty() ? std::move(merge_proof) : std::move(merge_proof_in); + { + PROFILE_THIS_NAME("prove_eccvm"); + vinfo("prove eccvm..."); + prove_eccvm(); + vinfo("finished eccvm proving."); + } + { + PROFILE_THIS_NAME("prove_translator"); + vinfo("prove translator..."); + prove_translator(); + vinfo("finished translator proving."); + } + return goblin_proof; +} + +bool Goblin::verify(const GoblinProof& proof) +{ + MergeVerifier merge_verifier; + bool merge_verified = merge_verifier.verify_proof(proof.merge_proof); + + ECCVMVerifier eccvm_verifier{}; + bool eccvm_verified = eccvm_verifier.verify_proof(proof.eccvm_proof); + + TranslatorVerifier translator_verifier(eccvm_verifier.transcript); + + bool accumulator_construction_verified = translator_verifier.verify_proof( + proof.translator_proof, eccvm_verifier.evaluation_challenge_x, eccvm_verifier.batching_challenge_v); + + bool translation_verified = translator_verifier.verify_translation(proof.translation_evaluations, + eccvm_verifier.translation_masking_term_eval); + + vinfo("merge verified?: ", merge_verified); + vinfo("eccvm verified?: ", eccvm_verified); + vinfo("accumulator construction_verified?: ", accumulator_construction_verified); + vinfo("translation verified?: ", translation_verified); + + return merge_verified && eccvm_verified && accumulator_construction_verified && translation_verified; +} + +} // namespace bb diff --git a/barretenberg/cpp/src/barretenberg/goblin/goblin.hpp b/barretenberg/cpp/src/barretenberg/goblin/goblin.hpp index 1857432f5747..f516f1e9624a 100644 --- a/barretenberg/cpp/src/barretenberg/goblin/goblin.hpp +++ b/barretenberg/cpp/src/barretenberg/goblin/goblin.hpp @@ -1,23 +1,14 @@ +// goblin.hpp #pragma once -#include "barretenberg/eccvm/eccvm_circuit_builder.hpp" +#include "barretenberg/eccvm/eccvm_flavor.hpp" #include "barretenberg/eccvm/eccvm_prover.hpp" -#include "barretenberg/eccvm/eccvm_trace_checker.hpp" -#include "barretenberg/eccvm/eccvm_verifier.hpp" -#include "barretenberg/goblin/mock_circuits.hpp" #include "barretenberg/goblin/types.hpp" -#include "barretenberg/plonk_honk_shared/proving_key_inspector.hpp" -#include "barretenberg/polynomials/polynomial.hpp" -#include "barretenberg/stdlib/goblin_verifier/merge_recursive_verifier.hpp" -#include "barretenberg/stdlib_circuit_builders/mega_circuit_builder.hpp" #include "barretenberg/stdlib_circuit_builders/mega_flavor.hpp" #include "barretenberg/translator_vm/translator_circuit_builder.hpp" -#include "barretenberg/translator_vm/translator_prover.hpp" -#include "barretenberg/translator_vm/translator_verifier.hpp" +#include "barretenberg/translator_vm/translator_flavor.hpp" +#include "barretenberg/ultra_honk/decider_proving_key.hpp" #include "barretenberg/ultra_honk/merge_prover.hpp" -#include "barretenberg/ultra_honk/merge_verifier.hpp" -#include "barretenberg/ultra_honk/ultra_prover.hpp" -#include "barretenberg/ultra_honk/ultra_verifier.hpp" namespace bb { @@ -55,120 +46,17 @@ class Goblin { std::make_shared(); }; - Goblin(const std::shared_ptr>& bn254_commitment_key = nullptr) - : commitment_key(bn254_commitment_key) - {} + Goblin(const std::shared_ptr>& bn254_commitment_key = nullptr); - /** - * @brief Construct a merge proof for the goblin ECC ops in the provided circuit - * - * @param circuit_builder - */ - MergeProof prove_merge(MegaBuilder& circuit_builder) - { - PROFILE_THIS_NAME("Goblin::merge"); - // TODO(https://github.com/AztecProtocol/barretenberg/issues/993): Some circuits (particularly on the first call - // to accumulate) may not have any goblin ecc ops prior to the call to merge(), so the commitment to the new - // contribution (C_t_shift) in the merge prover will be the point at infinity. (Note: Some dummy ops are added - // in 'add_gates_to_ensure...' but not until proving_key construction which comes later). See issue for ideas - // about how to resolve. - if (circuit_builder.blocks.ecc_op.size() == 0) { - MockCircuits::construct_goblin_ecc_op_circuit(circuit_builder); // Add some arbitrary goblin ECC ops - } + MergeProof prove_merge(MegaBuilder& circuit_builder); - MergeProver merge_prover{ circuit_builder.op_queue, commitment_key }; - merge_proof = merge_prover.construct_proof(); - return merge_proof; - }; - - /** - * @brief Construct an ECCVM proof and the translation polynomial evaluations - */ - void prove_eccvm() - { - ECCVMBuilder eccvm_builder(op_queue); - ECCVMProver eccvm_prover(eccvm_builder); - goblin_proof.eccvm_proof = eccvm_prover.construct_proof(); - - translation_batching_challenge_v = eccvm_prover.batching_challenge_v; - evaluation_challenge_x = eccvm_prover.evaluation_challenge_x; - transcript = eccvm_prover.transcript; - goblin_proof.translation_evaluations = eccvm_prover.translation_evaluations; - } - - /** - * @brief Construct a translator proof - * - */ - void prove_translator() - { - PROFILE_THIS_NAME("Create TranslatorBuilder and TranslatorProver"); - TranslatorBuilder translator_builder(translation_batching_challenge_v, evaluation_challenge_x, op_queue); - auto translator_key = std::make_shared(translator_builder, commitment_key); - TranslatorProver translator_prover(translator_key, transcript); - goblin_proof.translator_proof = translator_prover.construct_proof(); - } - - /** - * @brief Constuct a full Goblin proof (ECCVM, Translator, merge) - * @details The merge proof is assumed to already have been constucted in the last accumulate step. It is simply - * moved into the final proof here. - * - * @return Proof - */ - GoblinProof prove(MergeProof merge_proof_in = {}) - { - - PROFILE_THIS_NAME("Goblin::prove"); - - info("Constructing a Goblin proof with num ultra ops = ", op_queue->get_ultra_ops_table_num_rows()); + void prove_eccvm(); - goblin_proof.merge_proof = merge_proof_in.empty() ? std::move(merge_proof) : std::move(merge_proof_in); - { - PROFILE_THIS_NAME("prove_eccvm"); - vinfo("prove eccvm..."); - prove_eccvm(); - vinfo("finished eccvm proving."); - } - { - PROFILE_THIS_NAME("prove_translator"); - vinfo("prove translator..."); - prove_translator(); - vinfo("finished translator proving."); - } - return goblin_proof; - }; - - /** - * @brief Verify a full Goblin proof (ECCVM, Translator, merge) - * - * @param proof - * @return true - * @return false - */ - static bool verify(const GoblinProof& proof) - { - MergeVerifier merge_verifier; - bool merge_verified = merge_verifier.verify_proof(proof.merge_proof); - - ECCVMVerifier eccvm_verifier{}; - bool eccvm_verified = eccvm_verifier.verify_proof(proof.eccvm_proof); - - TranslatorVerifier translator_verifier(eccvm_verifier.transcript); + void prove_translator(); - bool accumulator_construction_verified = translator_verifier.verify_proof( - proof.translator_proof, eccvm_verifier.evaluation_challenge_x, eccvm_verifier.batching_challenge_v); + GoblinProof prove(MergeProof merge_proof_in = {}); - bool translation_verified = translator_verifier.verify_translation( - proof.translation_evaluations, eccvm_verifier.translation_masking_term_eval); - - vinfo("merge verified?: ", merge_verified); - vinfo("eccvm verified?: ", eccvm_verified); - vinfo("accumulator construction_verified?: ", accumulator_construction_verified); - vinfo("translation verified?: ", translation_verified); - - return merge_verified && eccvm_verified && accumulator_construction_verified && translation_verified; - }; + static bool verify(const GoblinProof& proof); }; } // namespace bb diff --git a/barretenberg/cpp/src/barretenberg/stdlib/goblin_verifier/goblin_recursion.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/goblin_verifier/goblin_recursion.test.cpp index f0c7d8863d9a..e51da87f8c57 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/goblin_verifier/goblin_recursion.test.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/goblin_verifier/goblin_recursion.test.cpp @@ -2,6 +2,8 @@ #include "barretenberg/goblin/mock_circuits.hpp" #include "barretenberg/stdlib_circuit_builders/mega_circuit_builder.hpp" #include "barretenberg/stdlib_circuit_builders/ultra_circuit_builder.hpp" +#include "barretenberg/ultra_honk/ultra_prover.hpp" +#include "barretenberg/ultra_honk/ultra_verifier.hpp" #include diff --git a/barretenberg/cpp/src/barretenberg/stdlib/goblin_verifier/goblin_recursive_verifier.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/goblin_verifier/goblin_recursive_verifier.test.cpp index 1053e07d2e75..8f8e1aa1bae3 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/goblin_verifier/goblin_recursive_verifier.test.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/goblin_verifier/goblin_recursive_verifier.test.cpp @@ -3,6 +3,7 @@ #include "barretenberg/common/test.hpp" #include "barretenberg/goblin/goblin.hpp" #include "barretenberg/stdlib/honk_verifier/ultra_verification_keys_comparator.hpp" +#include "barretenberg/stdlib_circuit_builders/mock_circuits.hpp" #include "barretenberg/ultra_honk/ultra_prover.hpp" #include "barretenberg/ultra_honk/ultra_verifier.hpp" diff --git a/barretenberg/cpp/src/barretenberg/vm2/constraining/recursion/goblin_avm_recursive_verifier.hpp b/barretenberg/cpp/src/barretenberg/vm2/constraining/recursion/goblin_avm_recursive_verifier.hpp index 41810d1ea29f..4c3b708d5cc7 100644 --- a/barretenberg/cpp/src/barretenberg/vm2/constraining/recursion/goblin_avm_recursive_verifier.hpp +++ b/barretenberg/cpp/src/barretenberg/vm2/constraining/recursion/goblin_avm_recursive_verifier.hpp @@ -4,7 +4,9 @@ #include "barretenberg/goblin/goblin.hpp" #include "barretenberg/stdlib/goblin_verifier/goblin_recursive_verifier.hpp" #include "barretenberg/stdlib/hash/poseidon2/poseidon2.hpp" +#include "barretenberg/stdlib/honk_verifier/ultra_recursive_verifier.hpp" #include "barretenberg/stdlib_circuit_builders/mega_flavor.hpp" +#include "barretenberg/stdlib_circuit_builders/mega_recursive_flavor.hpp" #include "barretenberg/ultra_honk/ultra_prover.hpp" #include "barretenberg/ultra_honk/ultra_verifier.hpp" #include "barretenberg/vm2/constraining/recursion/recursive_flavor.hpp"