33 return T::Params::NUM_BN254_SCALARS;
35 return 2 * calc_num_fields<typename T::Fq>();
38 return calc_num_fields<typename T::value_type>() * (std::tuple_size<T>::value);
52 for (
const auto& limb : fr_vec) {
53 if (!limb.is_zero()) {
68 constexpr uint64_t NUM_LIMB_BITS = stdlib::NUM_LIMB_BITS_IN_FIELD_SIMULATION;
69 constexpr uint64_t TOTAL_BITS = 254;
73 "Conversion error here usually implies some bad proof serde or parsing");
75 (
uint256_t(1) << (TOTAL_BITS - NUM_LIMB_BITS * 2)),
76 "Conversion error here usually implies some bad proof serde or parsing");
92 constexpr uint64_t NUM_LIMB_BITS = stdlib::NUM_LIMB_BITS_IN_FIELD_SIMULATION;
93 constexpr uint64_t TOTAL_BITS = 254;
95 constexpr uint64_t LOWER_BITS = 2 * NUM_LIMB_BITS;
101 std::vector<bb::fr> out(2);
116 return static_cast<bool>(fr_vec[0]);
118 return static_cast<T
>(fr_vec[0]);
122 using BaseField =
typename T::Fq;
123 constexpr size_t BASE = calc_num_fields<BaseField>();
128 if (check_point_at_infinity<T>(fr_vec)) {
129 return T::infinity();
134 val.x = deserialize_from_fields<BaseField>(fr_vec.subspan(0, BASE));
135 val.y = deserialize_from_fields<BaseField>(fr_vec.subspan(BASE, BASE));
136 if (!val.on_curve()) {
143 constexpr size_t SZ = calc_num_fields<typename T::value_type>();
145 for (
auto& x : val) {
146 x = deserialize_from_fields<typename T::value_type>(fr_vec.subspan(SZ * i, SZ));
163 using BaseField =
typename T::Fq;
164 std::vector<bb::fr> fr_vec_x =
166 std::vector<bb::fr> fr_vec_y =
169 std::vector<bb::fr> fr_vec =
std::move(fr_vec_x);
170 fr_vec.reserve(fr_vec.size() + fr_vec_y.size());
171 for (
auto& e : fr_vec_y) {
178 for (
auto& x : val) {
180 for (
auto& e : tmp) {
199 static constexpr size_t LO_BITS = TOTAL_BITS / 2;
200 static constexpr size_t HI_BITS = TOTAL_BITS - LO_BITS;
218 2 * stdlib::NUM_LIMB_BITS_IN_FIELD_SIMULATION,
219 "field_conversion: convert challenge");
220 return fq(challenge);
243 return calc_num_fields<typename T::value_type>() * (std::tuple_size<T>::value);
254 return static_cast<bool>(vec[0]);
258 return static_cast<T
>(vec[0]);
261 return static_cast<T
>(vec[0]);
263 return static_cast<T
>(vec[0]);
265 using BaseField =
typename T::Fq;
266 constexpr size_t N = calc_num_fields<BaseField>();
268 val.x = deserialize_from_fields<BaseField>(vec.subspan(0, N));
269 val.y = deserialize_from_fields<BaseField>(vec.subspan(N, N));
270 if (val.x == BaseField::zero() && val.y == BaseField::zero()) {
271 val.self_set_infinity();
273 if (!val.on_curve()) {
280 constexpr size_t SZ = calc_num_fields<typename T::value_type>();
282 for (
auto& x : val) {
283 x = deserialize_from_fields<typename T::value_type>(vec.subspan(SZ * i, SZ));
298 using BaseField =
typename T::Fq;
303 if (val.is_point_at_infinity()) {
307 uint256_vec_x = serialize_to_fields<BaseField>(val.x);
308 uint256_vec_y = serialize_to_fields<BaseField>(val.y);
311 uint256_vec.insert(uint256_vec.end(), uint256_vec_y.begin(), uint256_vec_y.end());
316 for (
auto& e : val) {
318 out.insert(out.end(), tmp.begin(), tmp.end());
335 static constexpr size_t LO_BITS = TOTAL_BITS / 2;
336 static constexpr size_t HI_BITS = TOTAL_BITS - LO_BITS;
354 2 * stdlib::NUM_LIMB_BITS_IN_FIELD_SIMULATION,
355 "field_conversion: convert challenge");
356 return fq(challenge);
#define BB_ASSERT_EQ(actual, expected,...)
#define BB_ASSERT_LT(left, right,...)
curve::BN254::AffineElement bn254_commitment
static std::vector< fr > serialize_to_fields(const T &val)
Conversion from transcript values to bb::frs.
static std::array< bb::fr, 2 > split_challenge(const bb::fr &challenge)
Split a challenge field element into two equal-width challenges.
static bool check_point_at_infinity(std::span< const bb::fr > fr_vec)
Check whether raw limbs represent the point at infinity (all limbs zero).
static T convert_challenge(const bb::fr &challenge)
Convert an fr challenge to a target type (fr or fq). Assumes challenge is "short".
static fq convert_grumpkin_fr_from_bn254_frs(std::span< const bb::fr > fr_vec)
Converts 2 bb::fr elements to fq.
static std::vector< bb::fr > convert_grumpkin_fr_to_bn254_frs(const fq &val)
Converts fq to 2 bb::fr elements (inverse of the above).
static T deserialize_from_fields(std::span< const fr > fr_vec)
curve::Grumpkin::AffineElement grumpkin_commitment
static constexpr size_t calc_num_fields()
curve::BN254::AffineElement bn254_commitment
curve::Grumpkin::AffineElement grumpkin_commitment
static constexpr size_t calc_num_fields()
static std::array< uint256_t, 2 > split_challenge(const uint256_t &challenge)
Split a challenge field element into two equal-width challenges.
static T convert_challenge(const bb::fr &challenge)
Convert an fr challenge to a target type (fr or fq). Assumes challenge is "short".
static std::vector< uint256_t > serialize_to_fields(const T &val)
Conversion from transcript values to uint256_ts.
static T deserialize_from_fields(std::span< const uint256_t > vec)
typename Group::affine_element AffineElement
typename Group::affine_element AffineElement
constexpr uint256_t slice(uint64_t start, uint64_t end) const
constexpr uint64_t get_msb() const
constexpr T get_msb(const T in)
Entry point for Barretenberg command-line interface.
field< Bn254FrParams > fr
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
static constexpr uint256_t modulus
void throw_or_abort(std::string const &err)