From 8dfebe4990195224dc162c9d98137040b30cfab2 Mon Sep 17 00:00:00 2001 From: Maddiaa <47148561+Maddiaa0@users.noreply.github.com> Date: Mon, 22 Jul 2024 18:45:30 +0100 Subject: [PATCH] feat: solidity honk verifier (#5485) This PR introduces a Honk Verifier for 3 different types of circuit. - The logic in each circuit is duplicated as (at the time of writing) solidity does not allow for generic data structures, so as the constants (LOG_N) are different, then each transcript needs to compile with a new log_n value. - In follow up prs i will adjust the tests to run against acir artifacts, where we will codegen the verifier, so i can remove all but the basic case in this test suite Note: this is not an optimal impl, that will follow As this uses padded proofs, in which N is 2^28, the proof verification cost has shot up to 1 793 675. --- .../commitment_schemes/kzg/kzg.hpp | 7 +- .../zeromorph/zeromorph.hpp | 6 +- .../execution_trace/execution_trace.cpp | 2 + .../cpp/src/barretenberg/flavor/flavor.hpp | 11 +- .../solidity_helpers/CMakeLists.txt | 18 +- .../circuits/ecdsa_circuit.hpp | 6 +- .../solidity_helpers/honk_key_gen.cpp | 90 + .../solidity_helpers/honk_proof_gen.cpp | 105 ++ .../solidity_helpers/honk_sol_gen.hpp | 112 ++ .../barretenberg/solidity_helpers/key_gen.cpp | 14 +- .../circuit_builders/circuit_builders_fwd.hpp | 2 + .../ultra_circuit_builder.hpp | 2 + .../stdlib_circuit_builders/ultra_flavor.hpp | 1 + .../stdlib_circuit_builders/ultra_keccak.hpp | 738 +++++++++ .../sumcheck/instance/prover_instance.cpp | 1 + .../sumcheck/instance/prover_instance.hpp | 1 + .../barretenberg/transcript/transcript.hpp | 65 +- .../ultra_honk/decider_prover.cpp | 1 + .../barretenberg/ultra_honk/oink_prover.cpp | 1 + .../barretenberg/ultra_honk/oink_prover.hpp | 1 + .../barretenberg/ultra_honk/oink_verifier.cpp | 1 + .../barretenberg/ultra_honk/oink_verifier.hpp | 1 + .../barretenberg/ultra_honk/ultra_prover.cpp | 1 + .../barretenberg/ultra_honk/ultra_prover.hpp | 1 + .../ultra_honk/ultra_verifier.cpp | 1 + .../ultra_honk/ultra_verifier.hpp | 1 + barretenberg/sol/foundry.toml | 3 + barretenberg/sol/scripts/init_honk.sh | 11 + barretenberg/sol/scripts/run_fuzzer.sh | 9 +- barretenberg/sol/src/honk/Fr.sol | 116 ++ barretenberg/sol/src/honk/HonkTypes.sol | 140 ++ barretenberg/sol/src/honk/HonkVerifier.sol | 1217 ++++++++++++++ barretenberg/sol/src/honk/Transcript.sol | 218 +++ .../sol/src/honk/instance/Add2Honk.sol | 1448 +++++++++++++++++ .../sol/src/honk/instance/BlakeHonk.sol | 1445 ++++++++++++++++ .../sol/src/honk/instance/EcdsaHonk.sol | 1445 ++++++++++++++++ .../src/honk/keys/Add2HonkVerificationKey.sol | 121 ++ .../honk/keys/BlakeHonkVerificationKey.sol | 120 ++ .../honk/keys/EcdsaHonkVerificationKey.sol | 120 ++ barretenberg/sol/src/honk/utils.sol | 102 ++ .../sol/src/ultra/BaseUltraVerifier.sol | 24 +- .../ultra/keys/Add2UltraVerificationKey.sol | 20 +- .../ultra/keys/BlakeUltraVerificationKey.sol | 72 +- .../ultra/keys/EcdsaUltraVerificationKey.sol | 76 +- .../keys/RecursiveUltraVerificationKey.sol | 80 +- .../sol/test/base/DifferentialFuzzer.sol | 6 +- barretenberg/sol/test/base/TestBase.sol | 49 +- barretenberg/sol/test/honk/Add2.t.sol | 46 + barretenberg/sol/test/honk/Blake.t.sol | 48 + barretenberg/sol/test/honk/ECDSA.t.sol | 49 + barretenberg/sol/test/honk/TestBaseHonk.sol | 26 + barretenberg/sol/test/ultra/TestBaseUltra.sol | 1 - 52 files changed, 8038 insertions(+), 164 deletions(-) create mode 100644 barretenberg/cpp/src/barretenberg/solidity_helpers/honk_key_gen.cpp create mode 100644 barretenberg/cpp/src/barretenberg/solidity_helpers/honk_proof_gen.cpp create mode 100644 barretenberg/cpp/src/barretenberg/solidity_helpers/honk_sol_gen.hpp create mode 100644 barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_keccak.hpp create mode 100755 barretenberg/sol/scripts/init_honk.sh create mode 100644 barretenberg/sol/src/honk/Fr.sol create mode 100644 barretenberg/sol/src/honk/HonkTypes.sol create mode 100644 barretenberg/sol/src/honk/HonkVerifier.sol create mode 100644 barretenberg/sol/src/honk/Transcript.sol create mode 100644 barretenberg/sol/src/honk/instance/Add2Honk.sol create mode 100644 barretenberg/sol/src/honk/instance/BlakeHonk.sol create mode 100644 barretenberg/sol/src/honk/instance/EcdsaHonk.sol create mode 100644 barretenberg/sol/src/honk/keys/Add2HonkVerificationKey.sol create mode 100644 barretenberg/sol/src/honk/keys/BlakeHonkVerificationKey.sol create mode 100644 barretenberg/sol/src/honk/keys/EcdsaHonkVerificationKey.sol create mode 100644 barretenberg/sol/src/honk/utils.sol create mode 100644 barretenberg/sol/test/honk/Add2.t.sol create mode 100644 barretenberg/sol/test/honk/Blake.t.sol create mode 100644 barretenberg/sol/test/honk/ECDSA.t.sol create mode 100644 barretenberg/sol/test/honk/TestBaseHonk.sol diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/kzg/kzg.hpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/kzg/kzg.hpp index a067b224fc6..1c403dc22cc 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/kzg/kzg.hpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/kzg/kzg.hpp @@ -30,9 +30,10 @@ template class KZG { * computed * @param prover_transcript Prover transcript */ + template static void compute_opening_proof(std::shared_ptr ck, const ProverOpeningClaim& opening_claim, - const std::shared_ptr& prover_trancript) + const std::shared_ptr& prover_trancript) { Polynomial quotient = opening_claim.polynomial; OpeningPair pair = opening_claim.opening_pair; @@ -56,7 +57,9 @@ template class KZG { * - P₀ = C − v⋅[1]₁ + r⋅[W(x)]₁ * - P₁ = [W(x)]₁ */ - static VerifierAccumulator reduce_verify(const OpeningClaim& claim, const auto& verifier_transcript) + template + static VerifierAccumulator reduce_verify(const OpeningClaim& claim, + const std::shared_ptr& verifier_transcript) { auto quotient_commitment = verifier_transcript->template receive_from_prover("KZG:W"); diff --git a/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp index 07efea29451..4f66c019c89 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/zeromorph/zeromorph.hpp @@ -322,6 +322,7 @@ template class ZeroMorphProver_ { * * @todo https://github.com/AztecProtocol/barretenberg/issues/1030: document concatenation trick */ + template static OpeningClaim prove(FF circuit_size, RefSpan f_polynomials, RefSpan g_polynomials, @@ -329,7 +330,7 @@ template class ZeroMorphProver_ { RefSpan g_shift_evaluations, std::span multilinear_challenge, const std::shared_ptr>& commitment_key, - const std::shared_ptr& transcript, + const std::shared_ptr& transcript, RefSpan concatenated_polynomials = {}, RefSpan concatenated_evaluations = {}, const std::vector>& concatenation_groups = {}) @@ -725,6 +726,7 @@ template class ZeroMorphVerifier_ { * @param transcript * @return VerifierAccumulator Inputs to the final PCS verification check that will be accumulated */ + template static OpeningClaim verify(FF circuit_size, RefSpan unshifted_commitments, RefSpan to_be_shifted_commitments, @@ -732,7 +734,7 @@ template class ZeroMorphVerifier_ { RefSpan shifted_evaluations, std::span multivariate_challenge, const Commitment& g1_identity, - auto& transcript, + const std::shared_ptr& transcript, const std::vector>& concatenation_group_commitments = {}, RefSpan concatenated_evaluations = {}) { diff --git a/barretenberg/cpp/src/barretenberg/execution_trace/execution_trace.cpp b/barretenberg/cpp/src/barretenberg/execution_trace/execution_trace.cpp index da72fd56703..3da86e2331e 100644 --- a/barretenberg/cpp/src/barretenberg/execution_trace/execution_trace.cpp +++ b/barretenberg/cpp/src/barretenberg/execution_trace/execution_trace.cpp @@ -3,6 +3,7 @@ #include "barretenberg/plonk/proof_system/proving_key/proving_key.hpp" #include "barretenberg/stdlib_circuit_builders/mega_flavor.hpp" #include "barretenberg/stdlib_circuit_builders/ultra_flavor.hpp" +#include "barretenberg/stdlib_circuit_builders/ultra_keccak.hpp" namespace bb { template @@ -162,6 +163,7 @@ void ExecutionTrace_::add_ecc_op_wires_to_proving_key(Builder& builder, } template class ExecutionTrace_; +template class ExecutionTrace_; template class ExecutionTrace_; template class ExecutionTrace_; template class ExecutionTrace_; diff --git a/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp b/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp index 0059b7e166f..6658ed78db7 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp @@ -355,6 +355,7 @@ template static constexpr auto create_tu namespace bb { class UltraFlavor; class ECCVMFlavor; +class UltraKeccakFlavor; class MegaFlavor; class TranslatorFlavor; template class UltraRecursiveFlavor_; @@ -383,16 +384,16 @@ template concept IsPlonkFlavor = IsAnyOf; template -concept IsUltraPlonkFlavor = IsAnyOf; +concept IsUltraPlonkFlavor = IsAnyOf; template -concept IsUltraPlonkOrHonk = IsAnyOf; +concept IsUltraPlonkOrHonk = IsAnyOf; template -concept IsHonkFlavor = IsAnyOf; +concept IsHonkFlavor = IsAnyOf; template -concept IsUltraFlavor = IsAnyOf; +concept IsUltraFlavor = IsAnyOf; template concept IsGoblinFlavor = IsAnyOf concept IsECCVMRecursiveFlavor = IsAnyOf concept IsGrumpkinFlavor = IsAnyOf; template concept IsFoldingFlavor = IsAnyOf, UltraRecursiveFlavor_, diff --git a/barretenberg/cpp/src/barretenberg/solidity_helpers/CMakeLists.txt b/barretenberg/cpp/src/barretenberg/solidity_helpers/CMakeLists.txt index 8c7c91633b8..7b91d9c40c4 100644 --- a/barretenberg/cpp/src/barretenberg/solidity_helpers/CMakeLists.txt +++ b/barretenberg/cpp/src/barretenberg/solidity_helpers/CMakeLists.txt @@ -1,6 +1,22 @@ -barretenberg_module(stdlib_solidity_helpers stdlib_sha256 stdlib_blake3s stdlib_blake2s stdlib_pedersen_commitment plonk) +barretenberg_module(stdlib_solidity_helpers ultra_honk stdlib_sha256 stdlib_blake3s stdlib_blake2s stdlib_pedersen_commitment plonk) if (NOT(FUZZING)) + # Honk + add_executable(honk_solidity_key_gen honk_key_gen.cpp) + + target_link_libraries( + honk_solidity_key_gen + stdlib_solidity_helpers + ) + + add_executable(honk_solidity_proof_gen honk_proof_gen.cpp) + + target_link_libraries( + honk_solidity_proof_gen + stdlib_solidity_helpers + ) + + # Plonk add_executable(solidity_key_gen key_gen.cpp) add_executable(solidity_proof_gen proof_gen.cpp) diff --git a/barretenberg/cpp/src/barretenberg/solidity_helpers/circuits/ecdsa_circuit.hpp b/barretenberg/cpp/src/barretenberg/solidity_helpers/circuits/ecdsa_circuit.hpp index a8001611fc5..92bbd07f99f 100644 --- a/barretenberg/cpp/src/barretenberg/solidity_helpers/circuits/ecdsa_circuit.hpp +++ b/barretenberg/cpp/src/barretenberg/solidity_helpers/circuits/ecdsa_circuit.hpp @@ -12,6 +12,8 @@ #include "barretenberg/stdlib/primitives/field/field.hpp" #include "barretenberg/stdlib/primitives/witness/witness.hpp" +namespace bb { + template class EcdsaCircuit { public: using field_ct = stdlib::field_t; @@ -89,4 +91,6 @@ template class EcdsaCircuit { return builder; } -}; \ No newline at end of file +}; + +} // namespace bb \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/solidity_helpers/honk_key_gen.cpp b/barretenberg/cpp/src/barretenberg/solidity_helpers/honk_key_gen.cpp new file mode 100644 index 00000000000..a225e6ec262 --- /dev/null +++ b/barretenberg/cpp/src/barretenberg/solidity_helpers/honk_key_gen.cpp @@ -0,0 +1,90 @@ + +#include +#include + +#include "barretenberg/stdlib_circuit_builders/ultra_circuit_builder.hpp" +#include "barretenberg/ultra_honk/ultra_prover.hpp" +#include "barretenberg/ultra_honk/ultra_verifier.hpp" + +#include "./honk_sol_gen.hpp" + +#include "circuits/add_2_circuit.hpp" +#include "circuits/blake_circuit.hpp" +#include "circuits/ecdsa_circuit.hpp" + +using namespace bb; + +using ProverInstance = ProverInstance_; +using VerificationKey = UltraKeccakFlavor::VerificationKey; + +template