diff --git a/.gitignore b/.gitignore index 9b24bd6b71..895c6e97ca 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ -.vscode result node_modules .yarn/cache diff --git a/.vscode/settings.json b/.vscode/settings.json index 359183951d..489043bab0 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -115,8 +115,8 @@ "typescript.enablePromptUseWorkspaceTsdk": true, "eslint.nodePath": "ts/.yarn/sdks", "prettier.prettierPath": "ts/.yarn/sdks/prettier/index.js", - "[cpp]": { - "editor.defaultFormatter": "ms-vscode.cpptools" + "[cpp]": { // doesn't conflict with barratenberg.code-workspace settings. + "editor.defaultFormatter": "llvm-vs-code-extensions.vscode-clangd" }, "[terraform]": { "editor.defaultFormatter": "hashicorp.terraform" @@ -128,4 +128,4 @@ "editor.defaultFormatter": "esbenp.prettier-vscode" }, "cmake.sourceDirectory": "${workspaceFolder}/cpp" -} +} \ No newline at end of file diff --git a/cpp/src/barretenberg/honk/composer/composer_helper/standard_honk_composer_helper.cpp b/cpp/src/barretenberg/honk/composer/composer_helper/standard_honk_composer_helper.cpp index a16827d488..4117dbcdd2 100644 --- a/cpp/src/barretenberg/honk/composer/composer_helper/standard_honk_composer_helper.cpp +++ b/cpp/src/barretenberg/honk/composer/composer_helper/standard_honk_composer_helper.cpp @@ -111,9 +111,9 @@ std::shared_ptr StandardHonkComposerHelper(circuit_constructor, - circuit_proving_key.get()); - compute_standard_honk_id_polynomials(circuit_proving_key.get()); + compute_standard_honk_sigma_permutations(circuit_constructor, + circuit_proving_key.get()); + compute_standard_honk_id_polynomials(circuit_proving_key.get()); compute_first_and_last_lagrange_polynomials(circuit_proving_key.get()); diff --git a/cpp/src/barretenberg/honk/composer/composer_helper/standard_honk_composer_helper.hpp b/cpp/src/barretenberg/honk/composer/composer_helper/standard_honk_composer_helper.hpp index ed776170bf..80e48a5eeb 100644 --- a/cpp/src/barretenberg/honk/composer/composer_helper/standard_honk_composer_helper.hpp +++ b/cpp/src/barretenberg/honk/composer/composer_helper/standard_honk_composer_helper.hpp @@ -9,7 +9,7 @@ #include "barretenberg/honk/pcs/commitment_key.hpp" #include "barretenberg/proof_system/verification_key/verification_key.hpp" #include "barretenberg/plonk/proof_system/verifier/verifier.hpp" -#include "barretenberg/proof_system/composer/composer_base.hpp" +#include "barretenberg/proof_system/arithmetization/gate_data.hpp" #include "barretenberg/proof_system/composer/composer_helper_lib.hpp" #include "barretenberg/proof_system/composer/permutation_helper.hpp" @@ -21,7 +21,7 @@ namespace honk { template class StandardHonkComposerHelper { public: static constexpr size_t NUM_RANDOMIZED_GATES = 2; // equal to the number of multilinear evaluations leaked - static constexpr size_t program_width = CircuitConstructor::program_width; + static constexpr size_t num_wires = CircuitConstructor::num_wires; std::shared_ptr circuit_proving_key; std::vector wire_polynomials; std::shared_ptr circuit_verification_key; diff --git a/cpp/src/barretenberg/honk/composer/standard_honk_composer.hpp b/cpp/src/barretenberg/honk/composer/standard_honk_composer.hpp index b64615d6a4..52d4579fd5 100644 --- a/cpp/src/barretenberg/honk/composer/standard_honk_composer.hpp +++ b/cpp/src/barretenberg/honk/composer/standard_honk_composer.hpp @@ -28,7 +28,7 @@ class StandardHonkComposer { // Leaving it in for now just in case bool contains_recursive_proof = false; - static constexpr size_t program_width = STANDARD_WIDTH; + static constexpr size_t num_wires = StandardCircuitConstructor::num_wires; /**Standard methods*/ diff --git a/cpp/src/barretenberg/honk/composer/standard_honk_composer.test.cpp b/cpp/src/barretenberg/honk/composer/standard_honk_composer.test.cpp index f45f5279bf..a9970add68 100644 --- a/cpp/src/barretenberg/honk/composer/standard_honk_composer.test.cpp +++ b/cpp/src/barretenberg/honk/composer/standard_honk_composer.test.cpp @@ -40,7 +40,7 @@ TEST(StandardHonkComposer, SigmaIDCorrectness) barretenberg::fr right = barretenberg::fr::one(); // Let's check that indices are the same and nothing is lost, first - for (size_t j = 0; j < composer.program_width; ++j) { + for (size_t j = 0; j < composer.num_wires; ++j) { std::string index = std::to_string(j + 1); const auto& sigma_j = proving_key->polynomial_store.get("sigma_" + index + "_lagrange"); for (size_t i = 0; i < n; ++i) { @@ -66,7 +66,7 @@ TEST(StandardHonkComposer, SigmaIDCorrectness) // Now let's check that witness values correspond to the permutation composer.compute_witness(); - for (size_t j = 0; j < composer.program_width; ++j) { + for (size_t j = 0; j < composer.num_wires; ++j) { std::string index = std::to_string(j + 1); const auto& permutation_polynomial = proving_key->polynomial_store.get("sigma_" + index + "_lagrange"); const auto& witness_polynomial = composer.composer_helper.wire_polynomials[j]; @@ -207,11 +207,11 @@ TEST(StandardHonkComposer, AssertEquals) auto get_maximum_cycle = [](auto& composer) { // Compute the proving key for sigma polynomials auto proving_key = composer.compute_proving_key(); - auto permutation_length = composer.program_width * proving_key->circuit_size; + auto permutation_length = composer.num_wires * proving_key->circuit_size; std::vector sigma_polynomials; // Put the sigma polynomials into a vector for easy access - for (size_t i = 0; i < composer.program_width; i++) { + for (size_t i = 0; i < composer.num_wires; i++) { std::string index = std::to_string(i + 1); sigma_polynomials.push_back(proving_key->polynomial_store.get("sigma_" + index + "_lagrange")); } @@ -301,7 +301,7 @@ TEST(StandardHonkComposer, VerificationKeyCreation) // committed to, we simply check that the verification key now contains the appropriate number of constraint and // permutation selector commitments. This method should work with any future arithemtization. EXPECT_EQ(verification_key->commitments.size(), - composer.circuit_constructor.selectors.size() + composer.program_width * 2 + 2); + composer.circuit_constructor.selectors.size() + composer.num_wires * 2 + 2); } /** @@ -316,7 +316,7 @@ TEST(StandardHonkComposer, SumcheckRelationCorrectness) { // Create a composer and a dummy circuit with a few gates StandardHonkComposer composer = StandardHonkComposer(); - static const size_t program_width = StandardHonkComposer::program_width; + static const size_t num_wires = StandardHonkComposer::num_wires; fr a = fr::one(); // Using the public variable to check that public_input_delta is computed and added to the relation correctly uint32_t a_idx = composer.add_public_variable(a); @@ -350,8 +350,8 @@ TEST(StandardHonkComposer, SumcheckRelationCorrectness) constexpr size_t num_polynomials = honk::StandardArithmetization::NUM_POLYNOMIALS; // Compute grand product polynomial - polynomial z_perm_poly = prover_library::compute_permutation_grand_product( - prover.key, prover.wire_polynomials, beta, gamma); + polynomial z_perm_poly = + prover_library::compute_permutation_grand_product(prover.key, prover.wire_polynomials, beta, gamma); // Create an array of spans to the underlying polynomials to more easily // get the transposition. diff --git a/cpp/src/barretenberg/honk/flavor/flavor.hpp b/cpp/src/barretenberg/honk/flavor/flavor.hpp index 1f004b548f..0d8903f945 100644 --- a/cpp/src/barretenberg/honk/flavor/flavor.hpp +++ b/cpp/src/barretenberg/honk/flavor/flavor.hpp @@ -2,6 +2,7 @@ #include #include #include "barretenberg/common/log.hpp" +#include "barretenberg/proof_system/arithmetization/arithmetization.hpp" #include "barretenberg/transcript/manifest.hpp" namespace honk { @@ -63,8 +64,9 @@ struct StandardArithmetization { namespace honk { struct StandardHonk { public: - using Arithmetization = honk::StandardArithmetization; - using MULTIVARIATE = Arithmetization::POLYNOMIAL; + // This whole file is broken; changes here are in anticipation of a follow-up rework of the flavor specificaiton. + using Arithmetization = arithmetization::Standard; + using MULTIVARIATE = honk::StandardArithmetization::POLYNOMIAL; // // TODO(Cody): Where to specify? is this polynomial manifest size? // static constexpr size_t STANDARD_HONK_MANIFEST_SIZE = 16; // TODO(Cody): Maybe relation should be supplied and this should be computed as is done in sumcheck? diff --git a/cpp/src/barretenberg/honk/proof_system/program_settings.hpp b/cpp/src/barretenberg/honk/proof_system/program_settings.hpp index 44083817fd..037d24362e 100644 --- a/cpp/src/barretenberg/honk/proof_system/program_settings.hpp +++ b/cpp/src/barretenberg/honk/proof_system/program_settings.hpp @@ -15,7 +15,7 @@ class standard_verifier_settings : public plonk::standard_settings { typedef transcript::StandardTranscript Transcript; static constexpr size_t num_challenge_bytes = 16; static constexpr transcript::HashType hash_type = transcript::HashType::PedersenBlake3s; - static constexpr size_t program_width = 3; + static constexpr size_t num_wires = honk::StandardHonk::Arithmetization::num_wires; static constexpr size_t num_polys = honk::StandardArithmetization::NUM_POLYNOMIALS; }; diff --git a/cpp/src/barretenberg/honk/proof_system/prover.cpp b/cpp/src/barretenberg/honk/proof_system/prover.cpp index 9194f054e3..e0c580099f 100644 --- a/cpp/src/barretenberg/honk/proof_system/prover.cpp +++ b/cpp/src/barretenberg/honk/proof_system/prover.cpp @@ -81,7 +81,7 @@ Prover::Prover(std::vector&& wire_polys, * */ template void Prover::compute_wire_commitments() { - for (size_t i = 0; i < settings::program_width; ++i) { + for (size_t i = 0; i < settings::Arithmetization::num_wires; ++i) { auto commitment = commitment_key->commit(wire_polynomials[i]); transcript.send_to_verifier("W_" + std::to_string(i + 1), commitment); diff --git a/cpp/src/barretenberg/honk/proof_system/verifier.cpp b/cpp/src/barretenberg/honk/proof_system/verifier.cpp index 8fe2587043..4eae6955d3 100644 --- a/cpp/src/barretenberg/honk/proof_system/verifier.cpp +++ b/cpp/src/barretenberg/honk/proof_system/verifier.cpp @@ -87,7 +87,7 @@ template bool Verifier::verify_pro const size_t NUM_UNSHIFTED = honk::StandardArithmetization::NUM_UNSHIFTED_POLYNOMIALS; const size_t NUM_PRECOMPUTED = honk::StandardArithmetization::NUM_PRECOMPUTED_POLYNOMIALS; - constexpr auto program_width = program_settings::program_width; + constexpr auto num_wires = program_settings::num_wires; transcript = VerifierTranscript{ proof.proof_data }; @@ -109,8 +109,8 @@ template bool Verifier::verify_pro } // Get commitments to the wires - std::array wire_commitments; - for (size_t i = 0; i < program_width; ++i) { + std::array wire_commitments; + for (size_t i = 0; i < num_wires; ++i) { wire_commitments[i] = transcript.template receive_from_prover("W_" + std::to_string(i + 1)); } @@ -169,11 +169,11 @@ template bool Verifier::verify_pro batched_commitment_unshifted += commitment * rhos[i]; } // add wire commitments - for (size_t i = 0; i < program_width; ++i) { + for (size_t i = 0; i < num_wires; ++i) { batched_commitment_unshifted += wire_commitments[i] * rhos[NUM_PRECOMPUTED + i]; } // add z_permutation commitment - batched_commitment_unshifted += z_permutation_commitment * rhos[NUM_PRECOMPUTED + program_width]; + batched_commitment_unshifted += z_permutation_commitment * rhos[NUM_PRECOMPUTED + num_wires]; // Construct batched commitment for to-be-shifted polynomials batched_commitment_to_be_shifted = z_permutation_commitment * rhos[NUM_UNSHIFTED]; diff --git a/cpp/src/barretenberg/plonk/composer/composer_base.hpp b/cpp/src/barretenberg/plonk/composer/composer_base.hpp index cbee5892e3..c781241322 100644 --- a/cpp/src/barretenberg/plonk/composer/composer_base.hpp +++ b/cpp/src/barretenberg/plonk/composer/composer_base.hpp @@ -1,6 +1,6 @@ #pragma once #include "barretenberg/ecc/curves/bn254/fr.hpp" -#include "barretenberg/proof_system/composer/composer_base.hpp" +#include "barretenberg/proof_system/arithmetization/gate_data.hpp" #include "barretenberg/plonk/proof_system/prover/prover.hpp" #include "barretenberg/plonk/proof_system/verifier/verifier.hpp" #include "barretenberg/plonk/proof_system/types/prover_settings.hpp" diff --git a/cpp/src/barretenberg/plonk/composer/splitting_tmp/standard_plonk_composer.hpp b/cpp/src/barretenberg/plonk/composer/splitting_tmp/standard_plonk_composer.hpp index 3379c7995c..083ac264dc 100644 --- a/cpp/src/barretenberg/plonk/composer/splitting_tmp/standard_plonk_composer.hpp +++ b/cpp/src/barretenberg/plonk/composer/splitting_tmp/standard_plonk_composer.hpp @@ -29,7 +29,7 @@ class StandardPlonkComposer { // Leaving it in for now just in case bool contains_recursive_proof = false; - static constexpr size_t program_width = STANDARD_WIDTH; + static constexpr size_t program_width = StandardCircuitConstructor::program_width; /**Standard methods*/ diff --git a/cpp/src/barretenberg/plonk/proof_system/types/prover_settings.hpp b/cpp/src/barretenberg/plonk/proof_system/types/prover_settings.hpp index b9bab846bb..0862073254 100644 --- a/cpp/src/barretenberg/plonk/proof_system/types/prover_settings.hpp +++ b/cpp/src/barretenberg/plonk/proof_system/types/prover_settings.hpp @@ -1,4 +1,5 @@ #pragma once +#include "barretenberg/proof_system/arithmetization/arithmetization.hpp" #include "barretenberg/transcript/transcript.hpp" namespace plonk { class settings_base { @@ -11,6 +12,7 @@ class settings_base { class standard_settings : public settings_base { public: + using Arithmetization = arithmetization::Standard; static constexpr size_t num_challenge_bytes = 16; static constexpr transcript::HashType hash_type = transcript::HashType::PedersenBlake3s; static constexpr size_t program_width = 3; diff --git a/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp b/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp new file mode 100644 index 0000000000..3aa2a13dba --- /dev/null +++ b/cpp/src/barretenberg/proof_system/arithmetization/arithmetization.hpp @@ -0,0 +1,40 @@ +#pragma once +#include + +namespace arithmetization { + +/** + * @brief Specify the structure of a CircuitConstructor + * + * @details This is typically passed as a template argument specifying the structure of a circuit constructor. It + * should only ever contain circuit constructor data--it should not contain data that is particular to any + * proving system. + * + * @remark It may make sense to say this is only partial arithmetization data, with the full data being + * contained in the circuit constructor. We could change the name of this class if it conflicts with common usage. + * + * @tparam _num_wires + * @tparam _num_selectors + */ +template struct Arithmetization { + static constexpr size_t num_wires = _num_wires; + static constexpr size_t num_selectors = _num_selectors; + // Note: For even greater modularity, in each instantiation we could specify a list of components here, where a + // component is a meaningful collection of functions for creating gates, as in: + // + // struct Component { + // using Arithmetic = component::Arithmetic3Wires; + // using RangeConstraints = component::Base4Accumulators or component::GenPerm or... + // using LooupTables = component::Plookup4Wire or component::CQ8Wire or... + // ... + // }; + // + // We should only do this if it becomes necessary or convenient. +}; + +// These are not magic numbers and they should not be written with global constants. These paraters are not accessible +// through clearly named static class members. +using Standard = Arithmetization; +using Turbo = Arithmetization; + +} // namespace arithmetization \ No newline at end of file diff --git a/cpp/src/barretenberg/proof_system/composer/composer_base.hpp b/cpp/src/barretenberg/proof_system/arithmetization/gate_data.hpp similarity index 100% rename from cpp/src/barretenberg/proof_system/composer/composer_base.hpp rename to cpp/src/barretenberg/proof_system/arithmetization/gate_data.hpp diff --git a/cpp/src/barretenberg/proof_system/circuit_constructors/circuit_constructor_base.cpp b/cpp/src/barretenberg/proof_system/circuit_constructors/circuit_constructor_base.cpp index e98c920cc9..ee2cbb9fff 100644 --- a/cpp/src/barretenberg/proof_system/circuit_constructors/circuit_constructor_base.cpp +++ b/cpp/src/barretenberg/proof_system/circuit_constructors/circuit_constructor_base.cpp @@ -9,10 +9,10 @@ namespace bonk { * @param b_variable_idx Index of a variable in class b. * @param msg Class tag. * */ -template -void CircuitConstructorBase::assert_equal(const uint32_t a_variable_idx, - const uint32_t b_variable_idx, - std::string const& msg) +template +void CircuitConstructorBase::assert_equal(const uint32_t a_variable_idx, + const uint32_t b_variable_idx, + std::string const& msg) { assert_valid_variables({ a_variable_idx, b_variable_idx }); bool values_equal = (get_variable(a_variable_idx) == get_variable(b_variable_idx)); @@ -41,6 +41,6 @@ void CircuitConstructorBase::assert_equal(const uint32_t a_varia real_variable_tags[a_real_idx] = real_variable_tags[b_real_idx]; } // Standard honk/ plonk instantiation -template class CircuitConstructorBase<3>; -template class CircuitConstructorBase<4>; +template class CircuitConstructorBase; +template class CircuitConstructorBase; } // namespace bonk diff --git a/cpp/src/barretenberg/proof_system/circuit_constructors/circuit_constructor_base.hpp b/cpp/src/barretenberg/proof_system/circuit_constructors/circuit_constructor_base.hpp index 2d86bda143..619d8fbffd 100644 --- a/cpp/src/barretenberg/proof_system/circuit_constructors/circuit_constructor_base.hpp +++ b/cpp/src/barretenberg/proof_system/circuit_constructors/circuit_constructor_base.hpp @@ -1,23 +1,27 @@ #pragma once -#include "barretenberg/proof_system/composer/composer_base.hpp" +#include "barretenberg/proof_system/arithmetization/arithmetization.hpp" +#include "barretenberg/proof_system/arithmetization/gate_data.hpp" #include "barretenberg/ecc/curves/bn254/fr.hpp" #include -using namespace bonk; namespace bonk { static constexpr uint32_t DUMMY_TAG = 0; -template class CircuitConstructorBase { +template class CircuitConstructorBase { public: - static constexpr size_t program_width = program_width_; + static constexpr size_t num_wires = Arithmetization::num_wires; + // Keeping num_wires, at least temporarily, for backward compatibility + static constexpr size_t program_width = Arithmetization::num_wires; + static constexpr size_t num_selectors = Arithmetization::num_selectors; + // TODO(Cody): selector names are used by composer helper. They can therefore be specified through the proving + // system flavor. Getting rid of this also lets us get rid of the weird constructor that's uses the selector names + // functions std::vector selector_names_; size_t num_gates = 0; - // TODO(#216)(Adrian): It would be better to store an array of size program_width_ - // to make the composer agnostic of the wire name. - std::vector w_l; - std::vector w_r; - std::vector w_o; - std::vector w_4; + + std::array, num_wires> wires; + std::array, num_selectors> selectors; + std::vector public_inputs; std::vector variables; // index of next variable in equivalence class (=REAL_VARIABLE if you're last) @@ -33,8 +37,6 @@ template class CircuitConstructorBase { // DOCTODO(#231): replace with the relevant wiki link. std::map tau; - size_t num_selectors; - std::vector> selectors; numeric::random::Engine* rand_engine = nullptr; bool _failed = false; std::string _err; @@ -46,10 +48,8 @@ template class CircuitConstructorBase { // Cody: This is used by compute_wire_copy_cycles in Plonk. // enum WireType { LEFT = 0U, RIGHT = (1U << 30U), OUTPUT = (1U << 31U), FOURTH = 0xc0000000 }; - CircuitConstructorBase(std::vector selector_names, size_t num_selectors = 0, size_t size_hint = 0) + CircuitConstructorBase(std::vector selector_names, size_t size_hint = 0) : selector_names_(std::move(selector_names)) - , num_selectors(num_selectors) - , selectors(num_selectors) { for (auto& p : selectors) { p.reserve(size_hint); diff --git a/cpp/src/barretenberg/proof_system/circuit_constructors/standard_circuit_constructor.cpp b/cpp/src/barretenberg/proof_system/circuit_constructors/standard_circuit_constructor.cpp index 08d8af9885..7960064700 100644 --- a/cpp/src/barretenberg/proof_system/circuit_constructors/standard_circuit_constructor.cpp +++ b/cpp/src/barretenberg/proof_system/circuit_constructors/standard_circuit_constructor.cpp @@ -5,12 +5,6 @@ using namespace barretenberg; namespace bonk { -#define STANDARD_SELECTOR_REFS \ - auto& q_m = selectors[StandardSelectors::QM]; \ - auto& q_c = selectors[StandardSelectors::QC]; \ - auto& q_1 = selectors[StandardSelectors::Q1]; \ - auto& q_2 = selectors[StandardSelectors::Q2]; \ - auto& q_3 = selectors[StandardSelectors::Q3]; /** * Create an addition gate. @@ -20,7 +14,6 @@ namespace bonk { */ void StandardCircuitConstructor::create_add_gate(const add_triple& in) { - STANDARD_SELECTOR_REFS assert_valid_variables({ in.a, in.b, in.c }); w_l.emplace_back(in.a); @@ -66,7 +59,6 @@ void StandardCircuitConstructor::create_big_add_gate(const add_quad& in) void StandardCircuitConstructor::create_balanced_add_gate(const add_quad& in) { - STANDARD_SELECTOR_REFS assert_valid_variables({ in.a, in.b, in.c, in.d }); // (a terms + b terms = temp) @@ -189,7 +181,6 @@ void StandardCircuitConstructor::create_big_mul_gate(const mul_quad& in) */ void StandardCircuitConstructor::create_mul_gate(const mul_triple& in) { - STANDARD_SELECTOR_REFS assert_valid_variables({ in.a, in.b, in.c }); w_l.emplace_back(in.a); @@ -212,7 +203,6 @@ void StandardCircuitConstructor::create_mul_gate(const mul_triple& in) */ void StandardCircuitConstructor::create_bool_gate(const uint32_t variable_index) { - STANDARD_SELECTOR_REFS assert_valid_variables({ variable_index }); w_l.emplace_back(variable_index); @@ -235,7 +225,6 @@ void StandardCircuitConstructor::create_bool_gate(const uint32_t variable_index) */ void StandardCircuitConstructor::create_poly_gate(const poly_triple& in) { - STANDARD_SELECTOR_REFS assert_valid_variables({ in.a, in.b, in.c }); w_l.emplace_back(in.a); @@ -436,7 +425,6 @@ accumulator_triple StandardCircuitConstructor::create_logic_constraint(const uin void StandardCircuitConstructor::fix_witness(const uint32_t witness_index, const barretenberg::fr& witness_value) { - STANDARD_SELECTOR_REFS assert_valid_variables({ witness_index }); w_l.emplace_back(witness_index); @@ -494,7 +482,6 @@ void StandardCircuitConstructor::assert_equal_constant(uint32_t const a_idx, fr * */ bool StandardCircuitConstructor::check_circuit() { - STANDARD_SELECTOR_REFS fr gate_sum; fr left, right, output; diff --git a/cpp/src/barretenberg/proof_system/circuit_constructors/standard_circuit_constructor.hpp b/cpp/src/barretenberg/proof_system/circuit_constructors/standard_circuit_constructor.hpp index 66d8389013..b1e03f89b3 100644 --- a/cpp/src/barretenberg/proof_system/circuit_constructors/standard_circuit_constructor.hpp +++ b/cpp/src/barretenberg/proof_system/circuit_constructors/standard_circuit_constructor.hpp @@ -1,21 +1,29 @@ #pragma once +#include #include "circuit_constructor_base.hpp" #include "barretenberg/plonk/proof_system/constants.hpp" #include "barretenberg/proof_system/flavor/flavor.hpp" namespace bonk { -enum StandardSelectors { QM, Q1, Q2, Q3, QC, NUM }; inline std::vector standard_selector_names() { std::vector result{ "q_m", "q_1", "q_2", "q_3", "q_c" }; return result; } -class StandardCircuitConstructor : public CircuitConstructorBase { +class StandardCircuitConstructor : public CircuitConstructorBase { public: - // TODO(#216)(Kesha): replace this with Honk enums after we have a verifier and no longer depend on plonk - // prover/verifier - static constexpr plonk::ComposerType type = plonk::ComposerType::STANDARD_HONK; + std::vector& w_l = std::get<0>(wires); + std::vector& w_r = std::get<1>(wires); + std::vector& w_o = std::get<2>(wires); + + std::vector& q_m = std::get<0>(selectors); + std::vector& q_1 = std::get<1>(selectors); + std::vector& q_2 = std::get<2>(selectors); + std::vector& q_3 = std::get<3>(selectors); + std::vector& q_c = std::get<4>(selectors); + + static constexpr plonk::ComposerType type = plonk::ComposerType::STANDARD_HONK; // TODO(Cody): Get rid of this. static constexpr size_t UINT_LOG2_BASE = 2; // These are variables that we have used a gate on, to enforce that they are @@ -24,7 +32,7 @@ class StandardCircuitConstructor : public CircuitConstructorBase std::map constant_variable_indices; StandardCircuitConstructor(const size_t size_hint = 0) - : CircuitConstructorBase(standard_selector_names(), StandardSelectors::NUM, size_hint) + : CircuitConstructorBase(standard_selector_names(), size_hint) { w_l.reserve(size_hint); w_r.reserve(size_hint); @@ -44,7 +52,7 @@ class StandardCircuitConstructor : public CircuitConstructorBase StandardCircuitConstructor(const StandardCircuitConstructor& other) = delete; StandardCircuitConstructor(StandardCircuitConstructor&& other) = default; StandardCircuitConstructor& operator=(const StandardCircuitConstructor& other) = delete; - StandardCircuitConstructor& operator=(StandardCircuitConstructor&& other) = default; + StandardCircuitConstructor& operator=(StandardCircuitConstructor&& other) = delete; ~StandardCircuitConstructor() override = default; void assert_equal_constant(uint32_t const a_idx, diff --git a/cpp/src/barretenberg/proof_system/circuit_constructors/turbo_circuit_constructor.cpp b/cpp/src/barretenberg/proof_system/circuit_constructors/turbo_circuit_constructor.cpp index 4296b2064c..6a4042b07b 100644 --- a/cpp/src/barretenberg/proof_system/circuit_constructors/turbo_circuit_constructor.cpp +++ b/cpp/src/barretenberg/proof_system/circuit_constructors/turbo_circuit_constructor.cpp @@ -6,19 +6,6 @@ using namespace barretenberg; namespace bonk { -#define TURBO_SELECTOR_REFS \ - auto& q_m = selectors[TurboSelectors::QM]; \ - auto& q_c = selectors[TurboSelectors::QC]; \ - auto& q_1 = selectors[TurboSelectors::Q1]; \ - auto& q_2 = selectors[TurboSelectors::Q2]; \ - auto& q_3 = selectors[TurboSelectors::Q3]; \ - auto& q_4 = selectors[TurboSelectors::Q4]; \ - auto& q_5 = selectors[TurboSelectors::Q5]; \ - auto& q_arith = selectors[TurboSelectors::QARITH]; \ - auto& q_fixed_base = selectors[TurboSelectors::QFIXED]; \ - auto& q_range = selectors[TurboSelectors::QRANGE]; \ - auto& q_logic = selectors[TurboSelectors::QLOGIC]; - /** * Turbo circuit initialization, where you can specify the probable number of gates in your circuit. * @@ -26,7 +13,7 @@ namespace bonk { * vectors during initialization. * */ TurboCircuitConstructor::TurboCircuitConstructor(const size_t size_hint) - : CircuitConstructorBase(turbo_selector_names(), TurboSelectors::NUM, size_hint) + : CircuitConstructorBase(turbo_selector_names(), size_hint) { w_l.reserve(size_hint); w_r.reserve(size_hint); @@ -47,7 +34,6 @@ TurboCircuitConstructor::TurboCircuitConstructor(const size_t size_hint) * */ void TurboCircuitConstructor::create_add_gate(const add_triple& in) { - TURBO_SELECTOR_REFS assert_valid_variables({ in.a, in.b, in.c }); w_l.emplace_back(in.a); @@ -79,7 +65,6 @@ void TurboCircuitConstructor::create_add_gate(const add_triple& in) * */ void TurboCircuitConstructor::create_big_add_gate(const add_quad& in) { - TURBO_SELECTOR_REFS assert_valid_variables({ in.a, in.b, in.c, in.d }); w_l.emplace_back(in.a); @@ -118,7 +103,6 @@ void TurboCircuitConstructor::create_big_add_gate(const add_quad& in) * */ void TurboCircuitConstructor::create_big_add_gate_with_bit_extraction(const add_quad& in) { - TURBO_SELECTOR_REFS assert_valid_variables({ in.a, in.b, in.c, in.d }); w_l.emplace_back(in.a); @@ -141,7 +125,6 @@ void TurboCircuitConstructor::create_big_add_gate_with_bit_extraction(const add_ void TurboCircuitConstructor::create_big_mul_gate(const mul_quad& in) { - TURBO_SELECTOR_REFS assert_valid_variables({ in.a, in.b, in.c, in.d }); w_l.emplace_back(in.a); @@ -181,7 +164,6 @@ void TurboCircuitConstructor::create_big_mul_gate(const mul_quad& in) */ void TurboCircuitConstructor::create_balanced_add_gate(const add_quad& in) { - TURBO_SELECTOR_REFS assert_valid_variables({ in.a, in.b, in.c, in.d }); w_l.emplace_back(in.a); @@ -213,7 +195,6 @@ void TurboCircuitConstructor::create_balanced_add_gate(const add_quad& in) * */ void TurboCircuitConstructor::create_mul_gate(const mul_triple& in) { - TURBO_SELECTOR_REFS assert_valid_variables({ in.a, in.b, in.c }); w_l.emplace_back(in.a); @@ -243,7 +224,6 @@ void TurboCircuitConstructor::create_mul_gate(const mul_triple& in) * */ void TurboCircuitConstructor::create_bool_gate(const uint32_t variable_index) { - TURBO_SELECTOR_REFS assert_valid_variables({ variable_index }); w_l.emplace_back(variable_index); @@ -276,7 +256,6 @@ void TurboCircuitConstructor::create_bool_gate(const uint32_t variable_index) * */ void TurboCircuitConstructor::create_poly_gate(const poly_triple& in) { - TURBO_SELECTOR_REFS assert_valid_variables({ in.a, in.b, in.c }); w_l.emplace_back(in.a); @@ -305,7 +284,6 @@ void TurboCircuitConstructor::create_poly_gate(const poly_triple& in) * */ void TurboCircuitConstructor::create_fixed_group_add_gate(const fixed_group_add_quad& in) { - TURBO_SELECTOR_REFS assert_valid_variables({ in.a, in.b, in.c, in.d }); w_l.emplace_back(in.a); @@ -337,7 +315,6 @@ void TurboCircuitConstructor::create_fixed_group_add_gate(const fixed_group_add_ void TurboCircuitConstructor::create_fixed_group_add_gate_with_init(const fixed_group_add_quad& in, const fixed_group_init_quad& init) { - TURBO_SELECTOR_REFS assert_valid_variables({ in.a, in.b, in.c, in.d }); w_l.emplace_back(in.a); @@ -373,7 +350,6 @@ void TurboCircuitConstructor::create_fixed_group_add_gate_final(const add_quad& * */ void TurboCircuitConstructor::fix_witness(const uint32_t witness_index, const barretenberg::fr& witness_value) { - TURBO_SELECTOR_REFS assert_valid_variables({ witness_index }); w_l.emplace_back(witness_index); @@ -407,7 +383,6 @@ std::vector TurboCircuitConstructor::decompose_into_base4_accumulators const size_t num_bits, std::string const& msg) { - TURBO_SELECTOR_REFS assert_valid_variables({ witness_index }); ASSERT(num_bits > 0); @@ -589,7 +564,6 @@ accumulator_triple TurboCircuitConstructor::create_logic_constraint(const uint32 const size_t num_bits, const bool is_xor_gate) { - TURBO_SELECTOR_REFS assert_valid_variables({ a, b }); ASSERT(((num_bits >> 1U) << 1U) == num_bits); // Do not allow constraint for an odd number of bits. @@ -820,14 +794,6 @@ inline bool TurboCircuitConstructor::lazy_fixed_base_gate_check(const size_t gat constexpr barretenberg::fr grumpkin_curve_b(-17); constexpr barretenberg::fr nine(9); - auto& q_m = selectors[TurboSelectors::QM]; - auto& q_c = selectors[TurboSelectors::QC]; - auto& q_1 = selectors[TurboSelectors::Q1]; - auto& q_2 = selectors[TurboSelectors::Q2]; - auto& q_3 = selectors[TurboSelectors::Q3]; - auto& q_4 = selectors[TurboSelectors::Q4]; - auto& q_5 = selectors[TurboSelectors::Q5]; - auto& q_fixed_base = selectors[TurboSelectors::QFIXED]; // Get witness values fr wire_1_shifted; @@ -940,9 +906,6 @@ inline bool TurboCircuitConstructor::lazy_logic_gate_check(const size_t gate_ind ASSERT(gate_index < num_gates); - auto& q_c = selectors[TurboSelectors::QC]; - auto& q_logic = selectors[TurboSelectors::QLOGIC]; - fr wire_1_shifted; fr wire_2_shifted; fr wire_4_shifted; @@ -1079,15 +1042,6 @@ inline fr TurboCircuitConstructor::arithmetic_gate_evaluation(const size_t gate_ { ASSERT(gate_index < num_gates); - auto& q_m = selectors[TurboSelectors::QM]; - auto& q_c = selectors[TurboSelectors::QC]; - auto& q_1 = selectors[TurboSelectors::Q1]; - auto& q_2 = selectors[TurboSelectors::Q2]; - auto& q_3 = selectors[TurboSelectors::Q3]; - auto& q_4 = selectors[TurboSelectors::Q4]; - auto& q_5 = selectors[TurboSelectors::Q5]; - auto& q_arith = selectors[TurboSelectors::QARITH]; - constexpr barretenberg::fr minus_seven(-7); constexpr fr two = fr::one() + fr::one(); @@ -1138,8 +1092,6 @@ inline fr TurboCircuitConstructor::range_gate_evaluation(const size_t gate_index ASSERT(gate_index < num_gates); - auto& q_range = selectors[TurboSelectors::QRANGE]; - fr wire_4_shifted; const fr wire_1_value = get_variable(w_l[gate_index]); const fr wire_2_value = get_variable(w_r[gate_index]); @@ -1224,9 +1176,6 @@ inline fr TurboCircuitConstructor::logic_gate_evaluation(const size_t gate_index ASSERT(gate_index < num_gates); - auto& q_c = selectors[TurboSelectors::QC]; - auto& q_logic = selectors[TurboSelectors::QLOGIC]; - fr wire_1_shifted; fr wire_2_shifted; fr wire_4_shifted; @@ -1397,14 +1346,6 @@ inline fr TurboCircuitConstructor::fixed_base_gate_evaluation(const size_t gate_ constexpr barretenberg::fr grumpkin_curve_b(-17); constexpr barretenberg::fr three(3); - auto& q_m = selectors[TurboSelectors::QM]; - auto& q_c = selectors[TurboSelectors::QC]; - auto& q_1 = selectors[TurboSelectors::Q1]; - auto& q_2 = selectors[TurboSelectors::Q2]; - auto& q_3 = selectors[TurboSelectors::Q3]; - auto& q_4 = selectors[TurboSelectors::Q4]; - auto& q_5 = selectors[TurboSelectors::Q5]; - auto& q_fixed_base = selectors[TurboSelectors::QFIXED]; // Get witness values fr wire_1_shifted; diff --git a/cpp/src/barretenberg/proof_system/circuit_constructors/turbo_circuit_constructor.hpp b/cpp/src/barretenberg/proof_system/circuit_constructors/turbo_circuit_constructor.hpp index 18c5243a97..1a982d86ce 100644 --- a/cpp/src/barretenberg/proof_system/circuit_constructors/turbo_circuit_constructor.hpp +++ b/cpp/src/barretenberg/proof_system/circuit_constructors/turbo_circuit_constructor.hpp @@ -1,4 +1,5 @@ #pragma once +#include #include "circuit_constructor_base.hpp" #include "barretenberg/plonk/proof_system/constants.hpp" #include "barretenberg/proof_system/flavor/flavor.hpp" @@ -11,17 +12,32 @@ inline std::vector turbo_selector_names() "q_5", "q_arith", "q_fixed_base", "q_range", "q_logic" }; return result; } -class TurboCircuitConstructor : public CircuitConstructorBase { - - enum TurboSelectors { QM, QC, Q1, Q2, Q3, Q4, Q5, QARITH, QFIXED, QRANGE, QLOGIC, NUM }; +class TurboCircuitConstructor : public CircuitConstructorBase { public: + std::vector& w_l = std::get<0>(wires); + std::vector& w_r = std::get<1>(wires); + std::vector& w_o = std::get<2>(wires); + std::vector& w_4 = std::get<3>(wires); + + std::vector& q_m = std::get<0>(selectors); + std::vector& q_c = std::get<1>(selectors); + std::vector& q_1 = std::get<2>(selectors); + std::vector& q_2 = std::get<3>(selectors); + std::vector& q_3 = std::get<4>(selectors); + std::vector& q_4 = std::get<5>(selectors); + std::vector& q_5 = std::get<6>(selectors); + std::vector& q_arith = std::get<7>(selectors); + std::vector& q_fixed_base = std::get<8>(selectors); + std::vector& q_range = std::get<9>(selectors); + std::vector& q_logic = std::get<10>(selectors); + static constexpr plonk::ComposerType type = plonk::ComposerType::TURBO; static constexpr size_t UINT_LOG2_BASE = 2; TurboCircuitConstructor(const size_t size_hint = 0); TurboCircuitConstructor(TurboCircuitConstructor&& other) = default; - TurboCircuitConstructor& operator=(TurboCircuitConstructor&& other) = default; + TurboCircuitConstructor& operator=(TurboCircuitConstructor&& other) = delete; ~TurboCircuitConstructor() {} void create_add_gate(const add_triple& in); diff --git a/cpp/src/barretenberg/proof_system/flavor/flavor.hpp b/cpp/src/barretenberg/proof_system/flavor/flavor.hpp index c9e8bb6aff..e69de29bb2 100644 --- a/cpp/src/barretenberg/proof_system/flavor/flavor.hpp +++ b/cpp/src/barretenberg/proof_system/flavor/flavor.hpp @@ -1,8 +0,0 @@ -#pragma once -#include -#include -#include "barretenberg/common/log.hpp" -#include "barretenberg/transcript/manifest.hpp" - -#define STANDARD_WIDTH 3 -#define TURBO_WIDTH 4 \ No newline at end of file diff --git a/cpp/src/barretenberg/proof_system/types/polynomial_manifest.hpp b/cpp/src/barretenberg/proof_system/types/polynomial_manifest.hpp index 3429041e6b..4052d4ebff 100644 --- a/cpp/src/barretenberg/proof_system/types/polynomial_manifest.hpp +++ b/cpp/src/barretenberg/proof_system/types/polynomial_manifest.hpp @@ -5,6 +5,7 @@ #include #include "barretenberg/plonk/proof_system/constants.hpp" // ToDo(Arijit): The below namespace should be plonk once all the honk related stuffs are moved out +// ToDo(Cody): This is now plonk-specific. namespace bonk { enum PolynomialSource { WITNESS, SELECTOR, PERMUTATION, OTHER }; diff --git a/cpp/src/barretenberg/stdlib/hash/pedersen/pedersen_gates.hpp b/cpp/src/barretenberg/stdlib/hash/pedersen/pedersen_gates.hpp index 637f206d03..6d708abee1 100644 --- a/cpp/src/barretenberg/stdlib/hash/pedersen/pedersen_gates.hpp +++ b/cpp/src/barretenberg/stdlib/hash/pedersen/pedersen_gates.hpp @@ -1,5 +1,5 @@ #pragma once -#include "barretenberg/proof_system/composer/composer_base.hpp" +#include "barretenberg/proof_system/arithmetization/gate_data.hpp" #include "../../primitives/composers/composers_fwd.hpp" #include "../../primitives/field/field.hpp" #include "../../primitives/point/point.hpp"