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;
220 2 * stdlib::NUM_LIMB_BITS_IN_FIELD_SIMULATION,
221 "field_conversion: convert challenge");
222 return fq(challenge);
261 return calc_num_fields<typename T::value_type>() * (std::tuple_size<T>::value);
272 return static_cast<bool>(vec[0]);
276 return static_cast<T
>(vec[0]);
279 return static_cast<T
>(vec[0]);
281 return static_cast<T
>(vec[0]);
283 using BaseField =
typename T::Fq;
284 constexpr size_t N = calc_num_fields<BaseField>();
286 val.x = deserialize_from_fields<BaseField>(vec.subspan(0,
N));
287 val.y = deserialize_from_fields<BaseField>(vec.subspan(
N,
N));
288 if (val.x == BaseField::zero() && val.y == BaseField::zero()) {
289 val.self_set_infinity();
291 if (!val.on_curve()) {
298 constexpr size_t SZ = calc_num_fields<typename T::value_type>();
300 for (
auto& x : val) {
301 x = deserialize_from_fields<typename T::value_type>(vec.subspan(SZ * i, SZ));
316 using BaseField =
typename T::Fq;
321 if (val.is_point_at_infinity()) {
325 uint256_vec_x = serialize_to_fields<BaseField>(val.x);
326 uint256_vec_y = serialize_to_fields<BaseField>(val.y);
329 uint256_vec.insert(uint256_vec.end(), uint256_vec_y.begin(), uint256_vec_y.end());
334 for (
auto& e : val) {
336 out.insert(
out.end(), tmp.begin(), tmp.end());
353 static constexpr size_t LO_BITS = TOTAL_BITS / 2;
354 static constexpr size_t HI_BITS = TOTAL_BITS - LO_BITS;
372 2 * stdlib::NUM_LIMB_BITS_IN_FIELD_SIMULATION,
373 "field_conversion: convert challenge");
374 return fq(challenge);
#define BB_ASSERT_EQ(actual, expected,...)
#define BB_ASSERT_LT(left, right,...)
static T convert_short_challenge(const bb::fr &challenge)
Convert a short (≤127-bit limb) challenge to a target type (fr or fq).
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 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 convert_full_challenge(const bb::fr &challenge)
Convert a full-width challenge to a target type (fr or fq).
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_short_challenge(const bb::fr &challenge)
Convert a short (≤127-bit limb) challenge to a target type (fr or fq).
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)
static T convert_full_challenge(const bb::fr &challenge)
Convert a full-width challenge to a target type (fr or fq); exact since r < q.
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
bb::VectorAffineElementPushSpan< BaseParams > out
static constexpr uint256_t modulus
void throw_or_abort(std::string const &err)