Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
field_conversion.cpp
Go to the documentation of this file.
1// === AUDIT STATUS ===
2// internal: { status: not started, auditors: [], date: YYYY-MM-DD }
3// external_1: { status: not started, auditors: [], date: YYYY-MM-DD }
4// external_2: { status: not started, auditors: [], date: YYYY-MM-DD }
5// =====================
6
9
11
24template <typename Builder> fq<Builder> convert_to_grumpkin_fr(Builder& builder, const fr<Builder>& f)
25{
26 constexpr uint64_t NUM_BITS_IN_TWO_LIMBS = 2 * NUM_LIMB_BITS; // 136
27 constexpr uint64_t UPPER_TWO_LIMB_BITS = TOTAL_BITS - NUM_BITS_IN_TWO_LIMBS; // 118
28 constexpr uint256_t shift = (uint256_t(1) << NUM_BITS_IN_TWO_LIMBS);
29 // split f into low_bits_in and high_bits_in
30 constexpr uint256_t LIMB_MASK = shift - 1; // mask for upper 128 bits
31 const uint256_t value = f.get_value();
32 const uint256_t low_val = static_cast<uint256_t>(value & LIMB_MASK);
33 const uint256_t hi_val = static_cast<uint256_t>(value >> NUM_BITS_IN_TWO_LIMBS);
34
35 fr<Builder> low{ witness_t<Builder>(&builder, low_val) };
37 // range constrain low to 136 bits and hi to 118 bits
38 builder.create_range_constraint(low.witness_index, NUM_BITS_IN_TWO_LIMBS, "create_range_constraint");
39 builder.create_range_constraint(hi.witness_index, UPPER_TWO_LIMB_BITS, "create_range_constraint");
40
41 BB_ASSERT_EQ(static_cast<uint256_t>(low_val) + (static_cast<uint256_t>(hi_val) << NUM_BITS_IN_TWO_LIMBS), value);
42 // checks this decomposition low + hi * 2^64 = value with an assert_equal
43 auto sum = low + hi * shift;
44 builder.assert_equal(f.witness_index, sum.witness_index, "assert_equal");
45
46 std::vector<fr<Builder>> fr_vec{ low, hi };
47 return convert_from_bn254_frs<Builder, fq<Builder>>(builder, fr_vec);
48}
49
50template fq<UltraCircuitBuilder> convert_to_grumpkin_fr<UltraCircuitBuilder>(UltraCircuitBuilder& builder,
52template fq<MegaCircuitBuilder> convert_to_grumpkin_fr<MegaCircuitBuilder>(MegaCircuitBuilder& builder,
53 const fr<MegaCircuitBuilder>& f);
54
55} // namespace bb::stdlib::field_conversion
#define BB_ASSERT_EQ(actual, expected,...)
Definition assert.hpp:59
bb::fr get_value() const
Given a := *this, compute its value given by a.v * a.mul + a.add.
Definition field.cpp:827
uint32_t witness_index
Definition field.hpp:132
AluTraceBuilder builder
Definition alu.test.cpp:123
grumpkin::fr convert_to_grumpkin_fr(const bb::fr &f)
Inner sum(Cont< Inner, Args... > const &in)
Definition container.hpp:70
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13