5#include <gtest/gtest.h>
26 template <
typename T,
typename CreateFn>
32 for (
size_t i = 0; i < num_elements; ++i) {
34 auto native_value = create_native();
35 auto native_fields = NativeCodec::serialize_to_fields(native_value);
39 for (
const auto& f : native_fields) {
44 [[maybe_unused]]
auto deserialized = Codec::template deserialize_from_fields<T>(witness_fields);
47 check_circuit_and_gate_count(
builder, expected_gates);
53 size_t len = Codec::template calc_num_fields<T>();
55 EXPECT_EQ(
len, frs.size());
56 auto out = Codec::template deserialize_from_fields<T>(frs);
58 EXPECT_EQ(in.get_value(),
out.get_value());
60 auto ctx = in.get_context();
67 size_t len = Codec::template calc_num_fields<T>();
68 auto frs = Codec::template serialize_to_fields<T>(x);
69 EXPECT_EQ(
len, frs.size());
70 auto y = Codec::template deserialize_from_fields<T>(frs);
71 EXPECT_EQ(x.size(), y.size());
72 for (
auto [val1, val2] :
zip_view(x, y)) {
73 EXPECT_EQ(val1.get_value(), val2.get_value());
78using BuilderTypes = testing::Types<UltraCircuitBuilder, MegaCircuitBuilder>;
90 std::string(
"9a807b615c4d3e2fa0b1c2d3e4f56789fedcba9876543210abcdef0123456789"));
92 this->check_conversion(field_element);
96 this->check_conversion(field_element);
98 field_element_val =
bb::fr(1);
100 this->check_conversion(field_element);
113 std::string(
"9a807b615c4d3e2fa0b1c2d3e4f56789fedcba9876543210abcdef0123456789"));
125 const uint256_t raw(std::string(
"9a807b615c4d3e2fa0b1c2d3e4f56789fedcba9876543210abcdef0123456789"));
131 EXPECT_EQ(
uint256_t(Codec::template convert_short_challenge<
fr<Builder>>(chal).get_value()), val);
132 EXPECT_EQ(Codec::template convert_short_challenge<
fq<Builder>>(chal).get_value(),
uint512_t(val));
167 this->check_conversion(group_element);
174 this->check_conversion(group_element);
179 const size_t num_points = 50;
182 for (
size_t i = 0; i < num_points; i++) {
186 this->check_conversion(group_element);
194 this->check_conversion(group_element);
207 this->check_conversion(group_element);
224 this->check_conversion(group_element);
228 const size_t num_points = 50;
231 for (
size_t i = 0; i < num_points; i++) {
235 this->check_conversion(group_element);
245 this->check_conversion(group_element,
false);
255 this->check_conversion(group_element);
270 Codec::template deserialize_from_fields<bn254_element<Builder>>(zeros);
272 EXPECT_TRUE(point_at_infinity.get_value().is_point_at_infinity());
279 Codec::template deserialize_from_fields<grumpkin_element<Builder>>(zeros);
298 this->check_conversion_iterable(array_of_frs_4);
307 this->check_conversion_iterable(array_of_frs_7);
322 static_cast<bb::fq>(std::string(
"9a807b615c4d3e2fa0b1c2d3e4f56789fedcba9876543210abcdef0123456789"))),
325 static_cast<bb::fq>(std::string(
"2bf1eaf87f7d27e8dc4056e9af975985bccc89077a21891d6c7b6ccce0631f95"))),
328 static_cast<bb::fq>(std::string(
"9a807b615c4d3e2fa0b1c2d3e4f56789fedcba9876543210abcdef0123456789"))),
331 static_cast<bb::fq>(std::string(
"018555a8eb50cf07f64b019ebaf3af3c925c93e631f3ecd455db07bbb52bbdd3"))),
333 this->check_conversion_iterable(array_of_fqs_4);
348 this->check_conversion_iterable(univariate);
363 static_cast<bb::fq>(std::string(
"9a807b615c4d3e2fa0b1c2d3e4f56789fedcba9876543210abcdef0123456789"))),
366 static_cast<bb::fq>(std::string(
"2bf1eaf87f7d27e8dc4056e9af975985bccc89077a21891d6c7b6ccce0631f95"))),
369 static_cast<bb::fq>(std::string(
"018555a8eb50cf07f64b019ebaf3af3c925c93e631f3ecd455db07bbb52bbdd3"))),
372 static_cast<bb::fq>(std::string(
"2bf1eaf87f7d27e8dc4056e9af975985bccc89077a21891d6c7b6ccce0631f95"))) }
374 this->check_conversion_iterable(univariate);
388 this->
template check_deserialization_gate_count<fr<TypeParam>>([] {
return bb::fr::random_element(); }, 0);
397 this->
template check_deserialization_gate_count<fq<TypeParam>>([] {
return bb::fq::random_element(); }, 3513);
406 this->
template check_deserialization_gate_count<fq<TypeParam>>([] {
return bb::fq::random_element(); }, 3913, 10);
419 this->
template check_deserialization_gate_count<bn254_element<Builder>>(
420 [] {
return curve::BN254::AffineElement::random_element(); }, expected);
431 this->
template check_deserialization_gate_count<bn254_element<Builder>>(
432 [] {
return curve::BN254::AffineElement::random_element(); }, expected, 10);
441 this->
template check_deserialization_gate_count<grumpkin_element<TypeParam>>(
442 [] {
return curve::Grumpkin::AffineElement::random_element(); }, 10);
451 constexpr size_t SIZE = 8;
452 this->
template check_deserialization_gate_count<std::array<fr<TypeParam>, SIZE>>(
455 for (
size_t i = 0; i < SIZE; ++i) {
469 constexpr size_t LENGTH = 8;
470 this->
template check_deserialization_gate_count<Univariate<fr<TypeParam>, LENGTH>>(
473 for (
size_t i = 0; i < LENGTH; ++i) {
498 std::vector<bb::fr> native_fields = { low_limb, high_limb };
499 EXPECT_THROW(FrCodec::deserialize_from_fields<bb::fq>(native_fields), std::runtime_error);
511 [[maybe_unused]]
auto bigfield_val = Codec::template deserialize_from_fields<fq<Builder>>(circuit_fields);
535 constexpr uint64_t NUM_LIMB_BITS = 68;
540 const uint256_t x_hi = modulus >> (NUM_LIMB_BITS * 2);
545 EXPECT_THROW(FrCodec::deserialize_from_fields<curve::BN254::AffineElement>(native_fields), std::runtime_error);
556 [[maybe_unused]]
auto point = Codec::template deserialize_from_fields<bn254_element>(circuit_fields);
575 constexpr uint64_t NUM_LIMB_BITS = 68;
576 constexpr uint64_t LOW_BITS = NUM_LIMB_BITS * 2;
580 return {
value & LOW_MASK,
value >> LOW_BITS };
586 const auto [low_limb, high_limb] = split_to_limbs(
value);
589 std::vector<bb::fr> native_fields = {
bb::fr(low_limb),
bb::fr(high_limb) };
590 auto native_result = FrCodec::deserialize_from_fields<bb::fq>(native_fields);
597 [[maybe_unused]]
auto circuit_result = Codec::template deserialize_from_fields<fq_ct>(circuit_fields);
604 const auto [low_limb, high_limb] = split_to_limbs(
value);
607 std::vector<bb::fr> native_fields = {
bb::fr(low_limb),
bb::fr(high_limb) };
608 EXPECT_THROW(FrCodec::deserialize_from_fields<bb::fq>(native_fields), std::runtime_error);
617 [[maybe_unused]]
auto circuit_result = Codec::template deserialize_from_fields<fq_ct>(circuit_fields);
625 const auto [low_limb, high_limb] = split_to_limbs(
value);
632 std::vector<bb::fr> native_fields = {
bb::fr(low_limb),
bb::fr(high_limb) };
633 EXPECT_THROW(FrCodec::deserialize_from_fields<bb::fq>(native_fields), std::runtime_error);
642 [[maybe_unused]]
auto circuit_result = Codec::template deserialize_from_fields<fq_ct>(circuit_fields);
#define EXPECT_THROW_WITH_MESSAGE(code, expectedMessageRegex)
#define BB_DISABLE_ASSERTS()
static bool check(const Builder &circuit)
Check the witness satisifies the circuit.
A univariate polynomial represented by its values on {0, 1,..., domain_end - 1}.
typename Group::affine_element AffineElement
typename Group::affine_element AffineElement
constexpr bool is_point_at_infinity() const noexcept
constexpr uint256_t slice(uint64_t start, uint64_t end) const
static std::vector< fr > serialize_to_fields(const T &val)
Core stdlib Transcript serialization method.
cycle_group represents a group Element of the proving system's embedded curve, i.e....
AffineElement get_value() const
void check_conversion_iterable(T x)
void check_conversion(T in, bool valid_circuit=true)
void check_deserialization_gate_count(CreateFn create_native, uint32_t expected_gates, size_t num_elements=1)
Helper to test gate counts for deserialization.
static field_t from_witness(Builder *ctx, const bb::fr &input)
uintx< uint256_t > uint512_t
testing::Types< UltraCircuitBuilder, MegaCircuitBuilder > BuilderTypes
element< Builder, fq< Builder >, fr< Builder >, curve::BN254::Group > bn254_element
void check_circuit_and_gate_count(Builder &builder, uint32_t expected_gates_without_base)
Utility function for gate count checking and circuit verification.
std::conditional_t< IsGoblinBigGroup< C, Fq, Fr, G >, element_goblin::goblin_element< C, goblin_field< C >, Fr, G >, element_default::element< C, Fq, Fr, G > > element
element wraps either element_default::element or element_goblin::goblin_element depending on parametr...
TYPED_TEST_SUITE(CommitmentKeyTest, Curves)
field< Bn254FrParams > fr
TYPED_TEST(CommitmentKeyTest, CommitToZeroPoly)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
bb::VectorAffineElementPushSpan< BaseParams > out
StdlibCodec for in-circuit (recursive) verification transcript handling.
static constexpr uint256_t modulus
static field random_element(numeric::RNG *engine=nullptr) noexcept
static constexpr uint256_t modulus_minus_two