Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
straus_lookup_table.test.cpp
Go to the documentation of this file.
8#include <gtest/gtest.h>
9
10using namespace bb;
11
12namespace {
14}
15
16template <class Builder> class StrausLookupTableTest : public ::testing::Test {
17 public:
22 using Curve = typename Builder::EmbeddedCurve;
23 using Group = typename Curve::Group;
24 using Element = typename Curve::Element;
27};
28
29using CircuitTypes = ::testing::Types<bb::UltraCircuitBuilder, bb::MegaCircuitBuilder>;
31
33
35
39TYPED_TEST(StrausLookupTableTest, TestTableConstuction)
40{
41 using Builder = TypeParam;
42 using cycle_group = typename TestFixture::cycle_group;
43 using straus_lookup_table = typename TestFixture::straus_lookup_table;
44 using Element = typename TestFixture::Element;
45
47
48 auto base_point_native = Element::random_element(&engine);
49 auto offset_gen_native = Element::random_element(&engine);
50
51 auto base_point = cycle_group::from_witness(&builder, base_point_native);
52 auto offset_gen = cycle_group::from_witness(&builder, offset_gen_native);
53
54 const size_t table_bits = 4;
55 straus_lookup_table table(&builder, base_point, offset_gen, table_bits);
56
58 check_circuit_and_gate_count(builder, 184);
59 } else {
60 check_circuit_and_gate_count(builder, 181);
61 }
62}
63
68{
69 using Builder = TypeParam;
70 using cycle_group = typename TestFixture::cycle_group;
71 using straus_lookup_table = typename TestFixture::straus_lookup_table;
72 using field_t = typename TestFixture::field_t;
73 using Element = typename TestFixture::Element;
74 using AffineElement = typename TestFixture::AffineElement;
75
77
78 auto base_point_native = Element::random_element(&engine);
79 auto offset_gen_native = Element::random_element(&engine);
80
81 auto base_point = cycle_group::from_witness(&builder, base_point_native);
82 auto offset_gen = cycle_group::from_witness(&builder, offset_gen_native);
83
84 const size_t table_bits = 4;
85 straus_lookup_table table(&builder, base_point, offset_gen, table_bits);
86
87 // Read from the table at each index and verify the result vs expected value
88 const size_t table_size = (1ULL << table_bits);
89 for (size_t i = 0; i < table_size; i++) {
90 auto index = field_t::from_witness(&builder, i);
91 auto result = table.read(index);
92
93 // Expected value: offset_gen + i * base_point
94 AffineElement expected = AffineElement(offset_gen_native + (base_point_native * i));
95 EXPECT_EQ(result.get_value(), expected);
96 }
97
98 // Gate count difference explanation:
99 // Mega pre-adds constants {0, 3, 4, 8} for ECC op codes during construction. When setting ROM elements at indices
100 // {3, 4, 8}, Mega doesn't need to add a corresponding gate for the constant value, whereas Ultra does.
102 check_circuit_and_gate_count(builder, 216);
103 } else {
104 check_circuit_and_gate_count(builder, 213);
105 }
106}
107
111TYPED_TEST(StrausLookupTableTest, TestWithProvidedHints)
112{
113 using Builder = TypeParam;
114 using cycle_group = typename TestFixture::cycle_group;
115 using straus_lookup_table = typename TestFixture::straus_lookup_table;
116 using field_t = typename TestFixture::field_t;
117 using Element = typename TestFixture::Element;
118 using AffineElement = typename TestFixture::AffineElement;
119
121
122 auto base_point_native = Element::random_element(&engine);
123 auto offset_gen_native = Element::random_element(&engine);
124
125 auto base_point = cycle_group::from_witness(&builder, base_point_native);
126 auto offset_gen = cycle_group::from_witness(&builder, offset_gen_native);
127
128 const size_t table_bits = 3;
129
130 // Compute hints explicitly
131 auto hints_elements = straus_lookup_table::compute_native_table(base_point_native, offset_gen_native, table_bits);
132
133 std::vector<AffineElement> hints_affine;
134 // Skip the first element (point_table[0]) and convert the rest to affine
135 // because hints[i] should be the hint for point_table[i+1]
136 for (size_t i = 1; i < hints_elements.size(); ++i) {
137 hints_affine.push_back(AffineElement(hints_elements[i]));
138 }
139
140 // Create table with provided hints
141 straus_lookup_table table(&builder, base_point, offset_gen, table_bits, hints_affine);
142
143 // Verify reading works correctly
144 auto index_val = 5;
145 auto index = field_t::from_witness(&builder, index_val);
146 auto result = table.read(index);
147
148 AffineElement expected = AffineElement(offset_gen_native + (base_point_native * index_val));
149 EXPECT_EQ(result.get_value(), expected);
150
151 // Gate count difference explanation:
152 // Same as TestTableRead - ROM with 8 elements (indices 0-7).
154 check_circuit_and_gate_count(builder, 98);
155 } else {
156 check_circuit_and_gate_count(builder, 96);
157 }
158}
159
163TYPED_TEST(StrausLookupTableTest, TestInfinityBasePoint)
164{
165 using Builder = TypeParam;
166 using cycle_group = typename TestFixture::cycle_group;
167 using straus_lookup_table = typename TestFixture::straus_lookup_table;
168 using field_t = typename TestFixture::field_t;
169 using Element = typename TestFixture::Element;
170 using AffineElement = typename TestFixture::AffineElement;
171 using Group = typename TestFixture::Group;
172
174
175 auto base_point_native = Group::point_at_infinity;
176 auto offset_gen_native = Element::random_element(&engine);
177
178 auto base_point = cycle_group::from_witness(&builder, base_point_native);
179 auto offset_gen = cycle_group::from_witness(&builder, offset_gen_native);
180
181 const size_t table_bits = 2;
182 straus_lookup_table table(&builder, base_point, offset_gen, table_bits);
183
184 // All entries should be just the offset generator since base_point is infinity
185 for (size_t i = 0; i < (1ULL << table_bits); i++) {
186 auto index = field_t::from_witness(&builder, i);
187 auto result = table.read(index);
188 EXPECT_EQ(result.get_value(), AffineElement(offset_gen_native));
189 }
190
191 // Gate count difference explanation:
192 // Same as TestTableRead - ROM with 4 elements (indices 0-3).
194 check_circuit_and_gate_count(builder, 60);
195 } else {
196 check_circuit_and_gate_count(builder, 59);
197 }
198}
typename Curve::AffineElement AffineElement
typename Curve::Element Element
typename Curve::ScalarField ScalarField
typename Builder::EmbeddedCurve Curve
typename Group::element Element
Definition bn254.hpp:21
typename bb::g1 Group
Definition bn254.hpp:20
typename Group::affine_element AffineElement
Definition bn254.hpp:22
bb::fr ScalarField
Definition bn254.hpp:18
cycle_group represents a group Element of the proving system's embedded curve, i.e....
static field_t from_witness(Builder *ctx, const bb::fr &input)
Definition field.hpp:432
straus_lookup_table computes a lookup table of size 1 << table_bits
AluTraceBuilder builder
Definition alu.test.cpp:123
testing::Types< bb::UltraCircuitBuilder, bb::MegaCircuitBuilder > CircuitTypes
RNG & get_debug_randomness(bool reset, std::uint_fast64_t seed)
Definition engine.cpp:190
void check_circuit_and_gate_count(Builder &builder, uint32_t expected_gates_without_base)
Utility function for gate count checking and circuit verification.
Entry point for Barretenberg command-line interface.
TYPED_TEST_SUITE(ShpleminiTest, TestSettings)
TYPED_TEST(ShpleminiTest, CorrectnessOfMultivariateClaimBatching)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
This file contains part of the logic for the Origin Tag mechanism that tracks the use of in-circuit p...
#define STANDARD_TESTING_TAGS
Curve::Element Element