From 55a93bc1086926a489ca01a929df4f8b6ad68405 Mon Sep 17 00:00:00 2001 From: lucasxia01 Date: Fri, 9 Feb 2024 21:53:06 +0000 Subject: [PATCH 1/7] refactored calc_num_bn254_frs ! :) --- .../src/barretenberg/ecc/curves/bn254/fq.hpp | 3 + .../src/barretenberg/ecc/curves/bn254/fr.hpp | 3 + .../src/barretenberg/ecc/curves/bn254/g1.hpp | 3 + .../ecc/fields/field_conversion.hpp | 89 +++++++++++-------- .../ecc/fields/field_declarations.hpp | 3 + .../ecc/groups/affine_element.hpp | 5 +- .../barretenberg/polynomials/univariate.hpp | 7 ++ 7 files changed, 75 insertions(+), 38 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/ecc/curves/bn254/fq.hpp b/barretenberg/cpp/src/barretenberg/ecc/curves/bn254/fq.hpp index 782702d5a52d..ffda71bbd47f 100644 --- a/barretenberg/cpp/src/barretenberg/ecc/curves/bn254/fq.hpp +++ b/barretenberg/cpp/src/barretenberg/ecc/curves/bn254/fq.hpp @@ -60,6 +60,9 @@ class Bn254FqParams { // used in msgpack schema serialization static constexpr char schema_name[] = "fq"; static constexpr bool has_high_2adicity = false; + + // The modulus is larger than BN254 scalar field modulus, so it maps to two BN254 scalars + static constexpr size_t NUM_BN254_SCALARS = 2; }; using fq = field; diff --git a/barretenberg/cpp/src/barretenberg/ecc/curves/bn254/fr.hpp b/barretenberg/cpp/src/barretenberg/ecc/curves/bn254/fr.hpp index bfa55e67e2e5..cf43e95d5690 100644 --- a/barretenberg/cpp/src/barretenberg/ecc/curves/bn254/fr.hpp +++ b/barretenberg/cpp/src/barretenberg/ecc/curves/bn254/fr.hpp @@ -66,6 +66,9 @@ class Bn254FrParams { // used in msgpack schema serialization static constexpr char schema_name[] = "fr"; static constexpr bool has_high_2adicity = true; + + // This is a BN254 scalar, so it represents one BN254 scalar + static constexpr size_t NUM_BN254_SCALARS = 1; }; using fr = field; diff --git a/barretenberg/cpp/src/barretenberg/ecc/curves/bn254/g1.hpp b/barretenberg/cpp/src/barretenberg/ecc/curves/bn254/g1.hpp index ef5240fad945..9df9ce902862 100644 --- a/barretenberg/cpp/src/barretenberg/ecc/curves/bn254/g1.hpp +++ b/barretenberg/cpp/src/barretenberg/ecc/curves/bn254/g1.hpp @@ -14,6 +14,9 @@ struct Bn254G1Params { static constexpr fq one_y{ 0xa6ba871b8b1e1b3aUL, 0x14f1d651eb8e167bUL, 0xccdd46def0f28c58UL, 0x1c14ef83340fbe5eUL }; static constexpr fq a{ 0UL, 0UL, 0UL, 0UL }; static constexpr fq b{ 0x7a17caa950ad28d7UL, 0x1f6ac17ae15521b9UL, 0x334bea4e696bd284UL, 0x2a1f6744ce179d8eUL }; + + // This is , so it represents one BN254 scalar + static constexpr size_t NUM_BN254_SCALARS = 1; }; using g1 = group; diff --git a/barretenberg/cpp/src/barretenberg/ecc/fields/field_conversion.hpp b/barretenberg/cpp/src/barretenberg/ecc/fields/field_conversion.hpp index a3abc63673d9..9b4dac11e626 100644 --- a/barretenberg/cpp/src/barretenberg/ecc/fields/field_conversion.hpp +++ b/barretenberg/cpp/src/barretenberg/ecc/fields/field_conversion.hpp @@ -4,6 +4,7 @@ #include "barretenberg/ecc/curves/bn254/fr.hpp" #include "barretenberg/ecc/curves/grumpkin/grumpkin.hpp" #include "barretenberg/polynomials/univariate.hpp" +#include "barretenberg/proof_system/types/circuit_type.hpp" namespace bb::field_conversion { @@ -15,46 +16,60 @@ namespace bb::field_conversion { * @tparam T * @return constexpr size_t */ -template constexpr size_t calc_num_bn254_frs(); - -constexpr size_t calc_num_bn254_frs(bb::fr* /*unused*/) -{ - return 1; -} - -constexpr size_t calc_num_bn254_frs(grumpkin::fr* /*unused*/) -{ - return 2; -} - -template constexpr size_t calc_num_bn254_frs(T* /*unused*/) -{ - return 1; // meant for integral types that are less than 254 bits -} - -constexpr size_t calc_num_bn254_frs(curve::BN254::AffineElement* /*unused*/) -{ - return 2 * calc_num_bn254_frs(); -} - -constexpr size_t calc_num_bn254_frs(curve::Grumpkin::AffineElement* /*unused*/) -{ - return 2 * calc_num_bn254_frs(); -} - -template constexpr size_t calc_num_bn254_frs(std::array* /*unused*/) -{ - return N * calc_num_bn254_frs(); -} - -template constexpr size_t calc_num_bn254_frs(bb::Univariate* /*unused*/) -{ - return N * calc_num_bn254_frs(); -} +// template constexpr size_t calc_num_bn254_frs(); + +// constexpr size_t calc_num_bn254_frs(bb::fr* /*unused*/) +// { +// return 1; +// } + +// constexpr size_t calc_num_bn254_frs(grumpkin::fr* /*unused*/) +// { +// return 2; +// } + +// template constexpr size_t calc_num_bn254_frs(T* /*unused*/) +// { +// return 1; // meant for integral types that are less than 254 bits +// } + +// constexpr size_t calc_num_bn254_frs(curve::BN254::AffineElement* /*unused*/) +// { +// return 2 * calc_num_bn254_frs(); +// } + +// constexpr size_t calc_num_bn254_frs(curve::Grumpkin::AffineElement* /*unused*/) +// { +// return 2 * calc_num_bn254_frs(); +// } + +// template constexpr size_t calc_num_bn254_frs(std::array* /*unused*/) +// { +// return N * calc_num_bn254_frs(); +// } + +// template constexpr size_t calc_num_bn254_frs(bb::Univariate* /*unused*/) +// { +// return N * calc_num_bn254_frs(); +// } + +// template constexpr size_t calc_num_bn254_frs() +// { +// return calc_num_bn254_frs(static_cast(nullptr)); +// } template constexpr size_t calc_num_bn254_frs() { - return calc_num_bn254_frs(static_cast(nullptr)); + if constexpr (IsAnyOf) { + return 1; + } else if constexpr (IsAnyOf) { + return T::NUM_BN254_SCALARS; + } else if constexpr (IsAnyOf) { + return 2 * calc_num_bn254_frs(); + } else { + // Array or Univariate + return calc_num_bn254_frs() * (std::tuple_size::value); + } } /** diff --git a/barretenberg/cpp/src/barretenberg/ecc/fields/field_declarations.hpp b/barretenberg/cpp/src/barretenberg/ecc/fields/field_declarations.hpp index af92a45ae168..9cd3947d0637 100644 --- a/barretenberg/cpp/src/barretenberg/ecc/fields/field_declarations.hpp +++ b/barretenberg/cpp/src/barretenberg/ecc/fields/field_declarations.hpp @@ -30,6 +30,9 @@ template struct alignas(32) field { using out_buf = uint8_t*; using vec_out_buf = uint8_t**; + // Used for conversion to BN254 scalars + static constexpr size_t NUM_BN254_SCALARS = Params::NUM_BN254_SCALARS; + // We don't initialize data in the default constructor since we'd lose a lot of time on huge array initializations. // Other alternatives have been noted, such as casting to get around constructors where they matter, // however it is felt that sanitizer tools (e.g. MSAN) can detect garbage well, whereas doing diff --git a/barretenberg/cpp/src/barretenberg/ecc/groups/affine_element.hpp b/barretenberg/cpp/src/barretenberg/ecc/groups/affine_element.hpp index 117dab0ff2be..be823c3f176d 100644 --- a/barretenberg/cpp/src/barretenberg/ecc/groups/affine_element.hpp +++ b/barretenberg/cpp/src/barretenberg/ecc/groups/affine_element.hpp @@ -8,8 +8,11 @@ namespace bb::group_elements { template concept SupportsHashToCurve = T::can_hash_to_curve; -template class alignas(64) affine_element { +template class alignas(64) affine_element { public: + using Fq = Fq_; + using Fr = Fr_; + using in_buf = const uint8_t*; using vec_in_buf = const uint8_t*; using out_buf = uint8_t*; diff --git a/barretenberg/cpp/src/barretenberg/polynomials/univariate.hpp b/barretenberg/cpp/src/barretenberg/polynomials/univariate.hpp index 188c0bed3c4b..519379445407 100644 --- a/barretenberg/cpp/src/barretenberg/polynomials/univariate.hpp +++ b/barretenberg/cpp/src/barretenberg/polynomials/univariate.hpp @@ -25,6 +25,8 @@ template class Univariate static constexpr size_t LENGTH = domain_end - domain_start; using View = UnivariateView; + using value_type = Fr; // used to get the type of the elements consistently with std::array + // TODO(https://github.com/AztecProtocol/barretenberg/issues/714) Try out std::valarray? std::array evaluations; @@ -497,3 +499,8 @@ template std::array array_to_array }; } // namespace bb + +namespace std { +template struct tuple_size> : std::integral_constant {}; + +} // namespace std \ No newline at end of file From fe1d9e846205c286c32cf4228afdce597846cd35 Mon Sep 17 00:00:00 2001 From: lucasxia01 Date: Fri, 9 Feb 2024 22:27:55 +0000 Subject: [PATCH 2/7] refactored convert_from_bn254_frs! --- .../ecc/fields/field_conversion.cpp | 2 +- .../ecc/fields/field_conversion.hpp | 144 +++++++++++------- .../barretenberg/polynomials/univariate.hpp | 6 + 3 files changed, 96 insertions(+), 56 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/ecc/fields/field_conversion.cpp b/barretenberg/cpp/src/barretenberg/ecc/fields/field_conversion.cpp index 0d09d6b57526..69e67c171998 100644 --- a/barretenberg/cpp/src/barretenberg/ecc/fields/field_conversion.cpp +++ b/barretenberg/cpp/src/barretenberg/ecc/fields/field_conversion.cpp @@ -32,7 +32,7 @@ bool convert_from_bn254_frs(std::span fr_vec, bool* /*unused*/) * @param high_bits_in * @return grumpkin::fr */ -grumpkin::fr convert_from_bn254_frs(std::span fr_vec, grumpkin::fr* /*unused*/) +grumpkin::fr convert_grumpkin_fr_from_bn254_frs(std::span fr_vec) { // Combines the two elements into one uint256_t, and then convert that to a grumpkin::fr ASSERT(uint256_t(fr_vec[0]) < (uint256_t(1) << (NUM_LIMB_BITS * 2))); // lower 136 bits diff --git a/barretenberg/cpp/src/barretenberg/ecc/fields/field_conversion.hpp b/barretenberg/cpp/src/barretenberg/ecc/fields/field_conversion.hpp index 9b4dac11e626..38b69c158e14 100644 --- a/barretenberg/cpp/src/barretenberg/ecc/fields/field_conversion.hpp +++ b/barretenberg/cpp/src/barretenberg/ecc/fields/field_conversion.hpp @@ -83,74 +83,108 @@ template constexpr size_t calc_num_bn254_frs() * @param fr_vec * @return T */ -template T convert_from_bn254_frs(std::span fr_vec); +// template T convert_from_bn254_frs(std::span fr_vec); -bool convert_from_bn254_frs(std::span fr_vec, bool* /*unused*/); +// bool convert_from_bn254_frs(std::span fr_vec, bool* /*unused*/); -template inline T convert_from_bn254_frs(std::span fr_vec, T* /*unused*/) -{ - ASSERT(fr_vec.size() == 1); - return static_cast(fr_vec[0]); -} +// template inline T convert_from_bn254_frs(std::span fr_vec, T* /*unused*/) +// { +// ASSERT(fr_vec.size() == 1); +// return static_cast(fr_vec[0]); +// } -bb::fr convert_from_bn254_frs(std::span fr_vec, bb::fr* /*unused*/); +// bb::fr convert_from_bn254_frs(std::span fr_vec, bb::fr* /*unused*/); -grumpkin::fr convert_from_bn254_frs(std::span fr_vec, grumpkin::fr* /*unused*/); +// grumpkin::fr convert_from_bn254_frs(std::span fr_vec, grumpkin::fr* /*unused*/); -curve::BN254::AffineElement convert_from_bn254_frs(std::span fr_vec, - curve::BN254::AffineElement* /*unused*/); +// curve::BN254::AffineElement convert_from_bn254_frs(std::span fr_vec, +// curve::BN254::AffineElement* /*unused*/); -curve::Grumpkin::AffineElement convert_from_bn254_frs(std::span fr_vec, - curve::Grumpkin::AffineElement* /*unused*/); +// curve::Grumpkin::AffineElement convert_from_bn254_frs(std::span fr_vec, +// curve::Grumpkin::AffineElement* /*unused*/); -template -inline std::array convert_from_bn254_frs(std::span fr_vec, std::array* /*unused*/) -{ - std::array val; - for (size_t i = 0; i < N; ++i) { - val[i] = fr_vec[i]; - } - return val; -} +// template +// inline std::array convert_from_bn254_frs(std::span fr_vec, std::array* +// /*unused*/) +// { +// std::array val; +// for (size_t i = 0; i < N; ++i) { +// val[i] = fr_vec[i]; +// } +// return val; +// } -template -inline std::array convert_from_bn254_frs(std::span fr_vec, - std::array* /*unused*/) -{ - std::array val; - for (size_t i = 0; i < N; ++i) { - std::vector fr_vec_tmp{ fr_vec[2 * i], - fr_vec[2 * i + 1] }; // each pair of consecutive elements is a grumpkin::fr - val[i] = convert_from_bn254_frs(fr_vec_tmp); - } - return val; -} +// template +// inline std::array convert_from_bn254_frs(std::span fr_vec, +// std::array* /*unused*/) +// { +// std::array val; +// for (size_t i = 0; i < N; ++i) { +// std::vector fr_vec_tmp{ fr_vec[2 * i], +// fr_vec[2 * i + 1] }; // each pair of consecutive elements is a grumpkin::fr +// val[i] = convert_from_bn254_frs(fr_vec_tmp); +// } +// return val; +// } -template -inline Univariate convert_from_bn254_frs(std::span fr_vec, Univariate* /*unused*/) -{ - Univariate val; - for (size_t i = 0; i < N; ++i) { - val.evaluations[i] = fr_vec[i]; - } - return val; -} +// template +// inline Univariate convert_from_bn254_frs(std::span fr_vec, Univariate* +// /*unused*/) +// { +// Univariate val; +// for (size_t i = 0; i < N; ++i) { +// val.evaluations[i] = fr_vec[i]; +// } +// return val; +// } -template -inline Univariate convert_from_bn254_frs(std::span fr_vec, - Univariate* /*unused*/) -{ - Univariate val; - for (size_t i = 0; i < N; ++i) { - std::vector fr_vec_tmp{ fr_vec[2 * i], fr_vec[2 * i + 1] }; - val.evaluations[i] = convert_from_bn254_frs(fr_vec_tmp); - } - return val; -} +// template +// inline Univariate convert_from_bn254_frs(std::span fr_vec, +// Univariate* /*unused*/) +// { +// Univariate val; +// for (size_t i = 0; i < N; ++i) { +// std::vector fr_vec_tmp{ fr_vec[2 * i], fr_vec[2 * i + 1] }; +// val.evaluations[i] = convert_from_bn254_frs(fr_vec_tmp); +// } +// return val; +// } + +// template T convert_from_bn254_frs(std::span fr_vec) +// { +// return convert_from_bn254_frs(fr_vec, static_cast(nullptr)); +// } + +grumpkin::fr convert_grumpkin_fr_from_bn254_frs(std::span fr_vec); template T convert_from_bn254_frs(std::span fr_vec) { - return convert_from_bn254_frs(fr_vec, static_cast(nullptr)); + if constexpr (IsAnyOf) { + ASSERT(fr_vec.size() == 1); + return fr_vec[0] != 0; + } else if constexpr (IsAnyOf) { + ASSERT(fr_vec.size() == 1); + return static_cast(fr_vec[0]); + } else if constexpr (IsAnyOf) { + return convert_grumpkin_fr_from_bn254_frs(fr_vec); + } else if constexpr (IsAnyOf) { + using BaseField = typename T::Fq; + constexpr size_t BaseFieldScalarSize = calc_num_bn254_frs(); + T val; + val.x = convert_from_bn254_frs(fr_vec.subspan(0, BaseFieldScalarSize)); + val.y = convert_from_bn254_frs(fr_vec.subspan(BaseFieldScalarSize, BaseFieldScalarSize)); + return val; + } else { + // Array or Univariate + T val; + constexpr size_t FieldScalarSize = calc_num_bn254_frs(); + size_t i = 0; + for (auto& x : val) { + x = convert_from_bn254_frs(fr_vec.subspan(FieldScalarSize * i, FieldScalarSize)); + ++i; + } + return val; + } } /** diff --git a/barretenberg/cpp/src/barretenberg/polynomials/univariate.hpp b/barretenberg/cpp/src/barretenberg/polynomials/univariate.hpp index 519379445407..c3425488cf87 100644 --- a/barretenberg/cpp/src/barretenberg/polynomials/univariate.hpp +++ b/barretenberg/cpp/src/barretenberg/polynomials/univariate.hpp @@ -339,6 +339,12 @@ template class Univariate result *= full_numerator_value; return result; }; + + // Begin iterator + auto begin() { return evaluations.begin(); } + + // End iterator + auto end() { return evaluations.end(); } }; template From 5e0fc230b410c6e241679f0862717bb4e559d478 Mon Sep 17 00:00:00 2001 From: lucasxia01 Date: Fri, 9 Feb 2024 22:48:34 +0000 Subject: [PATCH 3/7] updated convert_to_bn254_frs as well! magic --- .../ecc/fields/field_conversion.cpp | 57 +---- .../ecc/fields/field_conversion.hpp | 200 +++--------------- .../barretenberg/polynomials/univariate.hpp | 7 +- .../src/barretenberg/sumcheck/sumcheck.hpp | 2 +- 4 files changed, 33 insertions(+), 233 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/ecc/fields/field_conversion.cpp b/barretenberg/cpp/src/barretenberg/ecc/fields/field_conversion.cpp index 69e67c171998..dc37e2f8d36c 100644 --- a/barretenberg/cpp/src/barretenberg/ecc/fields/field_conversion.cpp +++ b/barretenberg/cpp/src/barretenberg/ecc/fields/field_conversion.cpp @@ -7,18 +7,6 @@ namespace bb::field_conversion { static constexpr uint64_t NUM_LIMB_BITS = plonk::NUM_LIMB_BITS_IN_FIELD_SIMULATION; static constexpr uint64_t TOTAL_BITS = 254; -bb::fr convert_from_bn254_frs(std::span fr_vec, bb::fr* /*unused*/) -{ - ASSERT(fr_vec.size() == 1); - return fr_vec[0]; -} - -bool convert_from_bn254_frs(std::span fr_vec, bool* /*unused*/) -{ - ASSERT(fr_vec.size() == 1); - return fr_vec[0] != 0; -} - /** * @brief Converts 2 bb::fr elements to grumpkin::fr * @details First, this function must take in 2 bb::fr elements because the grumpkin::fr field has a larger modulus than @@ -42,25 +30,6 @@ grumpkin::fr convert_grumpkin_fr_from_bn254_frs(std::span fr_vec) return result; } -curve::BN254::AffineElement convert_from_bn254_frs(std::span fr_vec, - curve::BN254::AffineElement* /*unused*/) -{ - curve::BN254::AffineElement val; - val.x = convert_from_bn254_frs(fr_vec.subspan(0, 2)); - val.y = convert_from_bn254_frs(fr_vec.subspan(2, 2)); - return val; -} - -curve::Grumpkin::AffineElement convert_from_bn254_frs(std::span fr_vec, - curve::Grumpkin::AffineElement* /*unused*/) -{ - ASSERT(fr_vec.size() == 2); - curve::Grumpkin::AffineElement val; - val.x = fr_vec[0]; - val.y = fr_vec[1]; - return val; -} - /** * @brief Converts grumpkin::fr to 2 bb::fr elements * @details First, this function must return 2 bb::fr elements because the grumpkin::fr field has a larger modulus than @@ -74,7 +43,7 @@ curve::Grumpkin::AffineElement convert_from_bn254_frs(std::span fr * @param input * @return std::array */ -std::vector convert_to_bn254_frs(const grumpkin::fr& val) +std::vector convert_grumpkin_fr_to_bn254_frs(const grumpkin::fr& val) { // Goal is to slice up the 64 bit limbs of grumpkin::fr/uint256_t to mirror the 68 bit limbs of bigfield // We accomplish this by dividing the grumpkin::fr's value into two 68*2=136 bit pieces. @@ -89,30 +58,6 @@ std::vector convert_to_bn254_frs(const grumpkin::fr& val) return result; } -std::vector convert_to_bn254_frs(const bb::fr& val) -{ - std::vector fr_vec{ val }; - return fr_vec; -} - -std::vector convert_to_bn254_frs(const curve::BN254::AffineElement& val) -{ - auto fr_vec_x = convert_to_bn254_frs(val.x); - auto fr_vec_y = convert_to_bn254_frs(val.y); - std::vector fr_vec(fr_vec_x.begin(), fr_vec_x.end()); - fr_vec.insert(fr_vec.end(), fr_vec_y.begin(), fr_vec_y.end()); - return fr_vec; -} - -std::vector convert_to_bn254_frs(const curve::Grumpkin::AffineElement& val) -{ - auto fr_vec_x = convert_to_bn254_frs(val.x); - auto fr_vec_y = convert_to_bn254_frs(val.y); - std::vector fr_vec(fr_vec_x.begin(), fr_vec_x.end()); - fr_vec.insert(fr_vec.end(), fr_vec_y.begin(), fr_vec_y.end()); - return fr_vec; -} - grumpkin::fr convert_to_grumpkin_fr(const bb::fr& f) { const uint64_t NUM_BITS_IN_TWO_LIMBS = 2 * NUM_LIMB_BITS; // the number of bits in 2 bigfield limbs which is 136 diff --git a/barretenberg/cpp/src/barretenberg/ecc/fields/field_conversion.hpp b/barretenberg/cpp/src/barretenberg/ecc/fields/field_conversion.hpp index 38b69c158e14..524952e4c48a 100644 --- a/barretenberg/cpp/src/barretenberg/ecc/fields/field_conversion.hpp +++ b/barretenberg/cpp/src/barretenberg/ecc/fields/field_conversion.hpp @@ -16,48 +16,6 @@ namespace bb::field_conversion { * @tparam T * @return constexpr size_t */ -// template constexpr size_t calc_num_bn254_frs(); - -// constexpr size_t calc_num_bn254_frs(bb::fr* /*unused*/) -// { -// return 1; -// } - -// constexpr size_t calc_num_bn254_frs(grumpkin::fr* /*unused*/) -// { -// return 2; -// } - -// template constexpr size_t calc_num_bn254_frs(T* /*unused*/) -// { -// return 1; // meant for integral types that are less than 254 bits -// } - -// constexpr size_t calc_num_bn254_frs(curve::BN254::AffineElement* /*unused*/) -// { -// return 2 * calc_num_bn254_frs(); -// } - -// constexpr size_t calc_num_bn254_frs(curve::Grumpkin::AffineElement* /*unused*/) -// { -// return 2 * calc_num_bn254_frs(); -// } - -// template constexpr size_t calc_num_bn254_frs(std::array* /*unused*/) -// { -// return N * calc_num_bn254_frs(); -// } - -// template constexpr size_t calc_num_bn254_frs(bb::Univariate* /*unused*/) -// { -// return N * calc_num_bn254_frs(); -// } - -// template constexpr size_t calc_num_bn254_frs() -// { -// return calc_num_bn254_frs(static_cast(nullptr)); -// } - template constexpr size_t calc_num_bn254_frs() { if constexpr (IsAnyOf) { @@ -72,6 +30,8 @@ template constexpr size_t calc_num_bn254_frs() } } +grumpkin::fr convert_grumpkin_fr_from_bn254_frs(std::span fr_vec); + /** * @brief Conversions from vector of bb::fr elements to transcript types. * @details We want to support the following types: bool, size_t, uint32_t, uint64_t, bb::fr, grumpkin::fr, @@ -83,80 +43,6 @@ template constexpr size_t calc_num_bn254_frs() * @param fr_vec * @return T */ -// template T convert_from_bn254_frs(std::span fr_vec); - -// bool convert_from_bn254_frs(std::span fr_vec, bool* /*unused*/); - -// template inline T convert_from_bn254_frs(std::span fr_vec, T* /*unused*/) -// { -// ASSERT(fr_vec.size() == 1); -// return static_cast(fr_vec[0]); -// } - -// bb::fr convert_from_bn254_frs(std::span fr_vec, bb::fr* /*unused*/); - -// grumpkin::fr convert_from_bn254_frs(std::span fr_vec, grumpkin::fr* /*unused*/); - -// curve::BN254::AffineElement convert_from_bn254_frs(std::span fr_vec, -// curve::BN254::AffineElement* /*unused*/); - -// curve::Grumpkin::AffineElement convert_from_bn254_frs(std::span fr_vec, -// curve::Grumpkin::AffineElement* /*unused*/); - -// template -// inline std::array convert_from_bn254_frs(std::span fr_vec, std::array* -// /*unused*/) -// { -// std::array val; -// for (size_t i = 0; i < N; ++i) { -// val[i] = fr_vec[i]; -// } -// return val; -// } - -// template -// inline std::array convert_from_bn254_frs(std::span fr_vec, -// std::array* /*unused*/) -// { -// std::array val; -// for (size_t i = 0; i < N; ++i) { -// std::vector fr_vec_tmp{ fr_vec[2 * i], -// fr_vec[2 * i + 1] }; // each pair of consecutive elements is a grumpkin::fr -// val[i] = convert_from_bn254_frs(fr_vec_tmp); -// } -// return val; -// } - -// template -// inline Univariate convert_from_bn254_frs(std::span fr_vec, Univariate* -// /*unused*/) -// { -// Univariate val; -// for (size_t i = 0; i < N; ++i) { -// val.evaluations[i] = fr_vec[i]; -// } -// return val; -// } - -// template -// inline Univariate convert_from_bn254_frs(std::span fr_vec, -// Univariate* /*unused*/) -// { -// Univariate val; -// for (size_t i = 0; i < N; ++i) { -// std::vector fr_vec_tmp{ fr_vec[2 * i], fr_vec[2 * i + 1] }; -// val.evaluations[i] = convert_from_bn254_frs(fr_vec_tmp); -// } -// return val; -// } - -// template T convert_from_bn254_frs(std::span fr_vec) -// { -// return convert_from_bn254_frs(fr_vec, static_cast(nullptr)); -// } - -grumpkin::fr convert_grumpkin_fr_from_bn254_frs(std::span fr_vec); - template T convert_from_bn254_frs(std::span fr_vec) { if constexpr (IsAnyOf) { @@ -166,10 +52,12 @@ template T convert_from_bn254_frs(std::span fr_vec) ASSERT(fr_vec.size() == 1); return static_cast(fr_vec[0]); } else if constexpr (IsAnyOf) { + ASSERT(fr_vec.size() == 2); return convert_grumpkin_fr_from_bn254_frs(fr_vec); } else if constexpr (IsAnyOf) { using BaseField = typename T::Fq; constexpr size_t BaseFieldScalarSize = calc_num_bn254_frs(); + ASSERT(fr_vec.size() == 2 * BaseFieldScalarSize); T val; val.x = convert_from_bn254_frs(fr_vec.subspan(0, BaseFieldScalarSize)); val.y = convert_from_bn254_frs(fr_vec.subspan(BaseFieldScalarSize, BaseFieldScalarSize)); @@ -178,6 +66,7 @@ template T convert_from_bn254_frs(std::span fr_vec) // Array or Univariate T val; constexpr size_t FieldScalarSize = calc_num_bn254_frs(); + ASSERT(fr_vec.size() == FieldScalarSize * std::tuple_size::value); size_t i = 0; for (auto& x : val) { x = convert_from_bn254_frs(fr_vec.subspan(FieldScalarSize * i, FieldScalarSize)); @@ -187,6 +76,8 @@ template T convert_from_bn254_frs(std::span fr_vec) } } +std::vector convert_grumpkin_fr_to_bn254_frs(const grumpkin::fr& val); + /** * @brief Conversion from transcript values to bb::frs * @details We want to support the following types: bool, size_t, uint32_t, uint64_t, bb::fr, grumpkin::fr, @@ -196,65 +87,28 @@ template T convert_from_bn254_frs(std::span fr_vec) * @param val * @return std::vector */ -template std::vector inline convert_to_bn254_frs(const T& val) +template std::vector convert_to_bn254_frs(const T& val) { - std::vector fr_vec{ val }; - return fr_vec; -} - -std::vector convert_to_bn254_frs(const grumpkin::fr& val); - -std::vector convert_to_bn254_frs(const bb::fr& val); - -std::vector convert_to_bn254_frs(const curve::BN254::AffineElement& val); - -std::vector convert_to_bn254_frs(const curve::Grumpkin::AffineElement& val); - -template std::vector inline convert_to_bn254_frs(const std::array& val) -{ - std::vector fr_vec(val.begin(), val.end()); - return fr_vec; -} - -template std::vector inline convert_to_bn254_frs(const std::array& val) -{ - std::vector fr_vec; - for (size_t i = 0; i < N; ++i) { - auto tmp_vec = convert_to_bn254_frs(val[i]); - fr_vec.insert(fr_vec.end(), tmp_vec.begin(), tmp_vec.end()); - } - return fr_vec; -} - -template std::vector inline convert_to_bn254_frs(const bb::Univariate& val) -{ - std::vector fr_vec; - for (size_t i = 0; i < N; ++i) { - auto tmp_vec = convert_to_bn254_frs(val.evaluations[i]); - fr_vec.insert(fr_vec.end(), tmp_vec.begin(), tmp_vec.end()); - } - return fr_vec; -} - -template std::vector inline convert_to_bn254_frs(const bb::Univariate& val) -{ - std::vector fr_vec; - for (size_t i = 0; i < N; ++i) { - auto tmp_vec = convert_to_bn254_frs(val.evaluations[i]); - fr_vec.insert(fr_vec.end(), tmp_vec.begin(), tmp_vec.end()); - } - return fr_vec; -} - -template std::vector inline convert_to_bn254_frs(const AllValues& val) -{ - auto data = val.get_all(); - std::vector fr_vec; - for (auto& item : data) { - auto tmp_vec = convert_to_bn254_frs(item); - fr_vec.insert(fr_vec.end(), tmp_vec.begin(), tmp_vec.end()); + if constexpr (IsAnyOf) { + std::vector fr_vec{ val }; + return fr_vec; + } else if constexpr (IsAnyOf) { + return convert_grumpkin_fr_to_bn254_frs(val); + } else if constexpr (IsAnyOf) { + auto fr_vec_x = convert_to_bn254_frs(val.x); + auto fr_vec_y = convert_to_bn254_frs(val.y); + std::vector fr_vec(fr_vec_x.begin(), fr_vec_x.end()); + fr_vec.insert(fr_vec.end(), fr_vec_y.begin(), fr_vec_y.end()); + return fr_vec; + } else { + // Array or Univariate or AllValues + std::vector fr_vec; + for (auto& x : val) { + auto tmp_vec = convert_to_bn254_frs(x); + fr_vec.insert(fr_vec.end(), tmp_vec.begin(), tmp_vec.end()); + } + return fr_vec; } - return fr_vec; } grumpkin::fr convert_to_grumpkin_fr(const bb::fr& f); diff --git a/barretenberg/cpp/src/barretenberg/polynomials/univariate.hpp b/barretenberg/cpp/src/barretenberg/polynomials/univariate.hpp index c3425488cf87..03467a23f7b2 100644 --- a/barretenberg/cpp/src/barretenberg/polynomials/univariate.hpp +++ b/barretenberg/cpp/src/barretenberg/polynomials/univariate.hpp @@ -340,11 +340,12 @@ template class Univariate return result; }; - // Begin iterator + // Begin iterators auto begin() { return evaluations.begin(); } - - // End iterator + auto begin() const { return evaluations.begin(); } + // End iterators auto end() { return evaluations.end(); } + auto end() const { return evaluations.end(); } }; template diff --git a/barretenberg/cpp/src/barretenberg/sumcheck/sumcheck.hpp b/barretenberg/cpp/src/barretenberg/sumcheck/sumcheck.hpp index 09e2f41de681..7fffcb152698 100644 --- a/barretenberg/cpp/src/barretenberg/sumcheck/sumcheck.hpp +++ b/barretenberg/cpp/src/barretenberg/sumcheck/sumcheck.hpp @@ -123,7 +123,7 @@ template class SumcheckProver { zip_view(multivariate_evaluations.get_all(), partially_evaluated_polynomials.get_all())) { eval = poly[0]; } - transcript->send_to_verifier("Sumcheck:evaluations", multivariate_evaluations); + transcript->send_to_verifier("Sumcheck:evaluations", multivariate_evaluations.get_all()); return { multivariate_challenge, multivariate_evaluations }; }; From 91ffd2f1f8cafb108b1cbe71f5699706b2223682 Mon Sep 17 00:00:00 2001 From: lucasxia01 Date: Mon, 12 Feb 2024 18:52:23 +0000 Subject: [PATCH 4/7] refactored calc_num_bn254_frs in stdlib --- .../src/barretenberg/ecc/curves/bn254/g1.hpp | 3 - .../ecc/fields/field_conversion.hpp | 2 +- .../ecc/fields/field_declarations.hpp | 3 - .../primitives/field/field_conversion.hpp | 78 +++++++++++-------- .../field/field_conversion.test.cpp | 6 +- .../recursion/honk/transcript/transcript.hpp | 2 +- 6 files changed, 49 insertions(+), 45 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/ecc/curves/bn254/g1.hpp b/barretenberg/cpp/src/barretenberg/ecc/curves/bn254/g1.hpp index 9df9ce902862..ef5240fad945 100644 --- a/barretenberg/cpp/src/barretenberg/ecc/curves/bn254/g1.hpp +++ b/barretenberg/cpp/src/barretenberg/ecc/curves/bn254/g1.hpp @@ -14,9 +14,6 @@ struct Bn254G1Params { static constexpr fq one_y{ 0xa6ba871b8b1e1b3aUL, 0x14f1d651eb8e167bUL, 0xccdd46def0f28c58UL, 0x1c14ef83340fbe5eUL }; static constexpr fq a{ 0UL, 0UL, 0UL, 0UL }; static constexpr fq b{ 0x7a17caa950ad28d7UL, 0x1f6ac17ae15521b9UL, 0x334bea4e696bd284UL, 0x2a1f6744ce179d8eUL }; - - // This is , so it represents one BN254 scalar - static constexpr size_t NUM_BN254_SCALARS = 1; }; using g1 = group; diff --git a/barretenberg/cpp/src/barretenberg/ecc/fields/field_conversion.hpp b/barretenberg/cpp/src/barretenberg/ecc/fields/field_conversion.hpp index 524952e4c48a..c639e3f5e3ad 100644 --- a/barretenberg/cpp/src/barretenberg/ecc/fields/field_conversion.hpp +++ b/barretenberg/cpp/src/barretenberg/ecc/fields/field_conversion.hpp @@ -21,7 +21,7 @@ template constexpr size_t calc_num_bn254_frs() if constexpr (IsAnyOf) { return 1; } else if constexpr (IsAnyOf) { - return T::NUM_BN254_SCALARS; + return T::Params::NUM_BN254_SCALARS; } else if constexpr (IsAnyOf) { return 2 * calc_num_bn254_frs(); } else { diff --git a/barretenberg/cpp/src/barretenberg/ecc/fields/field_declarations.hpp b/barretenberg/cpp/src/barretenberg/ecc/fields/field_declarations.hpp index 9cd3947d0637..af92a45ae168 100644 --- a/barretenberg/cpp/src/barretenberg/ecc/fields/field_declarations.hpp +++ b/barretenberg/cpp/src/barretenberg/ecc/fields/field_declarations.hpp @@ -30,9 +30,6 @@ template struct alignas(32) field { using out_buf = uint8_t*; using vec_out_buf = uint8_t**; - // Used for conversion to BN254 scalars - static constexpr size_t NUM_BN254_SCALARS = Params::NUM_BN254_SCALARS; - // We don't initialize data in the default constructor since we'd lose a lot of time on huge array initializations. // Other alternatives have been noted, such as casting to get around constructors where they matter, // however it is felt that sanitizer tools (e.g. MSAN) can detect garbage well, whereas doing diff --git a/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field_conversion.hpp b/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field_conversion.hpp index f14b05b8cd5c..b93002aa8974 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field_conversion.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field_conversion.hpp @@ -44,41 +44,20 @@ template inline std::array, 2> convert_grumpkin_f * @tparam T * @return constexpr size_t */ -template constexpr size_t calc_num_bn254_frs(); - -template constexpr size_t calc_num_bn254_frs(fr* /*unused*/) -{ - return 1; -} - -template constexpr size_t calc_num_bn254_frs(fq* /*unused*/) +template constexpr size_t calc_num_bn254_frs() { - return 2; -} - -template constexpr size_t calc_num_bn254_frs(bn254_element* /*unused*/) -{ - return 2 * calc_num_bn254_frs>(); -} - -template constexpr size_t calc_num_bn254_frs(grumpkin_element* /*unused*/) -{ - return 2 * calc_num_bn254_frs>(); -} - -template constexpr size_t calc_num_bn254_frs(std::array* /*unused*/) -{ - return N * calc_num_bn254_frs(); -} - -template constexpr size_t calc_num_bn254_frs(bb::Univariate* /*unused*/) -{ - return N * calc_num_bn254_frs(); -} - -template constexpr size_t calc_num_bn254_frs() -{ - return calc_num_bn254_frs(static_cast(nullptr)); + if constexpr (IsAnyOf>) { + return Bn254FrParams::NUM_BN254_SCALARS; + } else if constexpr (IsAnyOf>) { + return Bn254FqParams::NUM_BN254_SCALARS; + } else if constexpr (IsAnyOf>) { + return 2 * calc_num_bn254_frs>(); + } else if constexpr (IsAnyOf>) { + return 2 * calc_num_bn254_frs>(); + } else { + // Array or Univariate + return calc_num_bn254_frs() * (std::tuple_size::value); + } } /** @@ -90,6 +69,37 @@ template constexpr size_t calc_num_bn254_frs() * @param fr_vec * @return T */ +// template T convert_from_bn254_frs(std::span> fr_vec) +// { +// if constexpr (IsAnyOf>) { +// ASSERT(fr_vec.size() == 1); +// return fr_vec[0]; +// } else if constexpr (IsAnyOf < T, fq) { +// ASSERT(fr_vec.size() == 2); +// fq result(fr_vec[0], fr_vec[1], 0, 0); +// return result; +// } else if constexpr (IsAnyOf) { +// using BaseField = typename T::Fq; +// constexpr size_t BaseFieldScalarSize = calc_num_bn254_frs(); +// ASSERT(fr_vec.size() == 2 * BaseFieldScalarSize); +// T val; +// val.x = convert_from_bn254_frs(fr_vec.subspan(0, BaseFieldScalarSize)); +// val.y = convert_from_bn254_frs(fr_vec.subspan(BaseFieldScalarSize, BaseFieldScalarSize)); +// return val; +// } else { +// // Array or Univariate +// T val; +// constexpr size_t FieldScalarSize = calc_num_bn254_frs(); +// ASSERT(fr_vec.size() == FieldScalarSize * std::tuple_size::value); +// size_t i = 0; +// for (auto& x : val) { +// x = convert_from_bn254_frs(fr_vec.subspan(FieldScalarSize * i, FieldScalarSize)); +// ++i; +// } +// return val; +// } +// } + template T convert_from_bn254_frs(Builder& builder, std::span> fr_vec); template diff --git a/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field_conversion.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field_conversion.test.cpp index 51624b50abe4..1f4eff5ae455 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field_conversion.test.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field_conversion.test.cpp @@ -12,7 +12,7 @@ template class StdlibFieldConversionTests : public ::testing: public: template void check_conversion(Builder& builder, T x) { - size_t len = bb::stdlib::field_conversion::calc_num_bn254_frs(); + size_t len = bb::stdlib::field_conversion::calc_num_bn254_frs(); auto frs = bb::stdlib::field_conversion::convert_to_bn254_frs(x); EXPECT_EQ(len, frs.size()); auto y = bb::stdlib::field_conversion::convert_from_bn254_frs(builder, frs); @@ -21,7 +21,7 @@ template class StdlibFieldConversionTests : public ::testing: template void check_conversion_array(Builder& builder, T x) { - size_t len = bb::stdlib::field_conversion::calc_num_bn254_frs(); + size_t len = bb::stdlib::field_conversion::calc_num_bn254_frs(); auto frs = bb::stdlib::field_conversion::convert_to_bn254_frs(x); EXPECT_EQ(len, frs.size()); auto y = bb::stdlib::field_conversion::convert_from_bn254_frs(builder, frs); @@ -33,7 +33,7 @@ template class StdlibFieldConversionTests : public ::testing: template void check_conversion_univariate(Builder& builder, T x) { - size_t len = bb::stdlib::field_conversion::calc_num_bn254_frs(); + size_t len = bb::stdlib::field_conversion::calc_num_bn254_frs(); auto frs = bb::stdlib::field_conversion::convert_to_bn254_frs(x); EXPECT_EQ(len, frs.size()); auto y = bb::stdlib::field_conversion::convert_from_bn254_frs(builder, frs); diff --git a/barretenberg/cpp/src/barretenberg/stdlib/recursion/honk/transcript/transcript.hpp b/barretenberg/cpp/src/barretenberg/stdlib/recursion/honk/transcript/transcript.hpp index 9fef4b874f95..629c463ebe07 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/recursion/honk/transcript/transcript.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/recursion/honk/transcript/transcript.hpp @@ -37,7 +37,7 @@ template struct StdlibTranscriptParams { } template static constexpr size_t calc_num_bn254_frs() { - return bb::stdlib::field_conversion::calc_num_bn254_frs(); + return bb::stdlib::field_conversion::calc_num_bn254_frs(); } template static inline T convert_from_bn254_frs(std::span frs) { From 9ae1a3ea9143fa287a1b9b611c46831f7593f8e7 Mon Sep 17 00:00:00 2001 From: lucasxia01 Date: Mon, 12 Feb 2024 19:28:22 +0000 Subject: [PATCH 5/7] refactored remaining stuff :o --- .../ecc/fields/field_conversion.hpp | 2 +- .../primitives/field/field_conversion.hpp | 353 ++++++++---------- .../field/field_conversion.test.cpp | 32 +- .../recursion/honk/transcript/transcript.hpp | 2 +- 4 files changed, 160 insertions(+), 229 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/ecc/fields/field_conversion.hpp b/barretenberg/cpp/src/barretenberg/ecc/fields/field_conversion.hpp index c639e3f5e3ad..946b91274868 100644 --- a/barretenberg/cpp/src/barretenberg/ecc/fields/field_conversion.hpp +++ b/barretenberg/cpp/src/barretenberg/ecc/fields/field_conversion.hpp @@ -101,7 +101,7 @@ template std::vector convert_to_bn254_frs(const T& val) fr_vec.insert(fr_vec.end(), fr_vec_y.begin(), fr_vec_y.end()); return fr_vec; } else { - // Array or Univariate or AllValues + // Array or Univariate std::vector fr_vec; for (auto& x : val) { auto tmp_vec = convert_to_bn254_frs(x); diff --git a/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field_conversion.hpp b/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field_conversion.hpp index b93002aa8974..51259465557b 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field_conversion.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field_conversion.hpp @@ -28,10 +28,10 @@ template inline T convert_challenge(Builder& buil } } -template inline std::array, 2> convert_grumpkin_fr_to_bn254_frs(const fq& input) +template inline std::vector> convert_grumpkin_fr_to_bn254_frs(const fq& input) { fr shift(static_cast(1) << NUM_LIMB_BITS); - std::array, 2> result; + std::vector> result(2); result[0] = input.binary_basis_limbs[0].element + (input.binary_basis_limbs[1].element * shift); result[1] = input.binary_basis_limbs[2].element + (input.binary_basis_limbs[3].element * shift); return result; @@ -69,137 +69,47 @@ template constexpr size_t calc_num_bn254_frs() * @param fr_vec * @return T */ -// template T convert_from_bn254_frs(std::span> fr_vec) -// { -// if constexpr (IsAnyOf>) { -// ASSERT(fr_vec.size() == 1); -// return fr_vec[0]; -// } else if constexpr (IsAnyOf < T, fq) { -// ASSERT(fr_vec.size() == 2); -// fq result(fr_vec[0], fr_vec[1], 0, 0); -// return result; -// } else if constexpr (IsAnyOf) { -// using BaseField = typename T::Fq; -// constexpr size_t BaseFieldScalarSize = calc_num_bn254_frs(); -// ASSERT(fr_vec.size() == 2 * BaseFieldScalarSize); -// T val; -// val.x = convert_from_bn254_frs(fr_vec.subspan(0, BaseFieldScalarSize)); -// val.y = convert_from_bn254_frs(fr_vec.subspan(BaseFieldScalarSize, BaseFieldScalarSize)); -// return val; -// } else { -// // Array or Univariate -// T val; -// constexpr size_t FieldScalarSize = calc_num_bn254_frs(); -// ASSERT(fr_vec.size() == FieldScalarSize * std::tuple_size::value); -// size_t i = 0; -// for (auto& x : val) { -// x = convert_from_bn254_frs(fr_vec.subspan(FieldScalarSize * i, FieldScalarSize)); -// ++i; -// } -// return val; -// } -// } - -template T convert_from_bn254_frs(Builder& builder, std::span> fr_vec); - -template -inline fr convert_from_bn254_frs(const Builder& /*unused*/, - std::span> fr_vec, - fr* /*unused*/) -{ - ASSERT(fr_vec.size() == 1); - return fr_vec[0]; -} - -template -inline fq convert_from_bn254_frs(const Builder& /*unused*/, - std::span> fr_vec, - fq* /*unused*/) -{ - ASSERT(fr_vec.size() == 2); - bigfield result(fr_vec[0], fr_vec[1], 0, 0); - return result; -} - -template -inline bn254_element convert_from_bn254_frs(Builder& builder, - std::span> fr_vec, - bn254_element* /*unused*/) +template T convert_from_bn254_frs(Builder& builder, std::span> fr_vec) { - ASSERT(fr_vec.size() == 4); - bn254_element val; - val.x = convert_from_bn254_frs>(builder, fr_vec.subspan(0, 2)); - val.y = convert_from_bn254_frs>(builder, fr_vec.subspan(2, 2)); - return val; -} - -template -inline grumpkin_element convert_from_bn254_frs(Builder& builder, - std::span> fr_vec, - grumpkin_element* /*unused*/) -{ - ASSERT(fr_vec.size() == 2); - grumpkin_element val(convert_from_bn254_frs>(builder, fr_vec.subspan(0, 1)), - convert_from_bn254_frs>(builder, fr_vec.subspan(1, 1)), - false); - return val; -} - -template -inline std::array, N> convert_from_bn254_frs(const Builder& /*unused*/, - std::span> fr_vec, - std::array, N>* /*unused*/) -{ - std::array, N> val; - for (size_t i = 0; i < N; ++i) { - val[i] = fr_vec[i]; - } - return val; -} - -template -inline std::array, N> convert_from_bn254_frs(Builder& builder, - std::span> fr_vec, - std::array, N>* /*unused*/) -{ - std::array, N> val; - for (size_t i = 0; i < N; ++i) { - std::vector> fr_vec_tmp{ fr_vec[2 * i], - fr_vec[2 * i + 1] }; // each pair of consecutive elements is a fq - val[i] = convert_from_bn254_frs>(builder, fr_vec_tmp); - } - return val; -} - -template -inline bb::Univariate, N> convert_from_bn254_frs(const Builder& /*unused*/, - std::span> fr_vec, - bb::Univariate, N>* /*unused*/) -{ - bb::Univariate, N> val; - for (size_t i = 0; i < N; ++i) { - val.evaluations[i] = fr_vec[i]; - } - return val; -} - -template -inline bb::Univariate, N> convert_from_bn254_frs(Builder& builder, - std::span> fr_vec, - bb::Univariate, N>* /*unused*/) -{ - bb::Univariate, N> val; - for (size_t i = 0; i < N; ++i) { - std::vector> fr_vec_tmp{ fr_vec[2 * i], fr_vec[2 * i + 1] }; - val.evaluations[i] = convert_from_bn254_frs>(builder, fr_vec_tmp); + if constexpr (IsAnyOf>) { + ASSERT(fr_vec.size() == 1); + return fr_vec[0]; + } else if constexpr (IsAnyOf>) { + ASSERT(fr_vec.size() == 2); + fq result(fr_vec[0], fr_vec[1], 0, 0); + return result; + } else if constexpr (IsAnyOf>) { + using BaseField = fq; + constexpr size_t BaseFieldScalarSize = calc_num_bn254_frs(); + ASSERT(fr_vec.size() == 2 * BaseFieldScalarSize); + bn254_element result; + result.x = convert_from_bn254_frs(builder, fr_vec.subspan(0, BaseFieldScalarSize)); + result.y = convert_from_bn254_frs(builder, + fr_vec.subspan(BaseFieldScalarSize, BaseFieldScalarSize)); + return result; + } else if constexpr (IsAnyOf>) { + using BaseField = fr; + constexpr size_t BaseFieldScalarSize = calc_num_bn254_frs(); + ASSERT(fr_vec.size() == 2 * BaseFieldScalarSize); + grumpkin_element result( + convert_from_bn254_frs>(builder, fr_vec.subspan(0, BaseFieldScalarSize)), + convert_from_bn254_frs>(builder, + fr_vec.subspan(BaseFieldScalarSize, BaseFieldScalarSize)), + false); + return result; + } else { + // Array or Univariate + T val; + constexpr size_t FieldScalarSize = calc_num_bn254_frs(); + ASSERT(fr_vec.size() == FieldScalarSize * std::tuple_size::value); + size_t i = 0; + for (auto& x : val) { + x = convert_from_bn254_frs( + builder, fr_vec.subspan(FieldScalarSize * i, FieldScalarSize)); + ++i; + } + return val; } - return val; -} - -template -inline T convert_from_bn254_frs(Builder& builder, std::span> fr_vec) -{ - return convert_from_bn254_frs(builder, fr_vec, static_cast(nullptr)); } /** @@ -211,89 +121,122 @@ inline T convert_from_bn254_frs(Builder& builder, std::span> f * @param val * @return std::vector> */ -template inline std::vector> convert_to_bn254_frs(const fq& val) +template std::vector> convert_to_bn254_frs(const T& val) { - auto fr_arr = convert_grumpkin_fr_to_bn254_frs(val); - std::vector> fr_vec(fr_arr.begin(), fr_arr.end()); - return fr_vec; + if constexpr (IsAnyOf>) { + std::vector> fr_vec{ val }; + return fr_vec; + } else if constexpr (IsAnyOf>) { + return convert_grumpkin_fr_to_bn254_frs(val); + } else if constexpr (IsAnyOf>) { + using BaseField = fq; + auto fr_vec_x = convert_to_bn254_frs(val.x); + auto fr_vec_y = convert_to_bn254_frs(val.y); + std::vector> fr_vec(fr_vec_x.begin(), fr_vec_x.end()); + fr_vec.insert(fr_vec.end(), fr_vec_y.begin(), fr_vec_y.end()); + return fr_vec; + } else if constexpr (IsAnyOf>) { + using BaseField = fr; + auto fr_vec_x = convert_to_bn254_frs(val.x); + auto fr_vec_y = convert_to_bn254_frs(val.y); + std::vector> fr_vec(fr_vec_x.begin(), fr_vec_x.end()); + fr_vec.insert(fr_vec.end(), fr_vec_y.begin(), fr_vec_y.end()); + return fr_vec; + } else { + // Array or Univariate + std::vector> fr_vec; + for (auto& x : val) { + auto tmp_vec = convert_to_bn254_frs(x); + fr_vec.insert(fr_vec.end(), tmp_vec.begin(), tmp_vec.end()); + } + return fr_vec; + } } -template inline std::vector> convert_to_bn254_frs(const fr& val) -{ - std::vector> fr_vec{ val }; - return fr_vec; -} +// template inline std::vector> convert_to_bn254_frs(const fq& val) +// { +// auto fr_arr = convert_grumpkin_fr_to_bn254_frs(val); +// std::vector> fr_vec(fr_arr.begin(), fr_arr.end()); +// return fr_vec; +// } -template inline std::vector> convert_to_bn254_frs(const bn254_element& val) -{ - auto fr_vec_x = convert_to_bn254_frs(val.x); - auto fr_vec_y = convert_to_bn254_frs(val.y); - std::vector> fr_vec(fr_vec_x.begin(), fr_vec_x.end()); - fr_vec.insert(fr_vec.end(), fr_vec_y.begin(), fr_vec_y.end()); - return fr_vec; -} +// template inline std::vector> convert_to_bn254_frs(const fr& val) +// { +// std::vector> fr_vec{ val }; +// return fr_vec; +// } -template inline std::vector> convert_to_bn254_frs(const grumpkin_element& val) -{ - auto fr_vec_x = convert_to_bn254_frs(val.x); - auto fr_vec_y = convert_to_bn254_frs(val.y); - std::vector> fr_vec(fr_vec_x.begin(), fr_vec_x.end()); - fr_vec.insert(fr_vec.end(), fr_vec_y.begin(), fr_vec_y.end()); - return fr_vec; -} +// template inline std::vector> convert_to_bn254_frs(const bn254_element& val) +// { +// auto fr_vec_x = convert_to_bn254_frs(val.x); +// auto fr_vec_y = convert_to_bn254_frs(val.y); +// std::vector> fr_vec(fr_vec_x.begin(), fr_vec_x.end()); +// fr_vec.insert(fr_vec.end(), fr_vec_y.begin(), fr_vec_y.end()); +// return fr_vec; +// } -template -inline std::vector> convert_to_bn254_frs(const std::array, N>& val) -{ - std::vector> fr_vec(val.begin(), val.end()); - return fr_vec; -} +// template inline std::vector> convert_to_bn254_frs(const grumpkin_element& +// val) +// { +// auto fr_vec_x = convert_to_bn254_frs(val.x); +// auto fr_vec_y = convert_to_bn254_frs(val.y); +// std::vector> fr_vec(fr_vec_x.begin(), fr_vec_x.end()); +// fr_vec.insert(fr_vec.end(), fr_vec_y.begin(), fr_vec_y.end()); +// return fr_vec; +// } -template -inline std::vector> convert_to_bn254_frs(const std::array, N>& val) -{ - std::vector> fr_vec; - for (size_t i = 0; i < N; ++i) { - auto tmp_vec = convert_to_bn254_frs(val[i]); - fr_vec.insert(fr_vec.end(), tmp_vec.begin(), tmp_vec.end()); - } - return fr_vec; -} +// template +// inline std::vector> convert_to_bn254_frs(const std::array, N>& val) +// { +// std::vector> fr_vec(val.begin(), val.end()); +// return fr_vec; +// } -template -inline std::vector> convert_to_bn254_frs(const bb::Univariate, N>& val) -{ - std::vector> fr_vec; - for (size_t i = 0; i < N; ++i) { - auto tmp_vec = convert_to_bn254_frs(val.evaluations[i]); - fr_vec.insert(fr_vec.end(), tmp_vec.begin(), tmp_vec.end()); - } - return fr_vec; -} +// template +// inline std::vector> convert_to_bn254_frs(const std::array, N>& val) +// { +// std::vector> fr_vec; +// for (size_t i = 0; i < N; ++i) { +// auto tmp_vec = convert_to_bn254_frs(val[i]); +// fr_vec.insert(fr_vec.end(), tmp_vec.begin(), tmp_vec.end()); +// } +// return fr_vec; +// } -template -inline std::vector> convert_to_bn254_frs(const bb::Univariate, N>& val) -{ - std::vector> fr_vec; - for (size_t i = 0; i < N; ++i) { - auto tmp_vec = convert_to_bn254_frs(val.evaluations[i]); - fr_vec.insert(fr_vec.end(), tmp_vec.begin(), tmp_vec.end()); - } - return fr_vec; -} +// template +// inline std::vector> convert_to_bn254_frs(const bb::Univariate, N>& val) +// { +// std::vector> fr_vec; +// for (size_t i = 0; i < N; ++i) { +// auto tmp_vec = convert_to_bn254_frs(val.evaluations[i]); +// fr_vec.insert(fr_vec.end(), tmp_vec.begin(), tmp_vec.end()); +// } +// return fr_vec; +// } -// TODO(https://github.com/AztecProtocol/barretenberg/issues/846): solve this annoying asymmetry - AllValues vs -// std::array, N> -template -inline std::vector> convert_to_bn254_frs(const AllValues& val) -{ - auto data = val.get_all(); - std::vector> fr_vec; - for (auto& item : data) { - auto tmp_vec = convert_to_bn254_frs(item); - fr_vec.insert(fr_vec.end(), tmp_vec.begin(), tmp_vec.end()); - } - return fr_vec; -} +// template +// inline std::vector> convert_to_bn254_frs(const bb::Univariate, N>& val) +// { +// std::vector> fr_vec; +// for (size_t i = 0; i < N; ++i) { +// auto tmp_vec = convert_to_bn254_frs(val.evaluations[i]); +// fr_vec.insert(fr_vec.end(), tmp_vec.begin(), tmp_vec.end()); +// } +// return fr_vec; +// } + +// // TODO(https://github.com/AztecProtocol/barretenberg/issues/846): solve this annoying asymmetry - AllValues vs +// // std::array, N> +// template +// inline std::vector> convert_to_bn254_frs(const AllValues& val) +// { +// auto data = val.get_all(); +// std::vector> fr_vec; +// for (auto& item : data) { +// auto tmp_vec = convert_to_bn254_frs(item); +// fr_vec.insert(fr_vec.end(), tmp_vec.begin(), tmp_vec.end()); +// } +// return fr_vec; +// } } // namespace bb::stdlib::field_conversion \ No newline at end of file diff --git a/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field_conversion.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field_conversion.test.cpp index 1f4eff5ae455..886a5a9ab35b 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field_conversion.test.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field_conversion.test.cpp @@ -13,33 +13,21 @@ template class StdlibFieldConversionTests : public ::testing: template void check_conversion(Builder& builder, T x) { size_t len = bb::stdlib::field_conversion::calc_num_bn254_frs(); - auto frs = bb::stdlib::field_conversion::convert_to_bn254_frs(x); + auto frs = bb::stdlib::field_conversion::convert_to_bn254_frs(x); EXPECT_EQ(len, frs.size()); auto y = bb::stdlib::field_conversion::convert_from_bn254_frs(builder, frs); EXPECT_EQ(x.get_value(), y.get_value()); } - template void check_conversion_array(Builder& builder, T x) + template void check_conversion_iterable(Builder& builder, T x) { size_t len = bb::stdlib::field_conversion::calc_num_bn254_frs(); - auto frs = bb::stdlib::field_conversion::convert_to_bn254_frs(x); + auto frs = bb::stdlib::field_conversion::convert_to_bn254_frs(x); EXPECT_EQ(len, frs.size()); auto y = bb::stdlib::field_conversion::convert_from_bn254_frs(builder, frs); EXPECT_EQ(x.size(), y.size()); - for (size_t i = 0; i < x.size(); i++) { - EXPECT_EQ(x[i].get_value(), y[i].get_value()); - } - } - - template void check_conversion_univariate(Builder& builder, T x) - { - size_t len = bb::stdlib::field_conversion::calc_num_bn254_frs(); - auto frs = bb::stdlib::field_conversion::convert_to_bn254_frs(x); - EXPECT_EQ(len, frs.size()); - auto y = bb::stdlib::field_conversion::convert_from_bn254_frs(builder, frs); - EXPECT_EQ(x.evaluations.size(), y.evaluations.size()); - for (size_t i = 0; i < x.evaluations.size(); i++) { - EXPECT_EQ(x.evaluations[i].get_value(), y.evaluations[i].get_value()); + for (auto itx = x.begin(), ity = y.begin(); itx != x.end(); itx++, ity++) { + EXPECT_EQ(itx->get_value(), ity->get_value()); } } }; @@ -132,7 +120,7 @@ TYPED_TEST(StdlibFieldConversionTests, FieldConversionArrayBn254Fr) std::array, 4> x1{ fr(&builder, 1), fr(&builder, 2), fr(&builder, 3), fr(&builder, 4) }; - this->check_conversion_array(builder, x1); + this->check_conversion_iterable(builder, x1); std::array, 7> x2{ fr(&builder, bb::fr::modulus_minus_two), fr(&builder, bb::fr::modulus_minus_two - 123), @@ -141,7 +129,7 @@ TYPED_TEST(StdlibFieldConversionTests, FieldConversionArrayBn254Fr) fr(&builder, 367032), fr(&builder, 12985028), fr(&builder, bb::fr::modulus_minus_two - 125015028) }; - this->check_conversion_array(builder, x2); + this->check_conversion_iterable(builder, x2); } /** @@ -167,7 +155,7 @@ TYPED_TEST(StdlibFieldConversionTests, FieldConversionArrayGrumpkinFr) &builder, static_cast(std::string("018555a8eb50cf07f64b019ebaf3af3c925c93e631f3ecd455db07bbb52bbdd3"))), }; - this->check_conversion_array(builder, x1); + this->check_conversion_iterable(builder, x1); } /** @@ -182,7 +170,7 @@ TYPED_TEST(StdlibFieldConversionTests, FieldConversionUnivariateBn254Fr) Univariate, 4> x{ { fr(&builder, 1), fr(&builder, 2), fr(&builder, 3), fr(&builder, 4) } }; - this->check_conversion_univariate(builder, x); + this->check_conversion_iterable(builder, x); } /** @@ -208,7 +196,7 @@ TYPED_TEST(StdlibFieldConversionTests, FieldConversionUnivariateGrumpkinFr) static_cast( std::string("2bf1eaf87f7d27e8dc4056e9af975985bccc89077a21891d6c7b6ccce0631f95"))) } }; - this->check_conversion_univariate(builder, x); + this->check_conversion_iterable(builder, x); } /** diff --git a/barretenberg/cpp/src/barretenberg/stdlib/recursion/honk/transcript/transcript.hpp b/barretenberg/cpp/src/barretenberg/stdlib/recursion/honk/transcript/transcript.hpp index 629c463ebe07..dcc23cdfa6a3 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/recursion/honk/transcript/transcript.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/recursion/honk/transcript/transcript.hpp @@ -48,7 +48,7 @@ template struct StdlibTranscriptParams { template static inline std::vector convert_to_bn254_frs(const T& element) { Builder* builder = element.get_context(); - return bb::stdlib::field_conversion::convert_to_bn254_frs(*builder, element); + return bb::stdlib::field_conversion::convert_to_bn254_frs(*builder, element); } }; From 97d5f3985672e5b9f24c40f826907203f066c8a6 Mon Sep 17 00:00:00 2001 From: lucasxia01 Date: Mon, 12 Feb 2024 19:36:14 +0000 Subject: [PATCH 6/7] forgot to remove commented out stuff --- .../primitives/field/field_conversion.hpp | 86 ------------------- 1 file changed, 86 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field_conversion.hpp b/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field_conversion.hpp index 51259465557b..7318a6f92e27 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field_conversion.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field_conversion.hpp @@ -153,90 +153,4 @@ template std::vector> convert_to_bn25 } } -// template inline std::vector> convert_to_bn254_frs(const fq& val) -// { -// auto fr_arr = convert_grumpkin_fr_to_bn254_frs(val); -// std::vector> fr_vec(fr_arr.begin(), fr_arr.end()); -// return fr_vec; -// } - -// template inline std::vector> convert_to_bn254_frs(const fr& val) -// { -// std::vector> fr_vec{ val }; -// return fr_vec; -// } - -// template inline std::vector> convert_to_bn254_frs(const bn254_element& val) -// { -// auto fr_vec_x = convert_to_bn254_frs(val.x); -// auto fr_vec_y = convert_to_bn254_frs(val.y); -// std::vector> fr_vec(fr_vec_x.begin(), fr_vec_x.end()); -// fr_vec.insert(fr_vec.end(), fr_vec_y.begin(), fr_vec_y.end()); -// return fr_vec; -// } - -// template inline std::vector> convert_to_bn254_frs(const grumpkin_element& -// val) -// { -// auto fr_vec_x = convert_to_bn254_frs(val.x); -// auto fr_vec_y = convert_to_bn254_frs(val.y); -// std::vector> fr_vec(fr_vec_x.begin(), fr_vec_x.end()); -// fr_vec.insert(fr_vec.end(), fr_vec_y.begin(), fr_vec_y.end()); -// return fr_vec; -// } - -// template -// inline std::vector> convert_to_bn254_frs(const std::array, N>& val) -// { -// std::vector> fr_vec(val.begin(), val.end()); -// return fr_vec; -// } - -// template -// inline std::vector> convert_to_bn254_frs(const std::array, N>& val) -// { -// std::vector> fr_vec; -// for (size_t i = 0; i < N; ++i) { -// auto tmp_vec = convert_to_bn254_frs(val[i]); -// fr_vec.insert(fr_vec.end(), tmp_vec.begin(), tmp_vec.end()); -// } -// return fr_vec; -// } - -// template -// inline std::vector> convert_to_bn254_frs(const bb::Univariate, N>& val) -// { -// std::vector> fr_vec; -// for (size_t i = 0; i < N; ++i) { -// auto tmp_vec = convert_to_bn254_frs(val.evaluations[i]); -// fr_vec.insert(fr_vec.end(), tmp_vec.begin(), tmp_vec.end()); -// } -// return fr_vec; -// } - -// template -// inline std::vector> convert_to_bn254_frs(const bb::Univariate, N>& val) -// { -// std::vector> fr_vec; -// for (size_t i = 0; i < N; ++i) { -// auto tmp_vec = convert_to_bn254_frs(val.evaluations[i]); -// fr_vec.insert(fr_vec.end(), tmp_vec.begin(), tmp_vec.end()); -// } -// return fr_vec; -// } - -// // TODO(https://github.com/AztecProtocol/barretenberg/issues/846): solve this annoying asymmetry - AllValues vs -// // std::array, N> -// template -// inline std::vector> convert_to_bn254_frs(const AllValues& val) -// { -// auto data = val.get_all(); -// std::vector> fr_vec; -// for (auto& item : data) { -// auto tmp_vec = convert_to_bn254_frs(item); -// fr_vec.insert(fr_vec.end(), tmp_vec.begin(), tmp_vec.end()); -// } -// return fr_vec; -// } - } // namespace bb::stdlib::field_conversion \ No newline at end of file From 16aa63fd2f4e9ba54c61d0e749966eff02549982 Mon Sep 17 00:00:00 2001 From: lucasxia01 Date: Mon, 12 Feb 2024 21:15:33 +0000 Subject: [PATCH 7/7] updated based on comments --- .../ecc/fields/field_conversion.hpp | 10 +++---- .../primitives/field/field_conversion.hpp | 30 +++++++++++-------- .../field/field_conversion.test.cpp | 5 ++-- 3 files changed, 25 insertions(+), 20 deletions(-) diff --git a/barretenberg/cpp/src/barretenberg/ecc/fields/field_conversion.hpp b/barretenberg/cpp/src/barretenberg/ecc/fields/field_conversion.hpp index 946b91274868..8e4962dd525b 100644 --- a/barretenberg/cpp/src/barretenberg/ecc/fields/field_conversion.hpp +++ b/barretenberg/cpp/src/barretenberg/ecc/fields/field_conversion.hpp @@ -47,7 +47,7 @@ template T convert_from_bn254_frs(std::span fr_vec) { if constexpr (IsAnyOf) { ASSERT(fr_vec.size() == 1); - return fr_vec[0] != 0; + return bool(fr_vec[0]); } else if constexpr (IsAnyOf) { ASSERT(fr_vec.size() == 1); return static_cast(fr_vec[0]); @@ -56,11 +56,11 @@ template T convert_from_bn254_frs(std::span fr_vec) return convert_grumpkin_fr_from_bn254_frs(fr_vec); } else if constexpr (IsAnyOf) { using BaseField = typename T::Fq; - constexpr size_t BaseFieldScalarSize = calc_num_bn254_frs(); - ASSERT(fr_vec.size() == 2 * BaseFieldScalarSize); + constexpr size_t BASE_FIELD_SCALAR_SIZE = calc_num_bn254_frs(); + ASSERT(fr_vec.size() == 2 * BASE_FIELD_SCALAR_SIZE); T val; - val.x = convert_from_bn254_frs(fr_vec.subspan(0, BaseFieldScalarSize)); - val.y = convert_from_bn254_frs(fr_vec.subspan(BaseFieldScalarSize, BaseFieldScalarSize)); + val.x = convert_from_bn254_frs(fr_vec.subspan(0, BASE_FIELD_SCALAR_SIZE)); + val.y = convert_from_bn254_frs(fr_vec.subspan(BASE_FIELD_SCALAR_SIZE, BASE_FIELD_SCALAR_SIZE)); return val; } else { // Array or Univariate diff --git a/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field_conversion.hpp b/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field_conversion.hpp index 7318a6f92e27..160743853a00 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field_conversion.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field_conversion.hpp @@ -39,8 +39,9 @@ template inline std::vector> convert_grumpkin_fr_ /** * @brief Calculates the size of a types (in their native form) in terms of frs * @details We want to support the following types: fr, fq, - * bn254_element, bb::Univariate, std::array, for + * bn254_element, grumpkin_element, std::array, for * FF = fr or fq, and N is arbitrary + * @tparam Builder * @tparam T * @return constexpr size_t */ @@ -63,9 +64,11 @@ template constexpr size_t calc_num_bn254_frs() /** * @brief Conversions from vector of fr elements to transcript types. * @details We want to support the following types: fr, fq, - * bn254_element, bb::Univariate, std::array, for + * bn254_element, grumpkin_element, std::array, for * FF = fr or fq, and N is arbitrary + * @tparam Builder * @tparam T + * @param builder * @param fr_vec * @return T */ @@ -80,21 +83,21 @@ template T convert_from_bn254_frs(Builder& builde return result; } else if constexpr (IsAnyOf>) { using BaseField = fq; - constexpr size_t BaseFieldScalarSize = calc_num_bn254_frs(); - ASSERT(fr_vec.size() == 2 * BaseFieldScalarSize); + constexpr size_t BASE_FIELD_SCALAR_SIZE = calc_num_bn254_frs(); + ASSERT(fr_vec.size() == 2 * BASE_FIELD_SCALAR_SIZE); bn254_element result; - result.x = convert_from_bn254_frs(builder, fr_vec.subspan(0, BaseFieldScalarSize)); - result.y = convert_from_bn254_frs(builder, - fr_vec.subspan(BaseFieldScalarSize, BaseFieldScalarSize)); + result.x = convert_from_bn254_frs(builder, fr_vec.subspan(0, BASE_FIELD_SCALAR_SIZE)); + result.y = convert_from_bn254_frs( + builder, fr_vec.subspan(BASE_FIELD_SCALAR_SIZE, BASE_FIELD_SCALAR_SIZE)); return result; } else if constexpr (IsAnyOf>) { using BaseField = fr; - constexpr size_t BaseFieldScalarSize = calc_num_bn254_frs(); - ASSERT(fr_vec.size() == 2 * BaseFieldScalarSize); + constexpr size_t BASE_FIELD_SCALAR_SIZE = calc_num_bn254_frs(); + ASSERT(fr_vec.size() == 2 * BASE_FIELD_SCALAR_SIZE); grumpkin_element result( - convert_from_bn254_frs>(builder, fr_vec.subspan(0, BaseFieldScalarSize)), - convert_from_bn254_frs>(builder, - fr_vec.subspan(BaseFieldScalarSize, BaseFieldScalarSize)), + convert_from_bn254_frs>(builder, fr_vec.subspan(0, BASE_FIELD_SCALAR_SIZE)), + convert_from_bn254_frs>( + builder, fr_vec.subspan(BASE_FIELD_SCALAR_SIZE, BASE_FIELD_SCALAR_SIZE)), false); return result; } else { @@ -115,8 +118,9 @@ template T convert_from_bn254_frs(Builder& builde /** * @brief Conversion from transcript values to frs * @details We want to support the following types: bool, size_t, uint32_t, uint64_t, fr, fq, - * bn254_element, curve::Grumpkin::AffineElement, bb::Univariate, std::array, grumpkin_element, std::array, for FF = fr/fq, and N is arbitrary. + * @tparam Builder * @tparam T * @param val * @return std::vector> diff --git a/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field_conversion.test.cpp b/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field_conversion.test.cpp index 886a5a9ab35b..73edec370e70 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field_conversion.test.cpp +++ b/barretenberg/cpp/src/barretenberg/stdlib/primitives/field/field_conversion.test.cpp @@ -1,4 +1,5 @@ #include "barretenberg/stdlib/primitives/field/field_conversion.hpp" +#include "barretenberg/common/zip_view.hpp" #include namespace bb::stdlib::field_conversion_tests { @@ -26,8 +27,8 @@ template class StdlibFieldConversionTests : public ::testing: EXPECT_EQ(len, frs.size()); auto y = bb::stdlib::field_conversion::convert_from_bn254_frs(builder, frs); EXPECT_EQ(x.size(), y.size()); - for (auto itx = x.begin(), ity = y.begin(); itx != x.end(); itx++, ity++) { - EXPECT_EQ(itx->get_value(), ity->get_value()); + for (auto [val1, val2] : zip_view(x, y)) { + EXPECT_EQ(val1.get_value(), val2.get_value()); } } };