diff --git a/barretenberg/cpp/src/barretenberg/constants.hpp b/barretenberg/cpp/src/barretenberg/constants.hpp index 7f8959b5e312..732e6eea5fc1 100644 --- a/barretenberg/cpp/src/barretenberg/constants.hpp +++ b/barretenberg/cpp/src/barretenberg/constants.hpp @@ -21,16 +21,20 @@ static constexpr uint32_t MAX_DATABUS_SIZE = 10000; // The number of entries in ProverPolynomials reserved for randomness intended to mask witness commitments, witness // evaluation at the sumcheck challenge, and, if necessary, the evaluation of the corresponding shift static constexpr uint32_t MASKING_OFFSET = 4; + // For ZK Flavors: the number of the commitments required by Libra and SmallSubgroupIPA. static constexpr uint32_t NUM_LIBRA_COMMITMENTS = 3; + // The SmallSubgroupIPA is a sub-protocol used in several Flavors, to prove claimed inner product, the Prover sends 4 // extra evaluations static constexpr uint32_t NUM_SMALL_IPA_EVALUATIONS = 4; static constexpr uint32_t MERGE_PROOF_SIZE = 65; // used to ensure mock proofs are generated correctly + // There are 5 distinguished wires in ECCVM that have to be opened as univariates to establish the connection between // ECCVM and Translator static constexpr uint32_t NUM_TRANSLATION_EVALUATIONS = 5; + // Upper bound on the number of claims produced GeminiProver: // - Each fold polynomial is opened at two points, the number of resulting claims is bounded by 2*CONST_PROOF_SIZE_LOG_N // - The interleaving trick needed for Translator adds 2 extra claims diff --git a/barretenberg/cpp/src/barretenberg/goblin/goblin.hpp b/barretenberg/cpp/src/barretenberg/goblin/goblin.hpp index 582d64e1e301..7e6477c47326 100644 --- a/barretenberg/cpp/src/barretenberg/goblin/goblin.hpp +++ b/barretenberg/cpp/src/barretenberg/goblin/goblin.hpp @@ -36,7 +36,6 @@ class GoblinProver { using TranslationEvaluations = ECCVMProver::TranslationEvaluations; using TranslatorBuilder = TranslatorCircuitBuilder; - using MergeProver = MergeProver_; using VerificationKey = MegaFlavor::VerificationKey; using MergeProof = MergeProver::MergeProof; @@ -170,7 +169,6 @@ class GoblinVerifier { public: using ECCVMVerificationKey = ECCVMFlavor::VerificationKey; using TranslatorVerificationKey = bb::TranslatorFlavor::VerificationKey; - using MergeVerifier = bb::MergeVerifier_; using Builder = MegaCircuitBuilder; using RecursiveMergeVerifier = stdlib::recursion::goblin::MergeRecursiveVerifier_; using PairingPoints = RecursiveMergeVerifier::PairingPoints; diff --git a/barretenberg/cpp/src/barretenberg/goblin/mock_circuits.hpp b/barretenberg/cpp/src/barretenberg/goblin/mock_circuits.hpp index f6b11123a589..d96801403b34 100644 --- a/barretenberg/cpp/src/barretenberg/goblin/mock_circuits.hpp +++ b/barretenberg/cpp/src/barretenberg/goblin/mock_circuits.hpp @@ -53,7 +53,7 @@ class GoblinMockCircuits { using RecursiveVerificationKey = RecursiveDeciderVerificationKey::VerificationKey; using RecursiveVerifierAccumulator = std::shared_ptr; using VerificationKey = Flavor::VerificationKey; - static constexpr size_t NUM_OP_QUEUE_COLUMNS = Flavor::NUM_WIRES; + static constexpr size_t NUM_WIRES = Flavor::NUM_WIRES; struct KernelInput { HonkProof proof; diff --git a/barretenberg/cpp/src/barretenberg/stdlib/goblin_verifier/merge_verifier.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/goblin_verifier/merge_verifier.test.cpp index bde2df6f622f..8180548bbc0a 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/goblin_verifier/merge_verifier.test.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/goblin_verifier/merge_verifier.test.cpp @@ -31,8 +31,6 @@ template class RecursiveMergeVerifierTest : public test using Commitment = InnerFlavor::Commitment; using FF = InnerFlavor::FF; using VerifierCommitmentKey = bb::VerifierCommitmentKey; - using MergeProver = MergeProver_; - using MergeVerifier = MergeVerifier_; public: static void SetUpTestSuite() { bb::srs::init_crs_factory(bb::srs::get_ignition_crs_path()); } diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/mega_honk.test.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/mega_honk.test.cpp index 7a2997829e9c..4d9b41181b77 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/mega_honk.test.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/mega_honk.test.cpp @@ -27,8 +27,6 @@ template class MegaHonkTests : public ::testing::Test { using FF = Curve::ScalarField; using Point = Curve::AffineElement; using CommitmentKey = bb::CommitmentKey; - using MergeProver = MergeProver_; - using MergeVerifier = MergeVerifier_; using Prover = UltraProver_; using Verifier = UltraVerifier_; using VerificationKey = typename Flavor::VerificationKey; @@ -97,7 +95,6 @@ TYPED_TEST_SUITE(MegaHonkTests, FlavorTypes); TYPED_TEST(MegaHonkTests, MergeProofSizeCheck) { using Flavor = TypeParam; - using MergeProver = MergeProver_; auto builder = typename Flavor::CircuitBuilder{}; GoblinMockCircuits::construct_simple_circuit(builder); diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/merge_prover.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/merge_prover.cpp index 2d64775dbc1d..2b43a17e4f4a 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/merge_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/merge_prover.cpp @@ -8,9 +8,7 @@ namespace bb { * @details We require an SRS at least as large as the current ultra ecc ops table * TODO(https://github.com/AztecProtocol/barretenberg/issues/1267): consider possible efficiency improvements */ -template -MergeProver_::MergeProver_(const std::shared_ptr& op_queue, - std::shared_ptr commitment_key) +MergeProver::MergeProver(const std::shared_ptr& op_queue, std::shared_ptr commitment_key) : op_queue(op_queue) , pcs_commitment_key(commitment_key ? commitment_key : std::make_shared(op_queue->get_ultra_ops_table_num_rows())) @@ -30,7 +28,7 @@ MergeProver_::MergeProver_(const std::shared_ptr& op_queue, * * @return honk::proof */ -template MergeProver_::MergeProof MergeProver_::construct_proof() +MergeProver::MergeProof MergeProver::construct_proof() { transcript = std::make_shared(); @@ -100,9 +98,4 @@ template MergeProver_::MergeProof MergeProver_ return transcript->proof_data; } - -template class MergeProver_; -template class MergeProver_; -template class MergeProver_; - } // namespace bb diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/merge_prover.hpp b/barretenberg/cpp/src/barretenberg/ultra_honk/merge_prover.hpp index 2abab06f3865..b4ab9a1e4658 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/merge_prover.hpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/merge_prover.hpp @@ -13,13 +13,13 @@ namespace bb { * @brief Prover class for the Goblin ECC op queue transcript merge protocol * */ -template class MergeProver_ { - using FF = typename Flavor::FF; - using Polynomial = typename Flavor::Polynomial; - using CommitmentKey = typename Flavor::CommitmentKey; - using Commitment = typename Flavor::Commitment; - using PCS = typename Flavor::PCS; - using Curve = typename Flavor::Curve; +class MergeProver { + using Curve = curve::BN254; + using FF = Curve::ScalarField; + using Commitment = Curve::AffineElement; + using Polynomial = bb::Polynomial; + using CommitmentKey = bb::CommitmentKey; + using PCS = KZG; using OpeningClaim = ProverOpeningClaim; using OpeningPair = bb::OpeningPair; using Transcript = NativeTranscript; @@ -29,15 +29,17 @@ template class MergeProver_ { std::shared_ptr transcript; - explicit MergeProver_(const std::shared_ptr& op_queue, - std::shared_ptr commitment_key = nullptr); + explicit MergeProver(const std::shared_ptr& op_queue, + std::shared_ptr commitment_key = nullptr); BB_PROFILE MergeProof construct_proof(); private: std::shared_ptr op_queue; std::shared_ptr pcs_commitment_key; - static constexpr size_t NUM_WIRES = MegaFlavor::NUM_WIRES; + // Number of columns that jointly constitute the op_queue, should be the same as the number of wires in the + // MegaCircuitBuilder + static constexpr size_t NUM_WIRES = MegaExecutionTraceBlocks::NUM_WIRES; }; } // namespace bb diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/merge_verifier.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/merge_verifier.cpp index 9569d44038d8..8d49131aa301 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/merge_verifier.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/merge_verifier.cpp @@ -4,8 +4,7 @@ namespace bb { -template -MergeVerifier_::MergeVerifier_() +MergeVerifier::MergeVerifier() : transcript(std::make_shared()) , pcs_verification_key(std::make_unique()){}; @@ -22,17 +21,17 @@ MergeVerifier_::MergeVerifier_() * @tparam Flavor * @return bool Verification result */ -template bool MergeVerifier_::verify_proof(const HonkProof& proof) +bool MergeVerifier::verify_proof(const HonkProof& proof) { transcript = std::make_shared(proof); uint32_t subtable_size = transcript->template receive_from_prover("subtable_size"); // Receive table column polynomial commitments [t_j], [T_{j,prev}], and [T_j], j = 1,2,3,4 - std::array t_commitments; - std::array T_prev_commitments; - std::array T_commitments; - for (size_t idx = 0; idx < Flavor::NUM_WIRES; ++idx) { + std::array t_commitments; + std::array T_prev_commitments; + std::array T_commitments; + for (size_t idx = 0; idx < NUM_WIRES; ++idx) { std::string suffix = std::to_string(idx); t_commitments[idx] = transcript->template receive_from_prover("t_CURRENT_" + suffix); T_prev_commitments[idx] = transcript->template receive_from_prover("T_PREV_" + suffix); @@ -42,13 +41,13 @@ template bool MergeVerifier_::verify_proof(const HonkP FF kappa = transcript->template get_challenge("kappa"); // Receive evaluations t_j(\kappa), T_{j,prev}(\kappa), T_j(\kappa), j = 1,2,3,4 - std::array t_evals; - std::array T_prev_evals; - std::array T_evals; - for (size_t idx = 0; idx < Flavor::NUM_WIRES; ++idx) { + std::array t_evals; + std::array T_prev_evals; + std::array T_evals; + for (size_t idx = 0; idx < NUM_WIRES; ++idx) { t_evals[idx] = transcript->template receive_from_prover("t_eval_" + std::to_string(idx)); } - for (size_t idx = 0; idx < Flavor::NUM_WIRES; ++idx) { + for (size_t idx = 0; idx < NUM_WIRES; ++idx) { T_prev_evals[idx] = transcript->template receive_from_prover("T_prev_eval_" + std::to_string(idx)); } for (size_t idx = 0; idx < NUM_WIRES; ++idx) { @@ -91,9 +90,4 @@ template bool MergeVerifier_::verify_proof(const HonkP auto verified = pcs_verification_key->pairing_check(pairing_points[0], pairing_points[1]); return identity_checked && verified; } - -template class MergeVerifier_; -template class MergeVerifier_; -template class MergeVerifier_; - } // namespace bb diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/merge_verifier.hpp b/barretenberg/cpp/src/barretenberg/ultra_honk/merge_verifier.hpp index 80e0ccc158af..2afe0ba27614 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/merge_verifier.hpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/merge_verifier.hpp @@ -13,8 +13,8 @@ namespace bb { * @brief Verifier class for the Goblin ECC op queue transcript merge protocol * */ -template class MergeVerifier_ { - using Curve = typename Flavor::Curve; +class MergeVerifier { + using Curve = curve::BN254; using FF = typename Curve::ScalarField; using Commitment = typename Curve::AffineElement; using PCS = bb::KZG; @@ -25,12 +25,14 @@ template class MergeVerifier_ { public: std::shared_ptr transcript; - explicit MergeVerifier_(); + explicit MergeVerifier(); bool verify_proof(const HonkProof& proof); private: std::shared_ptr pcs_verification_key; - static constexpr size_t NUM_WIRES = Flavor::NUM_WIRES; + // Number of columns that jointly constitute the op_queue, should be the same as the number of wires in the + // MegaCircuitBuilder + static constexpr size_t NUM_WIRES = MegaExecutionTraceBlocks::NUM_WIRES; }; } // namespace bb