diff --git a/barretenberg/cpp/src/barretenberg/circuit_checker/mega_circuit_builder.test.cpp b/barretenberg/cpp/src/barretenberg/circuit_checker/mega_circuit_builder.test.cpp index ef237747ee0..03e4d731d72 100644 --- a/barretenberg/cpp/src/barretenberg/circuit_checker/mega_circuit_builder.test.cpp +++ b/barretenberg/cpp/src/barretenberg/circuit_checker/mega_circuit_builder.test.cpp @@ -1,5 +1,6 @@ #include "barretenberg/stdlib_circuit_builders/mega_circuit_builder.hpp" #include "barretenberg/circuit_checker/circuit_checker.hpp" +#include "barretenberg/goblin/mock_circuits.hpp" #include "barretenberg/stdlib/primitives/bigfield/constants.hpp" #include @@ -158,4 +159,48 @@ TEST(MegaCircuitBuilder, GoblinEccOpQueueUltraOps) } } +/** + * @brief Check that the selector partitioning is correct for the mega circuit builder + * @details We check that for the arithmetic, delta_range, elliptic, aux, lookup, busread, poseidon2_external, + * poseidon2_internal blocks, and the other selectors are zero on that block. + */ +TEST(MegaCircuitBuilder, CompleteSelectorPartitioningCheck) +{ + auto builder = MegaCircuitBuilder(); + GoblinMockCircuits::construct_simple_circuit(builder); + bool result = CircuitChecker::check(builder); + EXPECT_EQ(result, true); + + // For each block, we want to check that all of the other selectors are zero on that block besides the one + // corresponding to the current block + for (auto& block : builder.blocks.get()) { + for (size_t i = 0; i < block.size(); ++i) { + if (&block != &builder.blocks.arithmetic) { + EXPECT_EQ(block.q_arith()[i], 0); + } + if (&block != &builder.blocks.delta_range) { + EXPECT_EQ(block.q_delta_range()[i], 0); + } + if (&block != &builder.blocks.elliptic) { + EXPECT_EQ(block.q_elliptic()[i], 0); + } + if (&block != &builder.blocks.aux) { + EXPECT_EQ(block.q_aux()[i], 0); + } + if (&block != &builder.blocks.lookup) { + EXPECT_EQ(block.q_lookup_type()[i], 0); + } + if (&block != &builder.blocks.busread) { + EXPECT_EQ(block.q_busread()[i], 0); + } + if (&block != &builder.blocks.poseidon2_external) { + EXPECT_EQ(block.q_poseidon2_external()[i], 0); + } + if (&block != &builder.blocks.poseidon2_internal) { + EXPECT_EQ(block.q_poseidon2_internal()[i], 0); + } + } + } +} + } // namespace bb \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/circuit_checker/ultra_circuit_builder.test.cpp b/barretenberg/cpp/src/barretenberg/circuit_checker/ultra_circuit_builder.test.cpp index 5d1eec57741..4d1e0da2b37 100644 --- a/barretenberg/cpp/src/barretenberg/circuit_checker/ultra_circuit_builder.test.cpp +++ b/barretenberg/cpp/src/barretenberg/circuit_checker/ultra_circuit_builder.test.cpp @@ -15,7 +15,7 @@ namespace bb { using plookup::ColumnIdx; using plookup::MultiTableId; -TEST(ultra_circuit_constructor, copy_constructor) +TEST(UltraCircuitConstructor, CopyConstructor) { UltraCircuitBuilder circuit_constructor = UltraCircuitBuilder(); @@ -43,7 +43,7 @@ TEST(ultra_circuit_constructor, copy_constructor) EXPECT_TRUE(CircuitChecker::check(duplicate_circuit_constructor)); } -TEST(ultra_circuit_constructor, create_gates_from_plookup_accumulators) +TEST(UltraCircuitConstructor, CreateGatesFromPlookupAccumulators) { UltraCircuitBuilder circuit_builder = UltraCircuitBuilder(); @@ -105,7 +105,7 @@ TEST(ultra_circuit_constructor, create_gates_from_plookup_accumulators) EXPECT_EQ(result, true); } -TEST(ultra_circuit_constructor, bad_lookup_failure) +TEST(UltraCircuitConstructor, BadLookupFailure) { UltraCircuitBuilder builder; MockCircuits::add_lookup_gates(builder); @@ -121,7 +121,7 @@ TEST(ultra_circuit_constructor, bad_lookup_failure) EXPECT_FALSE(CircuitChecker::check(builder)); } -TEST(ultra_circuit_constructor, base_case) +TEST(UltraCircuitConstructor, BaseCase) { UltraCircuitBuilder circuit_constructor = UltraCircuitBuilder(); fr a = fr::one(); @@ -129,7 +129,7 @@ TEST(ultra_circuit_constructor, base_case) bool result = CircuitChecker::check(circuit_constructor); EXPECT_EQ(result, true); } -TEST(ultra_circuit_constructor, test_no_lookup_proof) +TEST(UltraCircuitConstructor, TestNoLookupProof) { UltraCircuitBuilder circuit_constructor = UltraCircuitBuilder(); @@ -152,7 +152,7 @@ TEST(ultra_circuit_constructor, test_no_lookup_proof) EXPECT_EQ(result, true); } -TEST(ultra_circuit_constructor, test_elliptic_gate) +TEST(UltraCircuitConstructor, TestEllipticGate) { typedef grumpkin::g1::affine_element affine_element; typedef grumpkin::g1::element element; @@ -180,7 +180,7 @@ TEST(ultra_circuit_constructor, test_elliptic_gate) EXPECT_EQ(CircuitChecker::check(circuit_constructor), false); } -TEST(ultra_circuit_constructor, test_elliptic_double_gate) +TEST(UltraCircuitConstructor, TestEllipticDoubleGate) { typedef grumpkin::g1::affine_element affine_element; typedef grumpkin::g1::element element; @@ -200,7 +200,7 @@ TEST(ultra_circuit_constructor, test_elliptic_double_gate) EXPECT_EQ(result, true); } -TEST(ultra_circuit_constructor, non_trivial_tag_permutation) +TEST(UltraCircuitConstructor, NonTrivialTagPermutation) { UltraCircuitBuilder circuit_constructor = UltraCircuitBuilder(); fr a = fr::random_element(); @@ -232,7 +232,7 @@ TEST(ultra_circuit_constructor, non_trivial_tag_permutation) EXPECT_EQ(CircuitChecker::check(circuit_constructor), false); } -TEST(ultra_circuit_constructor, non_trivial_tag_permutation_and_cycles) +TEST(UltraCircuitConstructor, NonTrivialTagPermutationAndCycles) { UltraCircuitBuilder circuit_constructor = UltraCircuitBuilder(); fr a = fr::random_element(); @@ -273,7 +273,7 @@ TEST(ultra_circuit_constructor, non_trivial_tag_permutation_and_cycles) circuit_constructor.real_variable_tags[circuit_constructor.real_variable_index[a_idx]] = 2; EXPECT_EQ(CircuitChecker::check(circuit_constructor), false); } -TEST(ultra_circuit_constructor, bad_tag_permutation) +TEST(UltraCircuitConstructor, BadTagPermutation) { UltraCircuitBuilder circuit_constructor = UltraCircuitBuilder(); fr a = fr::random_element(); @@ -302,7 +302,7 @@ TEST(ultra_circuit_constructor, bad_tag_permutation) EXPECT_EQ(result, false); } -TEST(ultra_circuit_constructor, sort_widget) +TEST(UltraCircuitConstructor, SortWidget) { UltraCircuitBuilder circuit_constructor = UltraCircuitBuilder(); fr a = fr::one(); @@ -328,7 +328,7 @@ std::vector add_variables(UltraCircuitBuilder& circuit_constructor, st } return res; } -TEST(ultra_circuit_constructor, sort_with_edges_gate) +TEST(UltraCircuitConstructor, SortWithEdgesGate) { fr a = fr::one(); fr b = fr(2); @@ -421,7 +421,7 @@ TEST(ultra_circuit_constructor, sort_with_edges_gate) } } -TEST(ultra_circuit_constructor, range_constraint) +TEST(UltraCircuitConstructor, RangeConstraint) { { UltraCircuitBuilder circuit_constructor = UltraCircuitBuilder(); @@ -490,7 +490,7 @@ TEST(ultra_circuit_constructor, range_constraint) } } -TEST(ultra_circuit_constructor, range_with_gates) +TEST(UltraCircuitConstructor, RangeWithGates) { UltraCircuitBuilder circuit_constructor = UltraCircuitBuilder(); auto idx = add_variables(circuit_constructor, { 1, 2, 3, 4, 5, 6, 7, 8 }); @@ -510,7 +510,7 @@ TEST(ultra_circuit_constructor, range_with_gates) EXPECT_EQ(result, true); } -TEST(ultra_circuit_constructor, range_with_gates_where_range_is_not_a_power_of_two) +TEST(UltraCircuitConstructor, RangeWithGatesWhereRangeIsNotAPowerOfTwo) { UltraCircuitBuilder circuit_constructor = UltraCircuitBuilder(); auto idx = add_variables(circuit_constructor, { 1, 2, 3, 4, 5, 6, 7, 8 }); @@ -530,7 +530,7 @@ TEST(ultra_circuit_constructor, range_with_gates_where_range_is_not_a_power_of_t EXPECT_EQ(result, true); } -TEST(ultra_circuit_constructor, sort_widget_complex) +TEST(UltraCircuitConstructor, SortWidgetComplex) { { @@ -557,7 +557,7 @@ TEST(ultra_circuit_constructor, sort_widget_complex) EXPECT_EQ(result, false); } } -TEST(ultra_circuit_constructor, sort_widget_neg) +TEST(UltraCircuitConstructor, SortWidgetNeg) { UltraCircuitBuilder circuit_constructor = UltraCircuitBuilder(); fr a = fr::one(); @@ -575,7 +575,7 @@ TEST(ultra_circuit_constructor, sort_widget_neg) EXPECT_EQ(result, false); } -TEST(ultra_circuit_constructor, composed_range_constraint) +TEST(UltraCircuitConstructor, ComposedRangeConstraint) { UltraCircuitBuilder circuit_constructor = UltraCircuitBuilder(); auto c = fr::random_element(); @@ -590,7 +590,7 @@ TEST(ultra_circuit_constructor, composed_range_constraint) EXPECT_EQ(result, true); } -TEST(ultra_circuit_constructor, non_native_field_multiplication) +TEST(UltraCircuitConstructor, NonNativeFieldMultiplication) { UltraCircuitBuilder circuit_constructor = UltraCircuitBuilder(); @@ -646,7 +646,78 @@ TEST(ultra_circuit_constructor, non_native_field_multiplication) EXPECT_EQ(result, true); } -TEST(ultra_circuit_constructor, rom) +/** + * @brief Test that the aux block only contains aux gates. + * + */ +TEST(UltraCircuitConstructor, NonNativeFieldMultiplicationSortCheck) +{ + UltraCircuitBuilder circuit_constructor = UltraCircuitBuilder(); + + fq a = fq::random_element(); + fq b = fq::random_element(); + uint256_t modulus = fq::modulus; + + uint1024_t a_big = uint512_t(uint256_t(a)); + uint1024_t b_big = uint512_t(uint256_t(b)); + uint1024_t p_big = uint512_t(uint256_t(modulus)); + + uint1024_t q_big = (a_big * b_big) / p_big; + uint1024_t r_big = (a_big * b_big) % p_big; + + uint256_t q(q_big.lo.lo); + uint256_t r(r_big.lo.lo); + + const auto split_into_limbs = [&](const uint512_t& input) { + constexpr size_t NUM_BITS = 68; + std::array limbs; + limbs[0] = input.slice(0, NUM_BITS).lo; + limbs[1] = input.slice(NUM_BITS * 1, NUM_BITS * 2).lo; + limbs[2] = input.slice(NUM_BITS * 2, NUM_BITS * 3).lo; + limbs[3] = input.slice(NUM_BITS * 3, NUM_BITS * 4).lo; + limbs[4] = fr(input.lo); + return limbs; + }; + + const auto get_limb_witness_indices = [&](const std::array& limbs) { + std::array limb_indices; + limb_indices[0] = circuit_constructor.add_variable(limbs[0]); + limb_indices[1] = circuit_constructor.add_variable(limbs[1]); + limb_indices[2] = circuit_constructor.add_variable(limbs[2]); + limb_indices[3] = circuit_constructor.add_variable(limbs[3]); + limb_indices[4] = circuit_constructor.add_variable(limbs[4]); + return limb_indices; + }; + const uint512_t BINARY_BASIS_MODULUS = uint512_t(1) << (68 * 4); + auto modulus_limbs = split_into_limbs(BINARY_BASIS_MODULUS - uint512_t(modulus)); + + const auto a_indices = get_limb_witness_indices(split_into_limbs(uint256_t(a))); + const auto b_indices = get_limb_witness_indices(split_into_limbs(uint256_t(b))); + const auto q_indices = get_limb_witness_indices(split_into_limbs(uint256_t(q))); + const auto r_indices = get_limb_witness_indices(split_into_limbs(uint256_t(r))); + + non_native_field_witnesses inputs{ + a_indices, b_indices, q_indices, r_indices, modulus_limbs, fr(uint256_t(modulus)), + }; + const auto [lo_1_idx, hi_1_idx] = circuit_constructor.evaluate_non_native_field_multiplication(inputs); + circuit_constructor.range_constrain_two_limbs(lo_1_idx, hi_1_idx, 70, 70); + + bool result = CircuitChecker::check(circuit_constructor); + EXPECT_EQ(result, true); + + // Everything above was copied from the previous test. + // Check that in the aux blocks, the other selectors besides the aux selector are zero + for (size_t i = 0; i < circuit_constructor.blocks.aux.size(); ++i) { + EXPECT_EQ(circuit_constructor.blocks.aux.q_arith()[i], 0); + EXPECT_EQ(circuit_constructor.blocks.aux.q_delta_range()[i], 0); + EXPECT_EQ(circuit_constructor.blocks.aux.q_elliptic()[i], 0); + EXPECT_EQ(circuit_constructor.blocks.aux.q_lookup_type()[i], 0); + EXPECT_EQ(circuit_constructor.blocks.aux.q_poseidon2_external()[i], 0); + EXPECT_EQ(circuit_constructor.blocks.aux.q_poseidon2_internal()[i], 0); + } +} + +TEST(UltraCircuitConstructor, Rom) { UltraCircuitBuilder circuit_constructor = UltraCircuitBuilder(); @@ -692,7 +763,7 @@ TEST(ultra_circuit_constructor, rom) * @brief A simple-as-possible RAM read test, for easier debugging * */ -TEST(ultra_circuit_constructor, ram_simple) +TEST(UltraCircuitConstructor, RamSimple) { UltraCircuitBuilder builder; @@ -722,7 +793,7 @@ TEST(ultra_circuit_constructor, ram_simple) EXPECT_TRUE(CircuitChecker::check(builder)); } -TEST(ultra_circuit_constructor, ram) +TEST(UltraCircuitConstructor, Ram) { UltraCircuitBuilder circuit_constructor = UltraCircuitBuilder(); @@ -793,7 +864,7 @@ TEST(ultra_circuit_constructor, ram) EXPECT_TRUE(CircuitChecker::check(duplicate_circuit_constructor)); } -TEST(ultra_circuit_constructor, range_checks_on_duplicates) +TEST(UltraCircuitConstructor, RangeChecksOnDuplicates) { UltraCircuitBuilder circuit_constructor = UltraCircuitBuilder(); @@ -828,7 +899,7 @@ TEST(ultra_circuit_constructor, range_checks_on_duplicates) EXPECT_EQ(result, true); } -TEST(ultra_circuit_constructor, check_circuit_showcase) +TEST(UltraCircuitConstructor, CheckCircuitShowcase) { UltraCircuitBuilder circuit_constructor = UltraCircuitBuilder(); // check_circuit allows us to check correctness on the go diff --git a/barretenberg/cpp/src/barretenberg/goblin/mock_circuits_pinning.test.cpp b/barretenberg/cpp/src/barretenberg/goblin/mock_circuits_pinning.test.cpp index 6367c157c15..8593024997f 100644 --- a/barretenberg/cpp/src/barretenberg/goblin/mock_circuits_pinning.test.cpp +++ b/barretenberg/cpp/src/barretenberg/goblin/mock_circuits_pinning.test.cpp @@ -49,4 +49,39 @@ TEST_F(MegaMockCircuitsPinning, AppCircuitSizes) }; run_test(true); run_test(false); +} + +/** + * @brief Regression test that the structured circuit size has not increased over a power of 2. + */ +TEST_F(MegaMockCircuitsPinning, SmallTestStructuredCircuitSize) +{ + GoblinProver goblin; + MegaCircuitBuilder app_circuit{ goblin.op_queue }; + auto proving_key = std::make_shared(app_circuit, TraceStructure::SMALL_TEST); + EXPECT_EQ(proving_key->proving_key.log_circuit_size, 18); +} + +TEST_F(MegaMockCircuitsPinning, ClientIVCBenchStructuredCircuitSize) +{ + GoblinProver goblin; + MegaCircuitBuilder app_circuit{ goblin.op_queue }; + auto proving_key = std::make_shared(app_circuit, TraceStructure::CLIENT_IVC_BENCH); + EXPECT_EQ(proving_key->proving_key.log_circuit_size, 18); +} + +TEST_F(MegaMockCircuitsPinning, AztecIVCBenchStructuredCircuitSize) +{ + GoblinProver goblin; + MegaCircuitBuilder app_circuit{ goblin.op_queue }; + auto proving_key = std::make_shared(app_circuit, TraceStructure::AZTEC_IVC_BENCH); + EXPECT_EQ(proving_key->proving_key.log_circuit_size, 19); +} + +TEST_F(MegaMockCircuitsPinning, E2EStructuredCircuitSize) +{ + GoblinProver goblin; + MegaCircuitBuilder app_circuit{ goblin.op_queue }; + auto proving_key = std::make_shared(app_circuit, TraceStructure::E2E_FULL_TEST); + EXPECT_EQ(proving_key->proving_key.log_circuit_size, 20); } \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/plonk_honk_shared/arithmetization/max_block_size_tracker.hpp b/barretenberg/cpp/src/barretenberg/plonk_honk_shared/arithmetization/max_block_size_tracker.hpp index 864d3f25944..911bd581e1f 100644 --- a/barretenberg/cpp/src/barretenberg/plonk_honk_shared/arithmetization/max_block_size_tracker.hpp +++ b/barretenberg/cpp/src/barretenberg/plonk_honk_shared/arithmetization/max_block_size_tracker.hpp @@ -30,10 +30,10 @@ struct MaxBlockSizeTracker { } // For printing only. Must match the order of the members in the arithmetization - std::vector block_labels{ "ecc_op", "pub_inputs", "arithmetic", - "delta_range", "elliptic", "aux", - "lookup", "busread", "poseidon_external", - "poseidon_internal" }; + std::vector block_labels{ + "ecc_op", "pub_inputs", "arithmetic", "delta_range", "elliptic", + "aux", "lookup", "busread", "poseidon2_external", "poseidon2_internal" + }; void print() { diff --git a/barretenberg/cpp/src/barretenberg/plonk_honk_shared/arithmetization/mega_arithmetization.hpp b/barretenberg/cpp/src/barretenberg/plonk_honk_shared/arithmetization/mega_arithmetization.hpp index cca898f800a..c7b3ec8f867 100644 --- a/barretenberg/cpp/src/barretenberg/plonk_honk_shared/arithmetization/mega_arithmetization.hpp +++ b/barretenberg/cpp/src/barretenberg/plonk_honk_shared/arithmetization/mega_arithmetization.hpp @@ -29,13 +29,13 @@ template class MegaArith { T aux; T lookup; T busread; - T poseidon_external; - T poseidon_internal; + T poseidon2_external; + T poseidon2_internal; auto get() { - return RefArray{ ecc_op, pub_inputs, arithmetic, delta_range, elliptic, - aux, lookup, busread, poseidon_external, poseidon_internal }; + return RefArray{ ecc_op, pub_inputs, arithmetic, delta_range, elliptic, + aux, lookup, busread, poseidon2_external, poseidon2_internal }; } bool operator==(const MegaTraceBlocks& other) const = default; @@ -55,8 +55,8 @@ template class MegaArith { this->aux = FIXED_SIZE; this->lookup = FIXED_SIZE; this->busread = FIXED_SIZE; - this->poseidon_external = FIXED_SIZE; - this->poseidon_internal = 1 << 15; + this->poseidon2_external = FIXED_SIZE; + this->poseidon2_internal = 1 << 15; } }; @@ -72,8 +72,8 @@ template class MegaArith { this->aux = 1 << 16; this->lookup = 1 << 15; this->busread = 1 << 7; - this->poseidon_external = 1 << 11; - this->poseidon_internal = 1 << 14; + this->poseidon2_external = 1 << 11; + this->poseidon2_internal = 1 << 14; } }; @@ -83,14 +83,14 @@ template class MegaArith { { this->ecc_op = 1 << 10; this->pub_inputs = 1 << 7; - this->arithmetic = 187000; + this->arithmetic = 201000; this->delta_range = 90000; this->elliptic = 9000; this->aux = 137000; this->lookup = 72000; this->busread = 1 << 7; - this->poseidon_external = 3500; - this->poseidon_internal = 17500; + this->poseidon2_external = 2500; + this->poseidon2_internal = 11500; } }; @@ -106,8 +106,8 @@ template class MegaArith { this->aux = 100000; this->lookup = 200000; this->busread = 10; - this->poseidon_external = 30000; - this->poseidon_internal = 150000; + this->poseidon2_external = 30000; + this->poseidon2_internal = 150000; } }; @@ -215,8 +215,8 @@ template class MegaArith { info("auxiliary :\t", this->aux.size(), "/", this->aux.get_fixed_size()); info("lookups :\t", this->lookup.size(), "/", this->lookup.get_fixed_size()); info("busread :\t", this->busread.size(), "/", this->busread.get_fixed_size()); - info("poseidon ext :\t", this->poseidon_external.size(), "/", this->poseidon_external.get_fixed_size()); - info("poseidon int :\t", this->poseidon_internal.size(), "/", this->poseidon_internal.get_fixed_size()); + info("poseidon ext :\t", this->poseidon2_external.size(), "/", this->poseidon2_external.get_fixed_size()); + info("poseidon int :\t", this->poseidon2_internal.size(), "/", this->poseidon2_internal.get_fixed_size()); info(""); } diff --git a/barretenberg/cpp/src/barretenberg/plonk_honk_shared/arithmetization/ultra_arithmetization.hpp b/barretenberg/cpp/src/barretenberg/plonk_honk_shared/arithmetization/ultra_arithmetization.hpp index 52f5ff80a2f..4d09da04f3e 100644 --- a/barretenberg/cpp/src/barretenberg/plonk_honk_shared/arithmetization/ultra_arithmetization.hpp +++ b/barretenberg/cpp/src/barretenberg/plonk_honk_shared/arithmetization/ultra_arithmetization.hpp @@ -21,13 +21,13 @@ template class UltraArith { T elliptic; T aux; T lookup; - T poseidon_external; - T poseidon_internal; + T poseidon2_external; + T poseidon2_internal; auto get() { - return RefArray{ pub_inputs, arithmetic, delta_range, elliptic, - aux, lookup, poseidon_external, poseidon_internal }; + return RefArray{ pub_inputs, arithmetic, delta_range, elliptic, + aux, lookup, poseidon2_external, poseidon2_internal }; } bool operator==(const UltraTraceBlocks& other) const = default; @@ -44,8 +44,8 @@ template class UltraArith { this->elliptic = FIXED_SIZE; this->aux = FIXED_SIZE; this->lookup = FIXED_SIZE; - this->poseidon_external = FIXED_SIZE; - this->poseidon_internal = FIXED_SIZE; + this->poseidon2_external = FIXED_SIZE; + this->poseidon2_internal = FIXED_SIZE; } }; @@ -119,8 +119,8 @@ template class UltraArith { auto get() { - return RefArray{ this->pub_inputs, this->arithmetic, this->delta_range, this->elliptic, - this->aux, this->lookup, this->poseidon_external, this->poseidon_internal }; + return RefArray{ this->pub_inputs, this->arithmetic, this->delta_range, this->elliptic, + this->aux, this->lookup, this->poseidon2_external, this->poseidon2_internal }; } void summarize() const @@ -132,8 +132,8 @@ template class UltraArith { info("elliptic :\t", this->elliptic.size()); info("auxiliary :\t", this->aux.size()); info("lookups :\t", this->lookup.size()); - info("poseidon ext :\t", this->poseidon_external.size()); - info("poseidon int :\t", this->poseidon_internal.size()); + info("poseidon ext :\t", this->poseidon2_external.size()); + info("poseidon int :\t", this->poseidon2_internal.size()); } size_t get_total_structured_size() diff --git a/barretenberg/cpp/src/barretenberg/stdlib/hash/poseidon2/poseidon2_permutation.cpp b/barretenberg/cpp/src/barretenberg/stdlib/hash/poseidon2/poseidon2_permutation.cpp index ef7e26d5d69..907f4fc6696 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/hash/poseidon2/poseidon2_permutation.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/hash/poseidon2/poseidon2_permutation.cpp @@ -50,7 +50,7 @@ typename Poseidon2Permutation::State Poseidon2Permutationcreate_dummy_gate(builder->blocks.poseidon_external, + builder->create_dummy_gate(builder->blocks.poseidon2_external, current_state[0].witness_index, current_state[1].witness_index, current_state[2].witness_index, @@ -75,7 +75,7 @@ typename Poseidon2Permutation::State Poseidon2Permutationcreate_dummy_gate(builder->blocks.poseidon_internal, + builder->create_dummy_gate(builder->blocks.poseidon2_internal, current_state[0].witness_index, current_state[1].witness_index, current_state[2].witness_index, @@ -101,7 +101,7 @@ typename Poseidon2Permutation::State Poseidon2Permutationcreate_dummy_gate(builder->blocks.poseidon_external, + builder->create_dummy_gate(builder->blocks.poseidon2_external, current_state[0].witness_index, current_state[1].witness_index, current_state[2].witness_index, diff --git a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_circuit_builder.cpp b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_circuit_builder.cpp index 0d554b80c13..9bae714db18 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_circuit_builder.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_circuit_builder.cpp @@ -180,52 +180,52 @@ void UltraCircuitBuilder_::add_gates_to_ensure_all_polys_are_no plookup::MultiTableId::HONK_DUMMY_MULTI, dummy_accumulators, left_witness_index, right_witness_index); // mock a poseidon external gate, with all zeros as input - blocks.poseidon_external.populate_wires(this->zero_idx, this->zero_idx, this->zero_idx, this->zero_idx); - blocks.poseidon_external.q_m().emplace_back(0); - blocks.poseidon_external.q_1().emplace_back(0); - blocks.poseidon_external.q_2().emplace_back(0); - blocks.poseidon_external.q_3().emplace_back(0); - blocks.poseidon_external.q_c().emplace_back(0); - blocks.poseidon_external.q_arith().emplace_back(0); - blocks.poseidon_external.q_4().emplace_back(0); - blocks.poseidon_external.q_delta_range().emplace_back(0); - blocks.poseidon_external.q_lookup_type().emplace_back(0); - blocks.poseidon_external.q_elliptic().emplace_back(0); - blocks.poseidon_external.q_aux().emplace_back(0); - blocks.poseidon_external.q_poseidon2_external().emplace_back(1); - blocks.poseidon_external.q_poseidon2_internal().emplace_back(0); + blocks.poseidon2_external.populate_wires(this->zero_idx, this->zero_idx, this->zero_idx, this->zero_idx); + blocks.poseidon2_external.q_m().emplace_back(0); + blocks.poseidon2_external.q_1().emplace_back(0); + blocks.poseidon2_external.q_2().emplace_back(0); + blocks.poseidon2_external.q_3().emplace_back(0); + blocks.poseidon2_external.q_c().emplace_back(0); + blocks.poseidon2_external.q_arith().emplace_back(0); + blocks.poseidon2_external.q_4().emplace_back(0); + blocks.poseidon2_external.q_delta_range().emplace_back(0); + blocks.poseidon2_external.q_lookup_type().emplace_back(0); + blocks.poseidon2_external.q_elliptic().emplace_back(0); + blocks.poseidon2_external.q_aux().emplace_back(0); + blocks.poseidon2_external.q_poseidon2_external().emplace_back(1); + blocks.poseidon2_external.q_poseidon2_internal().emplace_back(0); if constexpr (HasAdditionalSelectors) { - blocks.poseidon_external.pad_additional(); + blocks.poseidon2_external.pad_additional(); } check_selector_length_consistency(); ++this->num_gates; // dummy gate to be read into by previous poseidon external gate via shifts - this->create_dummy_gate(blocks.poseidon_external, this->zero_idx, this->zero_idx, this->zero_idx, this->zero_idx); + this->create_dummy_gate(blocks.poseidon2_external, this->zero_idx, this->zero_idx, this->zero_idx, this->zero_idx); // mock a poseidon internal gate, with all zeros as input - blocks.poseidon_internal.populate_wires(this->zero_idx, this->zero_idx, this->zero_idx, this->zero_idx); - blocks.poseidon_internal.q_m().emplace_back(0); - blocks.poseidon_internal.q_1().emplace_back(0); - blocks.poseidon_internal.q_2().emplace_back(0); - blocks.poseidon_internal.q_3().emplace_back(0); - blocks.poseidon_internal.q_c().emplace_back(0); - blocks.poseidon_internal.q_arith().emplace_back(0); - blocks.poseidon_internal.q_4().emplace_back(0); - blocks.poseidon_internal.q_delta_range().emplace_back(0); - blocks.poseidon_internal.q_lookup_type().emplace_back(0); - blocks.poseidon_internal.q_elliptic().emplace_back(0); - blocks.poseidon_internal.q_aux().emplace_back(0); - blocks.poseidon_internal.q_poseidon2_external().emplace_back(0); - blocks.poseidon_internal.q_poseidon2_internal().emplace_back(1); + blocks.poseidon2_internal.populate_wires(this->zero_idx, this->zero_idx, this->zero_idx, this->zero_idx); + blocks.poseidon2_internal.q_m().emplace_back(0); + blocks.poseidon2_internal.q_1().emplace_back(0); + blocks.poseidon2_internal.q_2().emplace_back(0); + blocks.poseidon2_internal.q_3().emplace_back(0); + blocks.poseidon2_internal.q_c().emplace_back(0); + blocks.poseidon2_internal.q_arith().emplace_back(0); + blocks.poseidon2_internal.q_4().emplace_back(0); + blocks.poseidon2_internal.q_delta_range().emplace_back(0); + blocks.poseidon2_internal.q_lookup_type().emplace_back(0); + blocks.poseidon2_internal.q_elliptic().emplace_back(0); + blocks.poseidon2_internal.q_aux().emplace_back(0); + blocks.poseidon2_internal.q_poseidon2_external().emplace_back(0); + blocks.poseidon2_internal.q_poseidon2_internal().emplace_back(1); if constexpr (HasAdditionalSelectors) { - blocks.poseidon_internal.pad_additional(); + blocks.poseidon2_internal.pad_additional(); } check_selector_length_consistency(); ++this->num_gates; // dummy gate to be read into by previous poseidon internal gate via shifts - create_dummy_gate(blocks.poseidon_internal, this->zero_idx, this->zero_idx, this->zero_idx, this->zero_idx); + create_dummy_gate(blocks.poseidon2_internal, this->zero_idx, this->zero_idx, this->zero_idx, this->zero_idx); } /** @@ -1717,45 +1717,22 @@ std::array UltraCircuitBuilder_::evaluate_non_nati range_constrain_two_limbs(input.q[2], input.q[3]); } - // TODO(https://github.com/AztecProtocol/barretenberg/issues/913): Remove this arithmetic gate from the aux block - // and replace with the big_add + dummy below. - this->assert_valid_variables({ input.q[0], input.q[1], input.r[1], lo_1_idx }); - blocks.aux.populate_wires(input.q[0], input.q[1], input.r[1], lo_1_idx); - blocks.aux.q_m().emplace_back(0); - blocks.aux.q_1().emplace_back(input.neg_modulus[0] + input.neg_modulus[1] * LIMB_SHIFT); - blocks.aux.q_2().emplace_back(input.neg_modulus[0] * LIMB_SHIFT); - blocks.aux.q_3().emplace_back(-LIMB_SHIFT); - blocks.aux.q_c().emplace_back(0); - blocks.aux.q_arith().emplace_back(2); - blocks.aux.q_4().emplace_back(-LIMB_SHIFT.sqr()); - blocks.aux.q_delta_range().emplace_back(0); - blocks.aux.q_lookup_type().emplace_back(0); - blocks.aux.q_elliptic().emplace_back(0); - blocks.aux.q_aux().emplace_back(0); - blocks.aux.q_poseidon2_external().emplace_back(0); - blocks.aux.q_poseidon2_internal().emplace_back(0); - if constexpr (HasAdditionalSelectors) { - blocks.aux.pad_additional(); - } - check_selector_length_consistency(); - ++this->num_gates; - // TODO(https://github.com/AztecProtocol/barretenberg/issues/879): Originally this was a single arithmetic gate. // With trace sorting, we must add a dummy gate since the add gate would otherwise try to read into an aux gate that - // has been sorted out of sequence. (Note: temporarily disabled in favor of manual arith gate in aux block above). + // has been sorted out of sequence. // product gate 1 // (lo_0 + q_0(p_0 + p_1*2^b) + q_1(p_0*2^b) - (r_1)2^b)2^-2b - lo_1 = 0 - // create_big_add_gate({ input.q[0], - // input.q[1], - // input.r[1], - // lo_1_idx, - // input.neg_modulus[0] + input.neg_modulus[1] * LIMB_SHIFT, - // input.neg_modulus[0] * LIMB_SHIFT, - // -LIMB_SHIFT, - // -LIMB_SHIFT.sqr(), - // 0 }, - // true); - // create_dummy_gate(blocks.arithmetic, this->zero_idx, this->zero_idx, this->zero_idx, lo_0_idx); + create_big_add_gate({ input.q[0], + input.q[1], + input.r[1], + lo_1_idx, + input.neg_modulus[0] + input.neg_modulus[1] * LIMB_SHIFT, + input.neg_modulus[0] * LIMB_SHIFT, + -LIMB_SHIFT, + -LIMB_SHIFT.sqr(), + 0 }, + true); + create_dummy_gate(blocks.arithmetic, this->zero_idx, this->zero_idx, this->zero_idx, lo_0_idx); blocks.aux.populate_wires(input.a[1], input.b[1], input.r[0], lo_0_idx); apply_aux_selectors(AUX_SELECTORS::NON_NATIVE_FIELD_1); @@ -2803,7 +2780,7 @@ template void UltraCircuitBuilder_:: template void UltraCircuitBuilder_::create_poseidon2_external_gate(const poseidon2_external_gate_& in) { - auto& block = this->blocks.poseidon_external; + auto& block = this->blocks.poseidon2_external; block.populate_wires(in.a, in.b, in.c, in.d); block.q_m().emplace_back(0); block.q_1().emplace_back(crypto::Poseidon2Bn254ScalarFieldParams::round_constants[in.round_idx][0]); @@ -2831,7 +2808,7 @@ void UltraCircuitBuilder_::create_poseidon2_external_gate(const poseidon2_ex template void UltraCircuitBuilder_::create_poseidon2_internal_gate(const poseidon2_internal_gate_& in) { - auto& block = this->blocks.poseidon_internal; + auto& block = this->blocks.poseidon2_internal; block.populate_wires(in.a, in.b, in.c, in.d); block.q_m().emplace_back(0); block.q_1().emplace_back(crypto::Poseidon2Bn254ScalarFieldParams::round_constants[in.round_idx][0]); diff --git a/yarn-project/README.md b/yarn-project/README.md index d3da1172535..9c4c5010812 100644 --- a/yarn-project/README.md +++ b/yarn-project/README.md @@ -86,6 +86,6 @@ COMMIT_TAG= - Extract `VERSION` as the script shows (in the eg it should be 0.8.8) - Skip the version existing checks like `if [ "$VERSION" == "$PUBLISHED_VERSION" ]` and `if [ "$VERSION" != "$HIGHER_VERSION" ]`. Since this is our first time deploying the package, `PUBLISHED_VERSION` and `HIGHER_VERSION` will be empty and hence these checks would fail. These checks are necessary in the CI for continual releases. - Locally update the package version in package.json using `jq` as shown in the script. - - Do a dry-run + - Do a dry-run - If dry run succeeds, publish the package! 5. Create a PR by adding your package into the `deploy-npm` script so next release onwards, CI can cut releases for your package.