From a75ef3ce95f4079bffebd75b98f5c0278673734b Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Thu, 18 Jul 2024 16:43:13 +0000 Subject: [PATCH 1/6] WiP fisrt pass adding calldata_2 --- .../circuit_checker/ultra_circuit_checker.cpp | 7 ++- .../relations/databus_lookup_relation.hpp | 32 ++++++++++--- .../protogalaxy_recursive_verifier.cpp | 2 + .../verifier/ultra_recursive_verifier.cpp | 2 + .../stdlib/primitives/databus/databus.hpp | 1 + .../stdlib_circuit_builders/databus.hpp | 4 +- .../mega_circuit_builder.cpp | 17 ++++++- .../mega_circuit_builder.hpp | 18 +++++++ .../stdlib_circuit_builders/mega_flavor.hpp | 47 ++++++++++++++++--- .../sumcheck/instance/prover_instance.cpp | 9 ++++ .../ultra_honk/mega_transcript.test.cpp | 4 ++ .../barretenberg/ultra_honk/oink_prover.cpp | 3 ++ .../barretenberg/ultra_honk/oink_verifier.cpp | 2 + .../ultra_honk/relation_correctness.test.cpp | 3 ++ 14 files changed, 132 insertions(+), 19 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/circuit_checker/ultra_circuit_checker.cpp b/barretenberg/cpp/src/barretenberg/circuit_checker/ultra_circuit_checker.cpp index 1ad994064a0..6e409203ceb 100644 --- a/barretenberg/cpp/src/barretenberg/circuit_checker/ultra_circuit_checker.cpp +++ b/barretenberg/cpp/src/barretenberg/circuit_checker/ultra_circuit_checker.cpp @@ -169,7 +169,8 @@ template bool UltraCircuitChecker::check_databus_read(auto& v // Determine the type of read based on selector values bool is_calldata_read = (values.q_l == 1); - bool is_return_data_read = (values.q_r == 1); + bool is_calldata_2_read = (values.q_r == 1); + bool is_return_data_read = (values.q_o == 1); ASSERT(is_calldata_read || is_return_data_read); // Check that the claimed value is present in the calldata/return data at the corresponding index @@ -178,6 +179,10 @@ template bool UltraCircuitChecker::check_databus_read(auto& v auto calldata = builder.get_calldata(); bus_value = builder.get_variable(calldata[raw_read_idx]); } + if (is_calldata_2_read) { + auto calldata_2 = builder.get_calldata_2(); + bus_value = builder.get_variable(calldata_2[raw_read_idx]); + } if (is_return_data_read) { auto return_data = builder.get_return_data(); bus_value = builder.get_variable(return_data[raw_read_idx]); diff --git a/barretenberg/cpp/src/barretenberg/relations/databus_lookup_relation.hpp b/barretenberg/cpp/src/barretenberg/relations/databus_lookup_relation.hpp index 55e9e03c64c..47abf8da396 100644 --- a/barretenberg/cpp/src/barretenberg/relations/databus_lookup_relation.hpp +++ b/barretenberg/cpp/src/barretenberg/relations/databus_lookup_relation.hpp @@ -47,10 +47,12 @@ template class DatabusLookupRelationImpl { public: using FF = FF_; static constexpr size_t LENGTH = 5; // 1 + polynomial degree of this relation - static constexpr size_t NUM_BUS_COLUMNS = 2; // calldata, return data + static constexpr size_t NUM_BUS_COLUMNS = 3; // calldata, return data // Note: Inverse correctness subrelations are actually LENGTH-1; taking advantage would require additional work static constexpr std::array SUBRELATION_PARTIAL_LENGTHS{ + LENGTH, // inverse polynomial correctness subrelation + LENGTH, // log-derivative lookup argument subrelation LENGTH, // inverse polynomial correctness subrelation LENGTH, // log-derivative lookup argument subrelation LENGTH, // inverse polynomial correctness subrelation @@ -64,6 +66,8 @@ polynomials, * exceed the subrelation partial degree, which is given by LENGTH - 1 in this case. */ static constexpr std::array SUBRELATION_WITNESS_DEGREES{ + LENGTH - 1, // inverse polynomial correctness subrelation + LENGTH - 1, // log-derivative lookup argument subrelation LENGTH - 1, // inverse polynomial correctness subrelation LENGTH - 1, // log-derivative lookup argument subrelation LENGTH - 1, // inverse polynomial correctness subrelation @@ -72,14 +76,14 @@ polynomials, // The lookup subrelations are "linearly dependent" in the sense that they establish the value of a sum across the // entire execution trace rather than a per-row identity. - static constexpr std::array SUBRELATION_LINEARLY_INDEPENDENT = { - true, false, true, false - }; + static constexpr std::array SUBRELATION_LINEARLY_INDEPENDENT = { true, false, true, + false, true, false }; template inline static bool skip([[maybe_unused]] const AllEntities& in) { // Ensure the input does not contain a read gate or data that is being read - return in.q_busread.is_zero() && in.calldata_read_counts.is_zero() && in.return_data_read_counts.is_zero(); + return in.q_busread.is_zero() && in.calldata_read_counts.is_zero() && in.return_data_read_counts.is_zero() && + in.calldata_2_read_counts.is_zero(); } // Interface for easy access of databus components by column (bus_idx) @@ -95,8 +99,18 @@ polynomials, static auto& read_tags(const AllEntities& in) { return in.calldata_read_tags; } }; - // Specialization for return data (bus_idx = 1) + // Specialization for calldata_2 (bus_idx = 1) template struct BusData { + static auto& values(const AllEntities& in) { return in.calldata_2; } + static auto& selector(const AllEntities& in) { return in.q_l; } + static auto& inverses(AllEntities& in) { return in.calldata_2_inverses; } + static auto& inverses(const AllEntities& in) { return in.calldata_2_inverses; } // const version + static auto& read_counts(const AllEntities& in) { return in.calldata_2_read_counts; } + static auto& read_tags(const AllEntities& in) { return in.calldata_2_read_tags; } + }; + + // Specialization for return data (bus_idx = 2) + template struct BusData { static auto& values(const AllEntities& in) { return in.return_data; } static auto& selector(const AllEntities& in) { return in.q_r; } static auto& inverses(AllEntities& in) { return in.return_data_inverses; } @@ -217,8 +231,12 @@ polynomials, is_read = q_busread == 1 && polynomials.q_l[i] == 1; nonzero_read_count = polynomials.calldata_read_counts[i] > 0; } - if constexpr (bus_idx == 1) { // return data + if constexpr (bus_idx == 1) { // calldata_2 is_read = q_busread == 1 && polynomials.q_r[i] == 1; + nonzero_read_count = polynomials.calldata_2_read_counts[i] > 0; + } + if constexpr (bus_idx == 2) { // return data + is_read = q_busread == 1 && polynomials.q_o[i] == 1; nonzero_read_count = polynomials.return_data_read_counts[i] > 0; } // We only compute the inverse if this row contains a read gate or data that has been read diff --git a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/protogalaxy_recursive_verifier.cpp b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/protogalaxy_recursive_verifier.cpp index 57b9697b225..bb87407da74 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/protogalaxy_recursive_verifier.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/protogalaxy_recursive_verifier.cpp @@ -71,6 +71,8 @@ void ProtoGalaxyRecursiveVerifier_::receive_and_finalise_inst if constexpr (IsGoblinFlavor) { witness_commitments.calldata_inverses = transcript->template receive_from_prover( domain_separator + "_" + commitment_labels.calldata_inverses); + witness_commitments.calldata_2_inverses = transcript->template receive_from_prover( + domain_separator + "_" + commitment_labels.calldata_2_inverses); witness_commitments.return_data_inverses = transcript->template receive_from_prover( domain_separator + "_" + commitment_labels.return_data_inverses); } diff --git a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/ultra_recursive_verifier.cpp b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/ultra_recursive_verifier.cpp index b54f21f0705..717f66a308a 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/ultra_recursive_verifier.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/ultra_recursive_verifier.cpp @@ -111,6 +111,8 @@ std::array UltraRecursiveVerifier_::ve if constexpr (IsGoblinFlavor) { commitments.calldata_inverses = transcript->template receive_from_prover(commitment_labels.calldata_inverses); + commitments.calldata_2_inverses = + transcript->template receive_from_prover(commitment_labels.calldata_2_inverses); commitments.return_data_inverses = transcript->template receive_from_prover(commitment_labels.return_data_inverses); } diff --git a/barretenberg/cpp/src/barretenberg/stdlib/primitives/databus/databus.hpp b/barretenberg/cpp/src/barretenberg/stdlib/primitives/databus/databus.hpp index ba64f38486c..af87db625b4 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/primitives/databus/databus.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/primitives/databus/databus.hpp @@ -51,6 +51,7 @@ template class databus { public: // The columns of the DataBus bus_vector calldata{ BusId::CALLDATA }; + bus_vector calldata_2{ BusId::CALLDATA_2 }; bus_vector return_data{ BusId::RETURNDATA }; }; } // namespace bb::stdlib \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/databus.hpp b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/databus.hpp index b83c842e72a..511dc5ed5b4 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/databus.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/databus.hpp @@ -54,7 +54,7 @@ struct BusVector { * in-circuit as we would with public inputs). * */ -using DataBus = std::array; -enum class BusId { CALLDATA, RETURNDATA }; +using DataBus = std::array; +enum class BusId { CALLDATA, CALLDATA_2, RETURNDATA }; } // namespace bb diff --git a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/mega_circuit_builder.cpp b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/mega_circuit_builder.cpp index c25dc3ac939..979be1c56ae 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/mega_circuit_builder.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/mega_circuit_builder.cpp @@ -40,6 +40,12 @@ template void MegaCircuitBuilder_::add_gates_to_ensure_all_pol auto read_idx = this->add_variable(raw_read_idx); read_calldata(read_idx); + // Create an arbitrary calldata_2 read gate + add_public_calldata_2(this->add_variable(25)); // ensure there is at least one entry in calldata_2 + raw_read_idx = static_cast(get_calldata_2().size()) - 1; // read data that was just added + read_idx = this->add_variable(raw_read_idx); + read_calldata_2(read_idx); + // Create an arbitrary return data read gate add_public_return_data(this->add_variable(17)); // ensure there is at least one entry in return data raw_read_idx = static_cast(get_return_data().size()) - 1; // read data that was just added @@ -238,17 +244,24 @@ template void MegaCircuitBuilder_::apply_databus_selectors(con case BusId::CALLDATA: { block.q_1().emplace_back(1); block.q_2().emplace_back(0); + block.q_3().emplace_back(0); break; } - case BusId::RETURNDATA: { + case BusId::CALLDATA_2: { block.q_1().emplace_back(0); block.q_2().emplace_back(1); + block.q_3().emplace_back(0); + break; + } + case BusId::RETURNDATA: { + block.q_1().emplace_back(0); + block.q_2().emplace_back(0); + block.q_3().emplace_back(1); break; } } block.q_busread().emplace_back(1); block.q_m().emplace_back(0); - block.q_3().emplace_back(0); block.q_c().emplace_back(0); block.q_delta_range().emplace_back(0); block.q_arith().emplace_back(0); diff --git a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/mega_circuit_builder.hpp b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/mega_circuit_builder.hpp index 1c4f87862f5..410e6dd8fc4 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/mega_circuit_builder.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/mega_circuit_builder.hpp @@ -171,6 +171,12 @@ template class MegaCircuitBuilder_ : public UltraCircuitBuilder_ class MegaCircuitBuilder_ : public UltraCircuitBuilder_ class MegaCircuitBuilder_ : public UltraCircuitBuilder_(BusId::CALLDATA)]; } + const BusVector& get_calldata_2() { return databus[static_cast(BusId::CALLDATA_2)]; } const BusVector& get_return_data() { return databus[static_cast(BusId::RETURNDATA)]; } void create_poseidon2_external_gate(const poseidon2_external_gate_& in); diff --git a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/mega_flavor.hpp b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/mega_flavor.hpp index 3bfcd5f376e..a63e401bea4 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/mega_flavor.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/mega_flavor.hpp @@ -39,12 +39,12 @@ class MegaFlavor { static constexpr size_t NUM_WIRES = CircuitBuilder::NUM_WIRES; // The number of multivariate polynomials on which a sumcheck prover sumcheck operates (including shifts). We often // need containers of this size to hold related data, so we choose a name more agnostic than `NUM_POLYNOMIALS`. - static constexpr size_t NUM_ALL_ENTITIES = 59; + static constexpr size_t NUM_ALL_ENTITIES = 63; // The number of polynomials precomputed to describe a circuit and to aid a prover in constructing a satisfying // assignment of witnesses. We again choose a neutral name. static constexpr size_t NUM_PRECOMPUTED_ENTITIES = 30; // The total number of witness entities not including shifts. - static constexpr size_t NUM_WITNESS_ENTITIES = 20; + static constexpr size_t NUM_WITNESS_ENTITIES = 24; // Total number of folded polynomials, which is just all polynomials except the shifts static constexpr size_t NUM_FOLDED_ENTITIES = NUM_PRECOMPUTED_ENTITIES + NUM_WITNESS_ENTITIES; @@ -188,10 +188,14 @@ class MegaFlavor { calldata_read_counts, // column 13 calldata_read_tags, // column 14 calldata_inverses, // column 15 - return_data, // column 16 - return_data_read_counts, // column 17 - return_data_read_tags, // column 18 - return_data_inverses); // column 19 + calldata_2, // column 16 + calldata_2_read_counts, // column 17 + calldata_2_read_tags, // column 18 + calldata_2_inverses, // column 19 + return_data, // column 20 + return_data_read_counts, // column 21 + return_data_read_tags, // column 22 + return_data_inverses); // column 23 }; /** @@ -212,6 +216,7 @@ class MegaFlavor { auto get_databus_entities() // Excludes the derived inverse polynomials { return RefArray{ this->calldata, this->calldata_read_counts, this->calldata_read_tags, + this->calldata_2, this->calldata_2_read_counts, this->calldata_2_read_tags, this->return_data, this->return_data_read_counts, this->return_data_read_tags }; } @@ -231,6 +236,10 @@ class MegaFlavor { this->calldata_read_counts, this->calldata_read_tags, this->calldata_inverses, + this->calldata_2, + this->calldata_2_read_counts, + this->calldata_2_read_tags, + this->calldata_2_inverses, this->return_data, this->return_data_read_counts, this->return_data_read_tags, @@ -403,9 +412,13 @@ class MegaFlavor { DatabusLookupRelation::compute_logderivative_inverse( this->polynomials, relation_parameters, this->circuit_size); - // Compute inverses for return data reads + // Compute inverses for calldata_2 reads DatabusLookupRelation::compute_logderivative_inverse( this->polynomials, relation_parameters, this->circuit_size); + + // Compute inverses for return data reads + DatabusLookupRelation::compute_logderivative_inverse( + this->polynomials, relation_parameters, this->circuit_size); } /** @@ -629,6 +642,10 @@ class MegaFlavor { calldata_read_counts = "CALLDATA_READ_COUNTS"; calldata_read_tags = "CALLDATA_READ_TAGS"; calldata_inverses = "CALLDATA_INVERSES"; + calldata = "CALLDATA_2"; + calldata_read_counts = "CALLDATA_2_READ_COUNTS"; + calldata_read_tags = "CALLDATA_2_READ_TAGS"; + calldata_inverses = "CALLDATA_2_INVERSES"; return_data = "RETURN_DATA"; return_data_read_counts = "RETURN_DATA_READ_COUNTS"; return_data_read_tags = "RETURN_DATA_READ_TAGS"; @@ -724,6 +741,10 @@ class MegaFlavor { this->calldata_read_counts = commitments.calldata_read_counts; this->calldata_read_tags = commitments.calldata_read_tags; this->calldata_inverses = commitments.calldata_inverses; + this->calldata_2 = commitments.calldata_2; + this->calldata_2_read_counts = commitments.calldata_2_read_counts; + this->calldata_2_read_tags = commitments.calldata_2_read_tags; + this->calldata_2_inverses = commitments.calldata_2_inverses; this->return_data = commitments.return_data; this->return_data_read_counts = commitments.return_data_read_counts; this->return_data_read_tags = commitments.return_data_read_tags; @@ -756,6 +777,10 @@ class MegaFlavor { Commitment calldata_read_counts_comm; Commitment calldata_read_tags_comm; Commitment calldata_inverses_comm; + Commitment calldata_2_comm; + Commitment calldata_2_read_counts_comm; + Commitment calldata_2_read_tags_comm; + Commitment calldata_2_inverses_comm; Commitment return_data_comm; Commitment return_data_read_counts_comm; Commitment return_data_read_tags_comm; @@ -814,6 +839,10 @@ class MegaFlavor { calldata_read_counts_comm = deserialize_from_buffer(proof_data, num_frs_read); calldata_read_tags_comm = deserialize_from_buffer(proof_data, num_frs_read); calldata_inverses_comm = deserialize_from_buffer(proof_data, num_frs_read); + calldata_2_comm = deserialize_from_buffer(proof_data, num_frs_read); + calldata_2_read_counts_comm = deserialize_from_buffer(proof_data, num_frs_read); + calldata_2_read_tags_comm = deserialize_from_buffer(proof_data, num_frs_read); + calldata_2_inverses_comm = deserialize_from_buffer(proof_data, num_frs_read); return_data_comm = deserialize_from_buffer(proof_data, num_frs_read); return_data_read_counts_comm = deserialize_from_buffer(proof_data, num_frs_read); return_data_read_tags_comm = deserialize_from_buffer(proof_data, num_frs_read); @@ -857,6 +886,10 @@ class MegaFlavor { serialize_to_buffer(calldata_read_counts_comm, proof_data); serialize_to_buffer(calldata_read_tags_comm, proof_data); serialize_to_buffer(calldata_inverses_comm, proof_data); + serialize_to_buffer(calldata_2_comm, proof_data); + serialize_to_buffer(calldata_2_read_counts_comm, proof_data); + serialize_to_buffer(calldata_2_read_tags_comm, proof_data); + serialize_to_buffer(calldata_2_inverses_comm, proof_data); serialize_to_buffer(return_data_comm, proof_data); serialize_to_buffer(return_data_read_counts_comm, proof_data); serialize_to_buffer(return_data_read_tags_comm, proof_data); diff --git a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp index 6c63849abde..27395eb505e 100644 --- a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp +++ b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp @@ -44,11 +44,15 @@ void ProverInstance_::construct_databus_polynomials(Circuit& circuit) auto& public_calldata = proving_key.polynomials.calldata; auto& calldata_read_counts = proving_key.polynomials.calldata_read_counts; auto& calldata_read_tags = proving_key.polynomials.calldata_read_tags; + auto& public_calldata_2 = proving_key.polynomials.calldata_2; + auto& calldata_2_read_counts = proving_key.polynomials.calldata_2_read_counts; + auto& calldata_2_read_tags = proving_key.polynomials.calldata_2_read_tags; auto& public_return_data = proving_key.polynomials.return_data; auto& return_data_read_counts = proving_key.polynomials.return_data_read_counts; auto& return_data_read_tags = proving_key.polynomials.return_data_read_tags; auto calldata = circuit.get_calldata(); + auto calldata_2 = circuit.get_calldata_2(); auto return_data = circuit.get_return_data(); // Note: We do not utilize a zero row for databus columns @@ -57,6 +61,11 @@ void ProverInstance_::construct_databus_polynomials(Circuit& circuit) calldata_read_counts[idx] = calldata.get_read_count(idx); // read counts calldata_read_tags[idx] = calldata_read_counts[idx] > 0 ? 1 : 0; // has row been read or not } + for (size_t idx = 0; idx < calldata_2.size(); ++idx) { + public_calldata_2[idx] = circuit.get_variable(calldata_2[idx]); // calldata_2 values + calldata_2_read_counts[idx] = calldata_2.get_read_count(idx); // read counts + calldata_2_read_tags[idx] = calldata_2_read_counts[idx] > 0 ? 1 : 0; // has row been read or not + } for (size_t idx = 0; idx < return_data.size(); ++idx) { public_return_data[idx] = circuit.get_variable(return_data[idx]); // return data values return_data_read_counts[idx] = return_data.get_read_count(idx); // read counts diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/mega_transcript.test.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/mega_transcript.test.cpp index 8566c56bddb..81201c094ee 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/mega_transcript.test.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/mega_transcript.test.cpp @@ -61,6 +61,9 @@ class MegaTranscriptTests : public ::testing::Test { manifest_expected.add_entry(round, "CALLDATA", frs_per_G); manifest_expected.add_entry(round, "CALLDATA_READ_COUNTS", frs_per_G); manifest_expected.add_entry(round, "CALLDATA_READ_TAGS", frs_per_G); + manifest_expected.add_entry(round, "CALLDATA_2", frs_per_G); + manifest_expected.add_entry(round, "CALLDATA_2_READ_COUNTS", frs_per_G); + manifest_expected.add_entry(round, "CALLDATA_2_READ_TAGS", frs_per_G); manifest_expected.add_entry(round, "RETURN_DATA", frs_per_G); manifest_expected.add_entry(round, "RETURN_DATA_READ_COUNTS", frs_per_G); manifest_expected.add_entry(round, "RETURN_DATA_READ_TAGS", frs_per_G); @@ -75,6 +78,7 @@ class MegaTranscriptTests : public ::testing::Test { round++; manifest_expected.add_entry(round, "LOOKUP_INVERSES", frs_per_G); manifest_expected.add_entry(round, "CALLDATA_INVERSES", frs_per_G); + manifest_expected.add_entry(round, "CALLDATA_2_INVERSES", frs_per_G); manifest_expected.add_entry(round, "RETURN_DATA_INVERSES", frs_per_G); manifest_expected.add_entry(round, "Z_PERM", frs_per_G); diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp index 811b2a79c4f..8b9e45229a1 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp @@ -144,9 +144,12 @@ template void OinkProver::execute_log_derivative_ // If Mega, commit to the databus inverse polynomials and send if constexpr (IsGoblinFlavor) { witness_commitments.calldata_inverses = commitment_key->commit(proving_key.polynomials.calldata_inverses); + witness_commitments.calldata_2_inverses = commitment_key->commit(proving_key.polynomials.calldata_2_inverses); witness_commitments.return_data_inverses = commitment_key->commit(proving_key.polynomials.return_data_inverses); transcript->send_to_verifier(domain_separator + commitment_labels.calldata_inverses, witness_commitments.calldata_inverses); + transcript->send_to_verifier(domain_separator + commitment_labels.calldata_2_inverses, + witness_commitments.calldata_2_inverses); transcript->send_to_verifier(domain_separator + commitment_labels.return_data_inverses, witness_commitments.return_data_inverses); } diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/oink_verifier.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/oink_verifier.cpp index 0722df3c0ce..887b7b80865 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/oink_verifier.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/oink_verifier.cpp @@ -114,6 +114,8 @@ template void OinkVerifier::execute_log_derivativ if constexpr (IsGoblinFlavor) { witness_comms.calldata_inverses = transcript->template receive_from_prover(domain_separator + comm_labels.calldata_inverses); + witness_comms.calldata_2_inverses = + transcript->template receive_from_prover(domain_separator + comm_labels.calldata_2_inverses); witness_comms.return_data_inverses = transcript->template receive_from_prover(domain_separator + comm_labels.return_data_inverses); } diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/relation_correctness.test.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/relation_correctness.test.cpp index cedd1fd4bb2..56d9096425f 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/relation_correctness.test.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/relation_correctness.test.cpp @@ -344,6 +344,9 @@ TEST_F(UltraRelationCorrectnessTests, Mega) ensure_non_zero(proving_key.polynomials.calldata); ensure_non_zero(proving_key.polynomials.calldata_read_counts); ensure_non_zero(proving_key.polynomials.calldata_inverses); + ensure_non_zero(proving_key.polynomials.calldata_2); + ensure_non_zero(proving_key.polynomials.calldata_2_read_counts); + ensure_non_zero(proving_key.polynomials.calldata_2_inverses); ensure_non_zero(proving_key.polynomials.return_data); ensure_non_zero(proving_key.polynomials.return_data_read_counts); ensure_non_zero(proving_key.polynomials.return_data_inverses); From 0255cb0c6aebbb71349799b86f792db163dc73fb Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Thu, 18 Jul 2024 20:59:19 +0000 Subject: [PATCH 2/6] fix all the bugs --- .../relations/databus_lookup_relation.hpp | 4 ++-- .../stdlib_circuit_builders/mega_flavor.hpp | 8 ++++---- .../ultra_circuit_builder.hpp | 2 +- .../src/barretenberg/transcript/transcript.hpp | 17 +++++++++++------ .../ultra_honk/mega_transcript.test.cpp | 15 ++++++++++++--- 5 files changed, 30 insertions(+), 16 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/relations/databus_lookup_relation.hpp b/barretenberg/cpp/src/barretenberg/relations/databus_lookup_relation.hpp index 47abf8da396..3fff8d5d27b 100644 --- a/barretenberg/cpp/src/barretenberg/relations/databus_lookup_relation.hpp +++ b/barretenberg/cpp/src/barretenberg/relations/databus_lookup_relation.hpp @@ -102,7 +102,7 @@ polynomials, // Specialization for calldata_2 (bus_idx = 1) template struct BusData { static auto& values(const AllEntities& in) { return in.calldata_2; } - static auto& selector(const AllEntities& in) { return in.q_l; } + static auto& selector(const AllEntities& in) { return in.q_r; } static auto& inverses(AllEntities& in) { return in.calldata_2_inverses; } static auto& inverses(const AllEntities& in) { return in.calldata_2_inverses; } // const version static auto& read_counts(const AllEntities& in) { return in.calldata_2_read_counts; } @@ -112,7 +112,7 @@ polynomials, // Specialization for return data (bus_idx = 2) template struct BusData { static auto& values(const AllEntities& in) { return in.return_data; } - static auto& selector(const AllEntities& in) { return in.q_r; } + static auto& selector(const AllEntities& in) { return in.q_o; } static auto& inverses(AllEntities& in) { return in.return_data_inverses; } static auto& inverses(const AllEntities& in) { return in.return_data_inverses; } // const version static auto& read_counts(const AllEntities& in) { return in.return_data_read_counts; } diff --git a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/mega_flavor.hpp b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/mega_flavor.hpp index a63e401bea4..3f797c83336 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/mega_flavor.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/mega_flavor.hpp @@ -642,10 +642,10 @@ class MegaFlavor { calldata_read_counts = "CALLDATA_READ_COUNTS"; calldata_read_tags = "CALLDATA_READ_TAGS"; calldata_inverses = "CALLDATA_INVERSES"; - calldata = "CALLDATA_2"; - calldata_read_counts = "CALLDATA_2_READ_COUNTS"; - calldata_read_tags = "CALLDATA_2_READ_TAGS"; - calldata_inverses = "CALLDATA_2_INVERSES"; + calldata_2 = "CALLDATA_2"; + calldata_2_read_counts = "CALLDATA_2_READ_COUNTS"; + calldata_2_read_tags = "CALLDATA_2_READ_TAGS"; + calldata_2_inverses = "CALLDATA_2_INVERSES"; return_data = "RETURN_DATA"; return_data_read_counts = "RETURN_DATA_READ_COUNTS"; return_data_read_tags = "RETURN_DATA_READ_TAGS"; diff --git a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_circuit_builder.hpp b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_circuit_builder.hpp index 46657b10a09..d9e157c14e7 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_circuit_builder.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_circuit_builder.hpp @@ -331,7 +331,7 @@ class UltraCircuitBuilder_ : public CircuitBuilderBase challenge_label; std::vector> entries; + void print() + { + for (auto& label : challenge_label) { + info("\tchallenge: ", label); + } + for (auto& entry : entries) { + info("\telement (", entry.second, "): ", entry.first); + } + } + bool operator==(const RoundData& other) const = default; }; @@ -33,12 +43,7 @@ class TranscriptManifest { { for (auto& round : manifest) { info("Round: ", round.first); - for (auto& label : round.second.challenge_label) { - info("\tchallenge: ", label); - } - for (auto& entry : round.second.entries) { - info("\telement (", entry.second, "): ", entry.first); - } + round.second.print(); } } diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/mega_transcript.test.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/mega_transcript.test.cpp index 81201c094ee..26a140a3441 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/mega_transcript.test.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/mega_transcript.test.cpp @@ -167,7 +167,12 @@ TEST_F(MegaTranscriptTests, ProverManifestConsistency) auto prover_manifest = prover.transcript->get_manifest(); // Note: a manifest can be printed using manifest.print() for (size_t round = 0; round < manifest_expected.size(); ++round) { - ASSERT_EQ(prover_manifest[round], manifest_expected[round]) << "Prover manifest discrepency in round " << round; + if (prover_manifest[round] != manifest_expected[round]) { + info("Prover manifest discrepency in round ", round); + prover_manifest[round].print(); + manifest_expected[round].print(); + ASSERT(false); + } } } @@ -199,8 +204,12 @@ TEST_F(MegaTranscriptTests, VerifierManifestConsistency) // Note: a manifest can be printed using manifest.print() for (size_t round = 0; round < prover_manifest.size(); ++round) { - ASSERT_EQ(prover_manifest[round], verifier_manifest[round]) - << "Prover/Verifier manifest discrepency in round " << round; + if (prover_manifest[round] != verifier_manifest[round]) { + info("Prover/Verifier manifest discrepency in round ", round); + prover_manifest[round].print(); + verifier_manifest[round].print(); + ASSERT(false); + } } } From fc42e8b74136294e887602b42506d6e6170c15b4 Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Thu, 18 Jul 2024 23:18:18 +0000 Subject: [PATCH 3/6] simplify and add test for new column --- .../barretenberg/ultra_honk/databus.test.cpp | 133 +++++++++--------- 1 file changed, 68 insertions(+), 65 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/databus.test.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/databus.test.cpp index 5f148c3c007..4a9704f614e 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/databus.test.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/databus.test.cpp @@ -11,18 +11,18 @@ #include "barretenberg/ultra_honk/ultra_prover.hpp" #include "barretenberg/ultra_honk/ultra_verifier.hpp" -using namespace bb; - namespace { -auto& engine = numeric::get_debug_randomness(); +auto& engine = bb::numeric::get_debug_randomness(); } +namespace bb { class DataBusTests : public ::testing::Test { protected: static void SetUpTestSuite() { bb::srs::init_crs_factory("../srs_db/ignition"); } using Curve = curve::BN254; using FF = Curve::ScalarField; + using Builder = MegaCircuitBuilder; // Construct and verify a MegaHonk proof for a given circuit static bool construct_and_verify_proof(MegaCircuitBuilder& builder) @@ -42,92 +42,93 @@ class DataBusTests : public ::testing::Test { GoblinMockCircuits::construct_simple_circuit(builder); return builder; } + + /** + * @brief Test method for constructing a databus column and performing reads on it + * @details All individual bus columns (calldata, returndata etc.) behave the same way. This method facilitates + * testing each of them individually by allowing specification of the add and read methods for a given bus column + * type. + * + * @param add_bus_data Method for adding data to the given bus column + * @param read_bus_data Method for reading from a given bus column + * @return Builder + */ + static Builder construct_circuit_with_databus_reads( + const std::function& add_bus_data, + const std::function& read_bus_data) + { + // Construct a circuit and add some ecc op gates and arithmetic gates + Builder builder = construct_test_builder(); + + const uint32_t NUM_BUS_ENTRIES = 5; // number of entries in the bus column + const uint32_t NUM_READS = 7; // greater than size of bus to ensure duplicates + + // Add some arbitrary values to the bus column + for (size_t i = 0; i < NUM_BUS_ENTRIES; ++i) { + FF val = FF::random_element(); + uint32_t val_witness_idx = builder.add_variable(val); + add_bus_data(builder, val_witness_idx); + } + + // Read from the bus at some random indices + for (size_t i = 0; i < NUM_READS; ++i) { + uint32_t read_idx = engine.get_random_uint32() % NUM_BUS_ENTRIES; + uint32_t read_idx_witness_idx = builder.add_variable(read_idx); + read_bus_data(builder, read_idx_witness_idx); + } + + return builder; + } }; /** * @brief Test proof construction/verification for a circuit with calldata lookup gates - * gates * */ TEST_F(DataBusTests, CallDataRead) { - // Construct a circuit and add some ecc op gates and arithmetic gates - auto builder = construct_test_builder(); - - // Add some values to calldata - std::vector calldata_values = { 7, 10, 3, 12, 1 }; - for (auto& val : calldata_values) { - builder.add_public_calldata(builder.add_variable(val)); - } + // Define the add and read methods for databus calldata + auto add_calldata = [](Builder& builder, uint32_t witness_idx) { builder.add_public_calldata(witness_idx); }; + auto read_calldata = [](Builder& builder, uint32_t witness_idx) { return builder.read_calldata(witness_idx); }; - // Define some raw indices at which to read calldata - std::vector read_indices = { 1, 4 }; + Builder builder = construct_circuit_with_databus_reads(add_calldata, read_calldata); - // Create some calldata read gates and store the variable indices of the result for later - std::vector result_witness_indices; - for (uint32_t& read_idx : read_indices) { - // Create a variable corresponding to the index at which we want to read into calldata - uint32_t read_idx_witness_idx = builder.add_variable(read_idx); + // Construct and verify Honk proof + EXPECT_TRUE(construct_and_verify_proof(builder)); +} - auto value_witness_idx = builder.read_calldata(read_idx_witness_idx); - result_witness_indices.emplace_back(value_witness_idx); - } +/** + * @brief Test proof construction/verification for a circuit with calldata_2 lookup gates + * + */ +TEST_F(DataBusTests, CallData2Read) +{ + // Define the add and read methods for databus calldata_2 + auto add_calldata_2 = [](Builder& builder, uint32_t witness_idx) { builder.add_public_calldata_2(witness_idx); }; + auto read_calldata_2 = [](Builder& builder, uint32_t witness_idx) { return builder.read_calldata_2(witness_idx); }; - // Generally, we'll want to use the result of a read in some other operation. As an example, we construct a gate - // that shows the sum of the two values just read is equal to the expected sum. - FF expected_sum = 0; - for (uint32_t& read_idx : read_indices) { - expected_sum += calldata_values[read_idx]; - } - builder.create_add_gate( - { result_witness_indices[0], result_witness_indices[1], builder.zero_idx, 1, 1, 0, -expected_sum }); + Builder builder = construct_circuit_with_databus_reads(add_calldata_2, read_calldata_2); // Construct and verify Honk proof - bool result = construct_and_verify_proof(builder); - EXPECT_TRUE(result); + EXPECT_TRUE(construct_and_verify_proof(builder)); } /** * @brief Test proof construction/verification for a circuit with return data lookup gates - * gates * */ TEST_F(DataBusTests, ReturnDataRead) { - // Construct a circuit and add some ecc op gates and arithmetic gates - auto builder = construct_test_builder(); - - // Add some values to return_data - std::vector return_data_values = { 7, 10, 3, 12, 1 }; - for (auto& val : return_data_values) { - builder.add_public_return_data(builder.add_variable(val)); - } - - // Define some raw indices at which to read return_data - std::vector read_indices = { 1, 4 }; + // Define the add and read methods for databus return data + auto add_return_data = [](Builder& builder, uint32_t witness_idx) { builder.add_public_return_data(witness_idx); }; + auto read_return_data = [](Builder& builder, uint32_t witness_idx) { + return builder.read_return_data(witness_idx); + }; - // Create some return_data read gates and store the variable indices of the result for later - std::vector result_witness_indices; - for (uint32_t& read_idx : read_indices) { - // Create a variable corresponding to the index at which we want to read into return_data - uint32_t read_idx_witness_idx = builder.add_variable(read_idx); - - auto value_witness_idx = builder.read_return_data(read_idx_witness_idx); - result_witness_indices.emplace_back(value_witness_idx); - } - - // Generally, we'll want to use the result of a read in some other operation. As an example, we construct a gate - // that shows the sum of the two values just read is equal to the expected sum. - FF expected_sum = 0; - for (uint32_t& read_idx : read_indices) { - expected_sum += return_data_values[read_idx]; - } - builder.create_add_gate( - { result_witness_indices[0], result_witness_indices[1], builder.zero_idx, 1, 1, 0, -expected_sum }); + Builder builder = construct_circuit_with_databus_reads(add_return_data, read_return_data); // Construct and verify Honk proof - bool result = construct_and_verify_proof(builder); - EXPECT_TRUE(result); + EXPECT_TRUE(construct_and_verify_proof(builder)); } /** @@ -206,4 +207,6 @@ TEST_F(DataBusTests, CallDataDuplicateRead) // Construct and verify Honk proof bool result = construct_and_verify_proof(builder); EXPECT_TRUE(result); -} \ No newline at end of file +} + +} // namespace bb \ No newline at end of file From 1a645f6a9a8ffcf1ca97a5f513a5a56a3dfc17a5 Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Fri, 19 Jul 2024 12:53:23 +0000 Subject: [PATCH 4/6] better generalized tests --- .../barretenberg/ultra_honk/databus.test.cpp | 94 +++++++++---------- 1 file changed, 43 insertions(+), 51 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/databus.test.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/databus.test.cpp index 4a9704f614e..507a531cb9e 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/databus.test.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/databus.test.cpp @@ -54,11 +54,10 @@ class DataBusTests : public ::testing::Test { * @return Builder */ static Builder construct_circuit_with_databus_reads( + Builder& builder, const std::function& add_bus_data, const std::function& read_bus_data) { - // Construct a circuit and add some ecc op gates and arithmetic gates - Builder builder = construct_test_builder(); const uint32_t NUM_BUS_ENTRIES = 5; // number of entries in the bus column const uint32_t NUM_READS = 7; // greater than size of bus to ensure duplicates @@ -79,6 +78,33 @@ class DataBusTests : public ::testing::Test { return builder; } + + static Builder construct_circuit_with_calldata_reads(Builder& builder) + { + // Define interfaces for the add and read methods for databus calldata + auto add_method = [](Builder& builder, uint32_t witness_idx) { builder.add_public_calldata(witness_idx); }; + auto read_method = [](Builder& builder, uint32_t witness_idx) { return builder.read_calldata(witness_idx); }; + + return construct_circuit_with_databus_reads(builder, add_method, read_method); + } + + static Builder construct_circuit_with_calldata_2_reads(Builder& builder) + { + // Define interfaces for the add and read methods for databus calldata_2 + auto add_method = [](Builder& builder, uint32_t witness_idx) { builder.add_public_calldata_2(witness_idx); }; + auto read_method = [](Builder& builder, uint32_t witness_idx) { return builder.read_calldata_2(witness_idx); }; + + return construct_circuit_with_databus_reads(builder, add_method, read_method); + } + + static Builder construct_circuit_with_return_data_reads(Builder& builder) + { + // Define interfaces for the add and read methods for databus return data + auto add_method = [](Builder& builder, uint32_t witness_idx) { builder.add_public_return_data(witness_idx); }; + auto read_method = [](Builder& builder, uint32_t witness_idx) { return builder.read_return_data(witness_idx); }; + + return construct_circuit_with_databus_reads(builder, add_method, read_method); + } }; /** @@ -87,13 +113,9 @@ class DataBusTests : public ::testing::Test { */ TEST_F(DataBusTests, CallDataRead) { - // Define the add and read methods for databus calldata - auto add_calldata = [](Builder& builder, uint32_t witness_idx) { builder.add_public_calldata(witness_idx); }; - auto read_calldata = [](Builder& builder, uint32_t witness_idx) { return builder.read_calldata(witness_idx); }; - - Builder builder = construct_circuit_with_databus_reads(add_calldata, read_calldata); + Builder builder = construct_test_builder(); + construct_circuit_with_calldata_reads(builder); - // Construct and verify Honk proof EXPECT_TRUE(construct_and_verify_proof(builder)); } @@ -103,13 +125,9 @@ TEST_F(DataBusTests, CallDataRead) */ TEST_F(DataBusTests, CallData2Read) { - // Define the add and read methods for databus calldata_2 - auto add_calldata_2 = [](Builder& builder, uint32_t witness_idx) { builder.add_public_calldata_2(witness_idx); }; - auto read_calldata_2 = [](Builder& builder, uint32_t witness_idx) { return builder.read_calldata_2(witness_idx); }; - - Builder builder = construct_circuit_with_databus_reads(add_calldata_2, read_calldata_2); + Builder builder = construct_test_builder(); + construct_circuit_with_calldata_2_reads(builder); - // Construct and verify Honk proof EXPECT_TRUE(construct_and_verify_proof(builder)); } @@ -119,55 +137,29 @@ TEST_F(DataBusTests, CallData2Read) */ TEST_F(DataBusTests, ReturnDataRead) { - // Define the add and read methods for databus return data - auto add_return_data = [](Builder& builder, uint32_t witness_idx) { builder.add_public_return_data(witness_idx); }; - auto read_return_data = [](Builder& builder, uint32_t witness_idx) { - return builder.read_return_data(witness_idx); - }; - - Builder builder = construct_circuit_with_databus_reads(add_return_data, read_return_data); + Builder builder = construct_test_builder(); + construct_circuit_with_return_data_reads(builder); - // Construct and verify Honk proof EXPECT_TRUE(construct_and_verify_proof(builder)); } /** - * @brief Test reads from calldata and return data in the same circuit + * @brief Test proof construction/verification for a circuit with reads from all bus columns * */ -TEST_F(DataBusTests, CallDataAndReturnData) +TEST_F(DataBusTests, ReadAll) { - // Construct a circuit and add some ecc op gates and arithmetic gates - auto builder = construct_test_builder(); - - // Add some values to calldata - std::vector calldata_values = { 5, 27, 11 }; - for (auto& val : calldata_values) { - builder.add_public_calldata(builder.add_variable(val)); - } + Builder builder = construct_test_builder(); + construct_circuit_with_calldata_reads(builder); + construct_circuit_with_calldata_2_reads(builder); + construct_circuit_with_return_data_reads(builder); - // Add some values to return_data - std::vector return_data_values = { 7, 10 }; - for (auto& val : return_data_values) { - builder.add_public_return_data(builder.add_variable(val)); - } - - // Make some aribitrary reads from calldata and return data - uint32_t read_idx = 2; - uint32_t read_idx_witness_idx = builder.add_variable(read_idx); - builder.read_calldata(read_idx_witness_idx); - - read_idx = 0; - read_idx_witness_idx = builder.add_variable(read_idx); - builder.read_return_data(read_idx_witness_idx); - - // Construct and verify Honk proof - bool result = construct_and_verify_proof(builder); - EXPECT_TRUE(result); + EXPECT_TRUE(construct_and_verify_proof(builder)); } /** - * @brief Test proof construction/verification for a circuit with duplicate calldata reads + * @brief Test proof construction/verification for a circuit with duplicate calldata reads and some explicit checks that + * the read results are correct * */ TEST_F(DataBusTests, CallDataDuplicateRead) From 336e99f5501e49cf7a22e9d715efc447f65df98b Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Fri, 19 Jul 2024 14:54:40 +0000 Subject: [PATCH 5/6] add flavor getter for inverses --- .../circuit_checker/ultra_circuit_checker.cpp | 2 +- .../relations/databus_lookup_relation.hpp | 4 ++-- .../verifier/protogalaxy_recursive_verifier.cpp | 10 ++++------ .../verifier/ultra_recursive_verifier.cpp | 13 ++++++------- .../stdlib_circuit_builders/mega_flavor.hpp | 9 +++++++++ .../src/barretenberg/ultra_honk/oink_prover.cpp | 15 ++++++--------- .../src/barretenberg/ultra_honk/oink_verifier.cpp | 10 ++++------ 7 files changed, 32 insertions(+), 31 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/circuit_checker/ultra_circuit_checker.cpp b/barretenberg/cpp/src/barretenberg/circuit_checker/ultra_circuit_checker.cpp index 6e409203ceb..84b45449172 100644 --- a/barretenberg/cpp/src/barretenberg/circuit_checker/ultra_circuit_checker.cpp +++ b/barretenberg/cpp/src/barretenberg/circuit_checker/ultra_circuit_checker.cpp @@ -171,7 +171,7 @@ template bool UltraCircuitChecker::check_databus_read(auto& v bool is_calldata_read = (values.q_l == 1); bool is_calldata_2_read = (values.q_r == 1); bool is_return_data_read = (values.q_o == 1); - ASSERT(is_calldata_read || is_return_data_read); + ASSERT(is_calldata_read || is_calldata_2_read || is_return_data_read); // Check that the claimed value is present in the calldata/return data at the corresponding index FF bus_value; diff --git a/barretenberg/cpp/src/barretenberg/relations/databus_lookup_relation.hpp b/barretenberg/cpp/src/barretenberg/relations/databus_lookup_relation.hpp index 3fff8d5d27b..205e7d0a139 100644 --- a/barretenberg/cpp/src/barretenberg/relations/databus_lookup_relation.hpp +++ b/barretenberg/cpp/src/barretenberg/relations/databus_lookup_relation.hpp @@ -82,8 +82,8 @@ polynomials, template inline static bool skip([[maybe_unused]] const AllEntities& in) { // Ensure the input does not contain a read gate or data that is being read - return in.q_busread.is_zero() && in.calldata_read_counts.is_zero() && in.return_data_read_counts.is_zero() && - in.calldata_2_read_counts.is_zero(); + return in.q_busread.is_zero() && in.calldata_read_counts.is_zero() && in.calldata_2_read_counts.is_zero() && + in.return_data_read_counts.is_zero(); } // Interface for easy access of databus components by column (bus_idx) diff --git a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/protogalaxy_recursive_verifier.cpp b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/protogalaxy_recursive_verifier.cpp index bb87407da74..437fb0422bd 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/protogalaxy_recursive_verifier.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/protogalaxy_recursive_verifier.cpp @@ -69,12 +69,10 @@ void ProtoGalaxyRecursiveVerifier_::receive_and_finalise_inst // If Goblin (i.e. using DataBus) receive commitments to log-deriv inverses polynomial if constexpr (IsGoblinFlavor) { - witness_commitments.calldata_inverses = transcript->template receive_from_prover( - domain_separator + "_" + commitment_labels.calldata_inverses); - witness_commitments.calldata_2_inverses = transcript->template receive_from_prover( - domain_separator + "_" + commitment_labels.calldata_2_inverses); - witness_commitments.return_data_inverses = transcript->template receive_from_prover( - domain_separator + "_" + commitment_labels.return_data_inverses); + for (auto [commitment, label] : + zip_view(witness_commitments.get_databus_inverses(), commitment_labels.get_databus_inverses())) { + commitment = transcript->template receive_from_prover(domain_separator + "_" + label); + } } witness_commitments.z_perm = diff --git a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/ultra_recursive_verifier.cpp b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/ultra_recursive_verifier.cpp index 717f66a308a..88ae0648222 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/ultra_recursive_verifier.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/honk_recursion/verifier/ultra_recursive_verifier.cpp @@ -107,15 +107,14 @@ std::array UltraRecursiveVerifier_::ve commitments.lookup_inverses = transcript->template receive_from_prover(commitment_labels.lookup_inverses); - // If Goblin (i.e. using DataBus) receive commitments to log-deriv inverses polynomial + // If Goblin (i.e. using DataBus) receive commitments to log-deriv inverses polynomials if constexpr (IsGoblinFlavor) { - commitments.calldata_inverses = - transcript->template receive_from_prover(commitment_labels.calldata_inverses); - commitments.calldata_2_inverses = - transcript->template receive_from_prover(commitment_labels.calldata_2_inverses); - commitments.return_data_inverses = - transcript->template receive_from_prover(commitment_labels.return_data_inverses); + for (auto [commitment, label] : + zip_view(commitments.get_databus_inverses(), commitment_labels.get_databus_inverses())) { + commitment = transcript->template receive_from_prover(label); + } } + const FF public_input_delta = compute_public_input_delta( public_inputs, beta, gamma, circuit_size, static_cast(key->pub_inputs_offset)); diff --git a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/mega_flavor.hpp b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/mega_flavor.hpp index 3f797c83336..a44340ce5a9 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/mega_flavor.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/mega_flavor.hpp @@ -220,6 +220,15 @@ class MegaFlavor { this->return_data, this->return_data_read_counts, this->return_data_read_tags }; } + auto get_databus_inverses() + { + return RefArray{ + this->calldata_inverses, + this->calldata_2_inverses, + this->return_data_inverses, + }; + } + MSGPACK_FIELDS(this->w_l, this->w_r, this->w_o, diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp index 8b9e45229a1..47993acabcc 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp @@ -143,15 +143,12 @@ template void OinkProver::execute_log_derivative_ // If Mega, commit to the databus inverse polynomials and send if constexpr (IsGoblinFlavor) { - witness_commitments.calldata_inverses = commitment_key->commit(proving_key.polynomials.calldata_inverses); - witness_commitments.calldata_2_inverses = commitment_key->commit(proving_key.polynomials.calldata_2_inverses); - witness_commitments.return_data_inverses = commitment_key->commit(proving_key.polynomials.return_data_inverses); - transcript->send_to_verifier(domain_separator + commitment_labels.calldata_inverses, - witness_commitments.calldata_inverses); - transcript->send_to_verifier(domain_separator + commitment_labels.calldata_2_inverses, - witness_commitments.calldata_2_inverses); - transcript->send_to_verifier(domain_separator + commitment_labels.return_data_inverses, - witness_commitments.return_data_inverses); + for (auto [commitment, polynomial, label] : zip_view(witness_commitments.get_databus_inverses(), + proving_key.polynomials.get_databus_inverses(), + commitment_labels.get_databus_inverses())) { + commitment = commitment_key->commit(polynomial); + transcript->send_to_verifier(domain_separator + label, commitment); + } } } diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/oink_verifier.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/oink_verifier.cpp index 887b7b80865..ad4f69c2258 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/oink_verifier.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/oink_verifier.cpp @@ -112,12 +112,10 @@ template void OinkVerifier::execute_log_derivativ // If Goblin (i.e. using DataBus) receive commitments to log-deriv inverses polynomials if constexpr (IsGoblinFlavor) { - witness_comms.calldata_inverses = - transcript->template receive_from_prover(domain_separator + comm_labels.calldata_inverses); - witness_comms.calldata_2_inverses = - transcript->template receive_from_prover(domain_separator + comm_labels.calldata_2_inverses); - witness_comms.return_data_inverses = - transcript->template receive_from_prover(domain_separator + comm_labels.return_data_inverses); + for (auto [commitment, label] : + zip_view(witness_comms.get_databus_inverses(), comm_labels.get_databus_inverses())) { + commitment = transcript->template receive_from_prover(domain_separator + label); + } } } From 05cd65081af74f1462dd7f988b72fc603e43efb9 Mon Sep 17 00:00:00 2001 From: ledwards2225 Date: Mon, 22 Jul 2024 14:19:03 +0000 Subject: [PATCH 6/6] comments and naming in response to review --- .../circuit_checker/ultra_circuit_checker.cpp | 10 +- .../relations/databus_lookup_relation.hpp | 64 ++++++----- .../stdlib/primitives/databus/databus.hpp | 2 +- .../stdlib_circuit_builders/databus.hpp | 2 +- .../mega_circuit_builder.cpp | 10 +- .../mega_circuit_builder.hpp | 18 ++-- .../stdlib_circuit_builders/mega_flavor.hpp | 100 +++++++++--------- .../sumcheck/instance/prover_instance.cpp | 16 +-- .../barretenberg/ultra_honk/databus.test.cpp | 18 ++-- .../ultra_honk/mega_transcript.test.cpp | 8 +- .../ultra_honk/relation_correctness.test.cpp | 6 +- 11 files changed, 137 insertions(+), 117 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/circuit_checker/ultra_circuit_checker.cpp b/barretenberg/cpp/src/barretenberg/circuit_checker/ultra_circuit_checker.cpp index 84b45449172..23d9e745c52 100644 --- a/barretenberg/cpp/src/barretenberg/circuit_checker/ultra_circuit_checker.cpp +++ b/barretenberg/cpp/src/barretenberg/circuit_checker/ultra_circuit_checker.cpp @@ -169,9 +169,9 @@ template bool UltraCircuitChecker::check_databus_read(auto& v // Determine the type of read based on selector values bool is_calldata_read = (values.q_l == 1); - bool is_calldata_2_read = (values.q_r == 1); + bool is_secondary_calldata_read = (values.q_r == 1); bool is_return_data_read = (values.q_o == 1); - ASSERT(is_calldata_read || is_calldata_2_read || is_return_data_read); + ASSERT(is_calldata_read || is_secondary_calldata_read || is_return_data_read); // Check that the claimed value is present in the calldata/return data at the corresponding index FF bus_value; @@ -179,9 +179,9 @@ template bool UltraCircuitChecker::check_databus_read(auto& v auto calldata = builder.get_calldata(); bus_value = builder.get_variable(calldata[raw_read_idx]); } - if (is_calldata_2_read) { - auto calldata_2 = builder.get_calldata_2(); - bus_value = builder.get_variable(calldata_2[raw_read_idx]); + if (is_secondary_calldata_read) { + auto secondary_calldata = builder.get_secondary_calldata(); + bus_value = builder.get_variable(secondary_calldata[raw_read_idx]); } if (is_return_data_read) { auto return_data = builder.get_return_data(); diff --git a/barretenberg/cpp/src/barretenberg/relations/databus_lookup_relation.hpp b/barretenberg/cpp/src/barretenberg/relations/databus_lookup_relation.hpp index 205e7d0a139..353be1c76ce 100644 --- a/barretenberg/cpp/src/barretenberg/relations/databus_lookup_relation.hpp +++ b/barretenberg/cpp/src/barretenberg/relations/databus_lookup_relation.hpp @@ -49,41 +49,51 @@ template class DatabusLookupRelationImpl { static constexpr size_t LENGTH = 5; // 1 + polynomial degree of this relation static constexpr size_t NUM_BUS_COLUMNS = 3; // calldata, return data + static constexpr size_t INVERSE_SUBREL_LENGTH = 5; // deg + 1 of inverse correctness subrelation + static constexpr size_t LOOKUP_SUBREL_LENGTH = 5; // deg + 1 of log-deriv lookup subrelation + // Note: Inverse correctness subrelations are actually LENGTH-1; taking advantage would require additional work static constexpr std::array SUBRELATION_PARTIAL_LENGTHS{ - LENGTH, // inverse polynomial correctness subrelation - LENGTH, // log-derivative lookup argument subrelation - LENGTH, // inverse polynomial correctness subrelation - LENGTH, // log-derivative lookup argument subrelation - LENGTH, // inverse polynomial correctness subrelation - LENGTH // log-derivative lookup argument subrelation + INVERSE_SUBREL_LENGTH, // inverse polynomial correctness subrelation (bus_idx 0) + LOOKUP_SUBREL_LENGTH, // log-derivative lookup argument subrelation (bus_idx 0) + INVERSE_SUBREL_LENGTH, // inverse polynomial correctness subrelation (bus_idx 1) + LOOKUP_SUBREL_LENGTH, // log-derivative lookup argument subrelation (bus_idx 1) + INVERSE_SUBREL_LENGTH, // inverse polynomial correctness subrelation (bus_idx 2) + LOOKUP_SUBREL_LENGTH // log-derivative lookup argument subrelation (bus_idx 2) }; + static constexpr size_t INVERSE_SUBREL_WITNESS_DEGREE = 4; // witness degree of inverse correctness subrelation + static constexpr size_t LOOKUP_SUBREL_WITNESS_DEGREE = 4; // witness degree of log-deriv lookup subrelation + /** * @brief For ZK-Flavors: Upper bound on the degrees of subrelations considered as polynomials only in witness -polynomials, - * i.e. all selectors and public polynomials are treated as constants. The subrelation witness degree does not - * exceed the subrelation partial degree, which is given by LENGTH - 1 in this case. + * polynomials, i.e. all selectors and public polynomials are treated as constants. The subrelation witness degree + * does not exceed the subrelation partial degree, which is given by LENGTH - 1 in this case. */ static constexpr std::array SUBRELATION_WITNESS_DEGREES{ - LENGTH - 1, // inverse polynomial correctness subrelation - LENGTH - 1, // log-derivative lookup argument subrelation - LENGTH - 1, // inverse polynomial correctness subrelation - LENGTH - 1, // log-derivative lookup argument subrelation - LENGTH - 1, // inverse polynomial correctness subrelation - LENGTH - 1 // log-derivative lookup argument subrelation + INVERSE_SUBREL_WITNESS_DEGREE, // inverse polynomial correctness subrelation (bus_idx 0) + LOOKUP_SUBREL_WITNESS_DEGREE, // log-derivative lookup argument subrelation (bus_idx 0) + INVERSE_SUBREL_WITNESS_DEGREE, // inverse polynomial correctness subrelation (bus_idx 1) + LOOKUP_SUBREL_WITNESS_DEGREE, // log-derivative lookup argument subrelation (bus_idx 1) + INVERSE_SUBREL_WITNESS_DEGREE, // inverse polynomial correctness subrelation (bus_idx 2) + LOOKUP_SUBREL_WITNESS_DEGREE // log-derivative lookup argument subrelation (bus_idx 2) }; + static constexpr bool INVERSE_SUBREL_LIN_INDEPENDENT = true; // to be satisfied independently at each row + static constexpr bool LOOKUP_SUBREL_LIN_INDEPENDENT = false; // to be satisfied as a sum across all rows + // The lookup subrelations are "linearly dependent" in the sense that they establish the value of a sum across the // entire execution trace rather than a per-row identity. - static constexpr std::array SUBRELATION_LINEARLY_INDEPENDENT = { true, false, true, - false, true, false }; + static constexpr std::array SUBRELATION_LINEARLY_INDEPENDENT = { + INVERSE_SUBREL_LIN_INDEPENDENT, LOOKUP_SUBREL_LIN_INDEPENDENT, INVERSE_SUBREL_LIN_INDEPENDENT, + LOOKUP_SUBREL_LIN_INDEPENDENT, INVERSE_SUBREL_LIN_INDEPENDENT, LOOKUP_SUBREL_LIN_INDEPENDENT + }; template inline static bool skip([[maybe_unused]] const AllEntities& in) { // Ensure the input does not contain a read gate or data that is being read - return in.q_busread.is_zero() && in.calldata_read_counts.is_zero() && in.calldata_2_read_counts.is_zero() && - in.return_data_read_counts.is_zero(); + return in.q_busread.is_zero() && in.calldata_read_counts.is_zero() && + in.secondary_calldata_read_counts.is_zero() && in.return_data_read_counts.is_zero(); } // Interface for easy access of databus components by column (bus_idx) @@ -99,14 +109,14 @@ polynomials, static auto& read_tags(const AllEntities& in) { return in.calldata_read_tags; } }; - // Specialization for calldata_2 (bus_idx = 1) + // Specialization for secondary_calldata (bus_idx = 1) template struct BusData { - static auto& values(const AllEntities& in) { return in.calldata_2; } + static auto& values(const AllEntities& in) { return in.secondary_calldata; } static auto& selector(const AllEntities& in) { return in.q_r; } - static auto& inverses(AllEntities& in) { return in.calldata_2_inverses; } - static auto& inverses(const AllEntities& in) { return in.calldata_2_inverses; } // const version - static auto& read_counts(const AllEntities& in) { return in.calldata_2_read_counts; } - static auto& read_tags(const AllEntities& in) { return in.calldata_2_read_tags; } + static auto& inverses(AllEntities& in) { return in.secondary_calldata_inverses; } + static auto& inverses(const AllEntities& in) { return in.secondary_calldata_inverses; } // const version + static auto& read_counts(const AllEntities& in) { return in.secondary_calldata_read_counts; } + static auto& read_tags(const AllEntities& in) { return in.secondary_calldata_read_tags; } }; // Specialization for return data (bus_idx = 2) @@ -231,9 +241,9 @@ polynomials, is_read = q_busread == 1 && polynomials.q_l[i] == 1; nonzero_read_count = polynomials.calldata_read_counts[i] > 0; } - if constexpr (bus_idx == 1) { // calldata_2 + if constexpr (bus_idx == 1) { // secondary_calldata is_read = q_busread == 1 && polynomials.q_r[i] == 1; - nonzero_read_count = polynomials.calldata_2_read_counts[i] > 0; + nonzero_read_count = polynomials.secondary_calldata_read_counts[i] > 0; } if constexpr (bus_idx == 2) { // return data is_read = q_busread == 1 && polynomials.q_o[i] == 1; diff --git a/barretenberg/cpp/src/barretenberg/stdlib/primitives/databus/databus.hpp b/barretenberg/cpp/src/barretenberg/stdlib/primitives/databus/databus.hpp index af87db625b4..1911338df41 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/primitives/databus/databus.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/primitives/databus/databus.hpp @@ -51,7 +51,7 @@ template class databus { public: // The columns of the DataBus bus_vector calldata{ BusId::CALLDATA }; - bus_vector calldata_2{ BusId::CALLDATA_2 }; + bus_vector secondary_calldata{ BusId::SECONDARY_CALLDATA }; bus_vector return_data{ BusId::RETURNDATA }; }; } // namespace bb::stdlib \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/databus.hpp b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/databus.hpp index 511dc5ed5b4..0c74e96090a 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/databus.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/databus.hpp @@ -55,6 +55,6 @@ struct BusVector { * */ using DataBus = std::array; -enum class BusId { CALLDATA, CALLDATA_2, RETURNDATA }; +enum class BusId { CALLDATA, SECONDARY_CALLDATA, RETURNDATA }; } // namespace bb diff --git a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/mega_circuit_builder.cpp b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/mega_circuit_builder.cpp index 979be1c56ae..7a827815fbc 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/mega_circuit_builder.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/mega_circuit_builder.cpp @@ -40,11 +40,11 @@ template void MegaCircuitBuilder_::add_gates_to_ensure_all_pol auto read_idx = this->add_variable(raw_read_idx); read_calldata(read_idx); - // Create an arbitrary calldata_2 read gate - add_public_calldata_2(this->add_variable(25)); // ensure there is at least one entry in calldata_2 - raw_read_idx = static_cast(get_calldata_2().size()) - 1; // read data that was just added + // Create an arbitrary secondary_calldata read gate + add_public_secondary_calldata(this->add_variable(25)); // ensure there is at least one entry in secondary_calldata + raw_read_idx = static_cast(get_secondary_calldata().size()) - 1; // read data that was just added read_idx = this->add_variable(raw_read_idx); - read_calldata_2(read_idx); + read_secondary_calldata(read_idx); // Create an arbitrary return data read gate add_public_return_data(this->add_variable(17)); // ensure there is at least one entry in return data @@ -247,7 +247,7 @@ template void MegaCircuitBuilder_::apply_databus_selectors(con block.q_3().emplace_back(0); break; } - case BusId::CALLDATA_2: { + case BusId::SECONDARY_CALLDATA: { block.q_1().emplace_back(0); block.q_2().emplace_back(1); block.q_3().emplace_back(0); diff --git a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/mega_circuit_builder.hpp b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/mega_circuit_builder.hpp index 410e6dd8fc4..ac7c0ad4ba5 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/mega_circuit_builder.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/mega_circuit_builder.hpp @@ -172,10 +172,14 @@ template class MegaCircuitBuilder_ : public UltraCircuitBuilder_ class MegaCircuitBuilder_ : public UltraCircuitBuilder_ class MegaCircuitBuilder_ : public UltraCircuitBuilder_(BusId::CALLDATA)]; } - const BusVector& get_calldata_2() { return databus[static_cast(BusId::CALLDATA_2)]; } + const BusVector& get_secondary_calldata() { return databus[static_cast(BusId::SECONDARY_CALLDATA)]; } const BusVector& get_return_data() { return databus[static_cast(BusId::RETURNDATA)]; } void create_poseidon2_external_gate(const poseidon2_external_gate_& in); diff --git a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/mega_flavor.hpp b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/mega_flavor.hpp index a44340ce5a9..3bad9801e18 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/mega_flavor.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/mega_flavor.hpp @@ -176,26 +176,26 @@ class MegaFlavor { template class DerivedEntities { public: DEFINE_FLAVOR_MEMBERS(DataType, - z_perm, // column 4 - lookup_inverses, // column 5 - lookup_read_counts, // column 6 - lookup_read_tags, // column 7 - ecc_op_wire_1, // column 8 - ecc_op_wire_2, // column 9 - ecc_op_wire_3, // column 10 - ecc_op_wire_4, // column 11 - calldata, // column 12 - calldata_read_counts, // column 13 - calldata_read_tags, // column 14 - calldata_inverses, // column 15 - calldata_2, // column 16 - calldata_2_read_counts, // column 17 - calldata_2_read_tags, // column 18 - calldata_2_inverses, // column 19 - return_data, // column 20 - return_data_read_counts, // column 21 - return_data_read_tags, // column 22 - return_data_inverses); // column 23 + z_perm, // column 4 + lookup_inverses, // column 5 + lookup_read_counts, // column 6 + lookup_read_tags, // column 7 + ecc_op_wire_1, // column 8 + ecc_op_wire_2, // column 9 + ecc_op_wire_3, // column 10 + ecc_op_wire_4, // column 11 + calldata, // column 12 + calldata_read_counts, // column 13 + calldata_read_tags, // column 14 + calldata_inverses, // column 15 + secondary_calldata, // column 16 + secondary_calldata_read_counts, // column 17 + secondary_calldata_read_tags, // column 18 + secondary_calldata_inverses, // column 19 + return_data, // column 20 + return_data_read_counts, // column 21 + return_data_read_tags, // column 22 + return_data_inverses); // column 23 }; /** @@ -215,16 +215,18 @@ class MegaFlavor { } auto get_databus_entities() // Excludes the derived inverse polynomials { - return RefArray{ this->calldata, this->calldata_read_counts, this->calldata_read_tags, - this->calldata_2, this->calldata_2_read_counts, this->calldata_2_read_tags, - this->return_data, this->return_data_read_counts, this->return_data_read_tags }; + return RefArray{ + this->calldata, this->calldata_read_counts, this->calldata_read_tags, + this->secondary_calldata, this->secondary_calldata_read_counts, this->secondary_calldata_read_tags, + this->return_data, this->return_data_read_counts, this->return_data_read_tags + }; } auto get_databus_inverses() { return RefArray{ this->calldata_inverses, - this->calldata_2_inverses, + this->secondary_calldata_inverses, this->return_data_inverses, }; } @@ -245,10 +247,10 @@ class MegaFlavor { this->calldata_read_counts, this->calldata_read_tags, this->calldata_inverses, - this->calldata_2, - this->calldata_2_read_counts, - this->calldata_2_read_tags, - this->calldata_2_inverses, + this->secondary_calldata, + this->secondary_calldata_read_counts, + this->secondary_calldata_read_tags, + this->secondary_calldata_inverses, this->return_data, this->return_data_read_counts, this->return_data_read_tags, @@ -421,7 +423,7 @@ class MegaFlavor { DatabusLookupRelation::compute_logderivative_inverse( this->polynomials, relation_parameters, this->circuit_size); - // Compute inverses for calldata_2 reads + // Compute inverses for secondary_calldata reads DatabusLookupRelation::compute_logderivative_inverse( this->polynomials, relation_parameters, this->circuit_size); @@ -651,10 +653,10 @@ class MegaFlavor { calldata_read_counts = "CALLDATA_READ_COUNTS"; calldata_read_tags = "CALLDATA_READ_TAGS"; calldata_inverses = "CALLDATA_INVERSES"; - calldata_2 = "CALLDATA_2"; - calldata_2_read_counts = "CALLDATA_2_READ_COUNTS"; - calldata_2_read_tags = "CALLDATA_2_READ_TAGS"; - calldata_2_inverses = "CALLDATA_2_INVERSES"; + secondary_calldata = "SECONDARY_CALLDATA"; + secondary_calldata_read_counts = "SECONDARY_CALLDATA_READ_COUNTS"; + secondary_calldata_read_tags = "SECONDARY_CALLDATA_READ_TAGS"; + secondary_calldata_inverses = "SECONDARY_CALLDATA_INVERSES"; return_data = "RETURN_DATA"; return_data_read_counts = "RETURN_DATA_READ_COUNTS"; return_data_read_tags = "RETURN_DATA_READ_TAGS"; @@ -750,10 +752,10 @@ class MegaFlavor { this->calldata_read_counts = commitments.calldata_read_counts; this->calldata_read_tags = commitments.calldata_read_tags; this->calldata_inverses = commitments.calldata_inverses; - this->calldata_2 = commitments.calldata_2; - this->calldata_2_read_counts = commitments.calldata_2_read_counts; - this->calldata_2_read_tags = commitments.calldata_2_read_tags; - this->calldata_2_inverses = commitments.calldata_2_inverses; + this->secondary_calldata = commitments.secondary_calldata; + this->secondary_calldata_read_counts = commitments.secondary_calldata_read_counts; + this->secondary_calldata_read_tags = commitments.secondary_calldata_read_tags; + this->secondary_calldata_inverses = commitments.secondary_calldata_inverses; this->return_data = commitments.return_data; this->return_data_read_counts = commitments.return_data_read_counts; this->return_data_read_tags = commitments.return_data_read_tags; @@ -786,10 +788,10 @@ class MegaFlavor { Commitment calldata_read_counts_comm; Commitment calldata_read_tags_comm; Commitment calldata_inverses_comm; - Commitment calldata_2_comm; - Commitment calldata_2_read_counts_comm; - Commitment calldata_2_read_tags_comm; - Commitment calldata_2_inverses_comm; + Commitment secondary_calldata_comm; + Commitment secondary_calldata_read_counts_comm; + Commitment secondary_calldata_read_tags_comm; + Commitment secondary_calldata_inverses_comm; Commitment return_data_comm; Commitment return_data_read_counts_comm; Commitment return_data_read_tags_comm; @@ -848,10 +850,10 @@ class MegaFlavor { calldata_read_counts_comm = deserialize_from_buffer(proof_data, num_frs_read); calldata_read_tags_comm = deserialize_from_buffer(proof_data, num_frs_read); calldata_inverses_comm = deserialize_from_buffer(proof_data, num_frs_read); - calldata_2_comm = deserialize_from_buffer(proof_data, num_frs_read); - calldata_2_read_counts_comm = deserialize_from_buffer(proof_data, num_frs_read); - calldata_2_read_tags_comm = deserialize_from_buffer(proof_data, num_frs_read); - calldata_2_inverses_comm = deserialize_from_buffer(proof_data, num_frs_read); + secondary_calldata_comm = deserialize_from_buffer(proof_data, num_frs_read); + secondary_calldata_read_counts_comm = deserialize_from_buffer(proof_data, num_frs_read); + secondary_calldata_read_tags_comm = deserialize_from_buffer(proof_data, num_frs_read); + secondary_calldata_inverses_comm = deserialize_from_buffer(proof_data, num_frs_read); return_data_comm = deserialize_from_buffer(proof_data, num_frs_read); return_data_read_counts_comm = deserialize_from_buffer(proof_data, num_frs_read); return_data_read_tags_comm = deserialize_from_buffer(proof_data, num_frs_read); @@ -895,10 +897,10 @@ class MegaFlavor { serialize_to_buffer(calldata_read_counts_comm, proof_data); serialize_to_buffer(calldata_read_tags_comm, proof_data); serialize_to_buffer(calldata_inverses_comm, proof_data); - serialize_to_buffer(calldata_2_comm, proof_data); - serialize_to_buffer(calldata_2_read_counts_comm, proof_data); - serialize_to_buffer(calldata_2_read_tags_comm, proof_data); - serialize_to_buffer(calldata_2_inverses_comm, proof_data); + serialize_to_buffer(secondary_calldata_comm, proof_data); + serialize_to_buffer(secondary_calldata_read_counts_comm, proof_data); + serialize_to_buffer(secondary_calldata_read_tags_comm, proof_data); + serialize_to_buffer(secondary_calldata_inverses_comm, proof_data); serialize_to_buffer(return_data_comm, proof_data); serialize_to_buffer(return_data_read_counts_comm, proof_data); serialize_to_buffer(return_data_read_tags_comm, proof_data); diff --git a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp index 27395eb505e..97ea56dde77 100644 --- a/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp +++ b/barretenberg/cpp/src/barretenberg/sumcheck/instance/prover_instance.cpp @@ -44,15 +44,15 @@ void ProverInstance_::construct_databus_polynomials(Circuit& circuit) auto& public_calldata = proving_key.polynomials.calldata; auto& calldata_read_counts = proving_key.polynomials.calldata_read_counts; auto& calldata_read_tags = proving_key.polynomials.calldata_read_tags; - auto& public_calldata_2 = proving_key.polynomials.calldata_2; - auto& calldata_2_read_counts = proving_key.polynomials.calldata_2_read_counts; - auto& calldata_2_read_tags = proving_key.polynomials.calldata_2_read_tags; + auto& public_secondary_calldata = proving_key.polynomials.secondary_calldata; + auto& secondary_calldata_read_counts = proving_key.polynomials.secondary_calldata_read_counts; + auto& secondary_calldata_read_tags = proving_key.polynomials.secondary_calldata_read_tags; auto& public_return_data = proving_key.polynomials.return_data; auto& return_data_read_counts = proving_key.polynomials.return_data_read_counts; auto& return_data_read_tags = proving_key.polynomials.return_data_read_tags; auto calldata = circuit.get_calldata(); - auto calldata_2 = circuit.get_calldata_2(); + auto secondary_calldata = circuit.get_secondary_calldata(); auto return_data = circuit.get_return_data(); // Note: We do not utilize a zero row for databus columns @@ -61,10 +61,10 @@ void ProverInstance_::construct_databus_polynomials(Circuit& circuit) calldata_read_counts[idx] = calldata.get_read_count(idx); // read counts calldata_read_tags[idx] = calldata_read_counts[idx] > 0 ? 1 : 0; // has row been read or not } - for (size_t idx = 0; idx < calldata_2.size(); ++idx) { - public_calldata_2[idx] = circuit.get_variable(calldata_2[idx]); // calldata_2 values - calldata_2_read_counts[idx] = calldata_2.get_read_count(idx); // read counts - calldata_2_read_tags[idx] = calldata_2_read_counts[idx] > 0 ? 1 : 0; // has row been read or not + for (size_t idx = 0; idx < secondary_calldata.size(); ++idx) { + public_secondary_calldata[idx] = circuit.get_variable(secondary_calldata[idx]); // secondary_calldata values + secondary_calldata_read_counts[idx] = secondary_calldata.get_read_count(idx); // read counts + secondary_calldata_read_tags[idx] = secondary_calldata_read_counts[idx] > 0 ? 1 : 0; // has row been read or not } for (size_t idx = 0; idx < return_data.size(); ++idx) { public_return_data[idx] = circuit.get_variable(return_data[idx]); // return data values diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/databus.test.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/databus.test.cpp index 507a531cb9e..6a33e0f7cf6 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/databus.test.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/databus.test.cpp @@ -88,11 +88,15 @@ class DataBusTests : public ::testing::Test { return construct_circuit_with_databus_reads(builder, add_method, read_method); } - static Builder construct_circuit_with_calldata_2_reads(Builder& builder) + static Builder construct_circuit_with_secondary_calldata_reads(Builder& builder) { - // Define interfaces for the add and read methods for databus calldata_2 - auto add_method = [](Builder& builder, uint32_t witness_idx) { builder.add_public_calldata_2(witness_idx); }; - auto read_method = [](Builder& builder, uint32_t witness_idx) { return builder.read_calldata_2(witness_idx); }; + // Define interfaces for the add and read methods for databus secondary_calldata + auto add_method = [](Builder& builder, uint32_t witness_idx) { + builder.add_public_secondary_calldata(witness_idx); + }; + auto read_method = [](Builder& builder, uint32_t witness_idx) { + return builder.read_secondary_calldata(witness_idx); + }; return construct_circuit_with_databus_reads(builder, add_method, read_method); } @@ -120,13 +124,13 @@ TEST_F(DataBusTests, CallDataRead) } /** - * @brief Test proof construction/verification for a circuit with calldata_2 lookup gates + * @brief Test proof construction/verification for a circuit with secondary_calldata lookup gates * */ TEST_F(DataBusTests, CallData2Read) { Builder builder = construct_test_builder(); - construct_circuit_with_calldata_2_reads(builder); + construct_circuit_with_secondary_calldata_reads(builder); EXPECT_TRUE(construct_and_verify_proof(builder)); } @@ -151,7 +155,7 @@ TEST_F(DataBusTests, ReadAll) { Builder builder = construct_test_builder(); construct_circuit_with_calldata_reads(builder); - construct_circuit_with_calldata_2_reads(builder); + construct_circuit_with_secondary_calldata_reads(builder); construct_circuit_with_return_data_reads(builder); EXPECT_TRUE(construct_and_verify_proof(builder)); diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/mega_transcript.test.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/mega_transcript.test.cpp index 26a140a3441..21de98a3584 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/mega_transcript.test.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/mega_transcript.test.cpp @@ -61,9 +61,9 @@ class MegaTranscriptTests : public ::testing::Test { manifest_expected.add_entry(round, "CALLDATA", frs_per_G); manifest_expected.add_entry(round, "CALLDATA_READ_COUNTS", frs_per_G); manifest_expected.add_entry(round, "CALLDATA_READ_TAGS", frs_per_G); - manifest_expected.add_entry(round, "CALLDATA_2", frs_per_G); - manifest_expected.add_entry(round, "CALLDATA_2_READ_COUNTS", frs_per_G); - manifest_expected.add_entry(round, "CALLDATA_2_READ_TAGS", frs_per_G); + manifest_expected.add_entry(round, "SECONDARY_CALLDATA", frs_per_G); + manifest_expected.add_entry(round, "SECONDARY_CALLDATA_READ_COUNTS", frs_per_G); + manifest_expected.add_entry(round, "SECONDARY_CALLDATA_READ_TAGS", frs_per_G); manifest_expected.add_entry(round, "RETURN_DATA", frs_per_G); manifest_expected.add_entry(round, "RETURN_DATA_READ_COUNTS", frs_per_G); manifest_expected.add_entry(round, "RETURN_DATA_READ_TAGS", frs_per_G); @@ -78,7 +78,7 @@ class MegaTranscriptTests : public ::testing::Test { round++; manifest_expected.add_entry(round, "LOOKUP_INVERSES", frs_per_G); manifest_expected.add_entry(round, "CALLDATA_INVERSES", frs_per_G); - manifest_expected.add_entry(round, "CALLDATA_2_INVERSES", frs_per_G); + manifest_expected.add_entry(round, "SECONDARY_CALLDATA_INVERSES", frs_per_G); manifest_expected.add_entry(round, "RETURN_DATA_INVERSES", frs_per_G); manifest_expected.add_entry(round, "Z_PERM", frs_per_G); diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/relation_correctness.test.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/relation_correctness.test.cpp index 56d9096425f..21eb099c273 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/relation_correctness.test.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/relation_correctness.test.cpp @@ -344,9 +344,9 @@ TEST_F(UltraRelationCorrectnessTests, Mega) ensure_non_zero(proving_key.polynomials.calldata); ensure_non_zero(proving_key.polynomials.calldata_read_counts); ensure_non_zero(proving_key.polynomials.calldata_inverses); - ensure_non_zero(proving_key.polynomials.calldata_2); - ensure_non_zero(proving_key.polynomials.calldata_2_read_counts); - ensure_non_zero(proving_key.polynomials.calldata_2_inverses); + ensure_non_zero(proving_key.polynomials.secondary_calldata); + ensure_non_zero(proving_key.polynomials.secondary_calldata_read_counts); + ensure_non_zero(proving_key.polynomials.secondary_calldata_inverses); ensure_non_zero(proving_key.polynomials.return_data); ensure_non_zero(proving_key.polynomials.return_data_read_counts); ensure_non_zero(proving_key.polynomials.return_data_inverses);