4#include <gtest/gtest.h>
9template <
typename Builder>
class FieldUtilsTests :
public ::testing::Test {
15using CircuitTypes = ::testing::Types<bb::UltraCircuitBuilder, bb::MegaCircuitBuilder>;
28 using field_t =
typename TestFixture::field_t;
29 using native =
typename TestFixture::native;
32 constexpr size_t lo_bits = 128;
45 EXPECT_EQ(reconstructed, modulus);
59TYPED_TEST(FieldUtilsTests, ValidateSplitAcceptsModulusMinusOne)
62 using field_t =
typename TestFixture::field_t;
63 using native =
typename TestFixture::native;
66 constexpr size_t lo_bits = 128;
80 EXPECT_EQ(reconstructed,
value);
97 using field_t =
typename TestFixture::field_t;
98 using native =
typename TestFixture::native;
101 constexpr size_t lo_bits = 128;
116 EXPECT_FALSE(
builder.failed());
126 using field_t =
typename TestFixture::field_t;
127 using native =
typename TestFixture::native;
130 constexpr size_t lo_bits = 128;
142 uint256_t reconstructed = lo_val + (hi_val << lo_bits);
145 EXPECT_EQ(reconstructed, expected);
148 EXPECT_FALSE(
builder.failed());
159TYPED_TEST(FieldUtilsTests, ValidateSplitConstantLoWitnessHiRejectsModulus)
162 using field_t =
typename TestFixture::field_t;
163 using native =
typename TestFixture::native;
166 constexpr size_t lo_bits = 128;
174 auto lo =
field_t(native(lo_val));
178 EXPECT_TRUE(lo.is_constant());
179 EXPECT_FALSE(hi.is_constant());
192TYPED_TEST(FieldUtilsTests, ValidateSplitWitnessLoConstantHiRejectsModulus)
195 using field_t =
typename TestFixture::field_t;
196 using native =
typename TestFixture::native;
199 constexpr size_t lo_bits = 128;
208 auto hi =
field_t(native(hi_val));
211 EXPECT_FALSE(lo.is_constant());
212 EXPECT_TRUE(hi.is_constant());
234TYPED_TEST(FieldUtilsTests, ValidateSplitRejectsModulusWithCorruptedBorrowZero)
237 using field_t =
typename TestFixture::field_t;
238 using native =
typename TestFixture::native;
241 constexpr size_t lo_bits = 128;
242 const size_t hi_bits = native::modulus.get_msb() + 1 - lo_bits;
255 builder.create_small_range_constraint(borrow.get_witness_index(), 1,
"borrow");
260 field_t hi_diff = (-hi + r_hi) - borrow;
261 field_t lo_diff = (-lo + (r_lo - 1)) + (borrow * (
uint256_t(1) << lo_bits));
static bool check(const Builder &circuit)
Check the witness satisifies the circuit.
constexpr uint256_t slice(uint64_t start, uint64_t end) const
void create_range_constraint(size_t num_bits, std::string const &msg="field_t::range_constraint") const
Let x = *this.normalize(), constrain x.v < 2^{num_bits}.
static field_t from_witness(Builder *ctx, const bb::fr &input)
stdlib::field_t< Builder > field_t
constexpr T get_msb(const T in)
std::pair< field_t< Builder >, field_t< Builder > > split_unique(const field_t< Builder > &field, const size_t lo_bits, const bool skip_range_constraints)
Split a bn254 scalar field element into unique lo and hi limbs.
void validate_split_in_field_unsafe(const field_t< Builder > &lo, const field_t< Builder > &hi, const size_t lo_bits, const uint256_t &field_modulus)
Validates that lo + hi * 2^lo_bits < field_modulus (assuming range constraints on lo and hi)
Entry point for Barretenberg command-line interface.
TYPED_TEST_SUITE(CommitmentKeyTest, Curves)
TYPED_TEST(CommitmentKeyTest, CommitToZeroPoly)
testing::Types< bb::MegaCircuitBuilder, bb::UltraCircuitBuilder > CircuitTypes
General class for prime fields see Prime field documentation["field documentation"] for general imple...