Skip to content

Commit acaff27

Browse files
AztecBotaztec-bot
authored andcommitted
fix(bb): assign unique secp256r1 lookup table indices
(cherry picked from commit c6ab912)
1 parent 0a5df39 commit acaff27

5 files changed

Lines changed: 57 additions & 13 deletions

File tree

barretenberg/cpp/src/barretenberg/circuit_checker/ultra_circuit_builder_lookup.test.cpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
#include <gtest/gtest.h>
66
#include <unordered_map>
7+
#include <unordered_set>
78

89
using namespace bb;
910

@@ -121,6 +122,40 @@ TEST_F(UltraCircuitBuilderLookup, DifferentTablesGetUniqueIndices)
121122
EXPECT_EQ(builder.get_num_lookup_tables(), 3UL);
122123
}
123124

125+
TEST_F(UltraCircuitBuilderLookup, Secp256r1FixedBaseTablesGetUniquePositiveIndices)
126+
{
127+
Builder builder;
128+
std::unordered_set<size_t> table_indices;
129+
130+
const auto first_id = static_cast<size_t>(plookup::BasicTableId::SECP256R1_FIXED_BASE_XLO_0);
131+
const auto end_id = static_cast<size_t>(plookup::BasicTableId::SECP256R1_FIXED_BASE_END);
132+
for (size_t id = first_id; id < end_id; ++id) {
133+
const auto& table = builder.get_table(static_cast<plookup::BasicTableId>(id));
134+
EXPECT_GT(table.table_index, 0UL);
135+
EXPECT_TRUE(table_indices.insert(table.table_index).second);
136+
}
137+
138+
EXPECT_NO_THROW(builder.finalize_circuit());
139+
}
140+
141+
TEST_F(UltraCircuitBuilderLookup, FinalizationRejectsDuplicateTableIndices)
142+
{
143+
Builder builder;
144+
builder.get_table(plookup::BasicTableId::UINT_XOR_SLICE_6_ROTATE_0);
145+
builder.get_table(plookup::BasicTableId::UINT_AND_SLICE_6_ROTATE_0);
146+
builder.get_lookup_tables()[1].table_index = builder.get_lookup_tables()[0].table_index;
147+
148+
EXPECT_THROW_OR_ABORT(builder.finalize_circuit(), "Lookup table indices must be unique within a circuit");
149+
}
150+
151+
TEST_F(UltraCircuitBuilderLookup, FinalizationRejectsZeroTableIndex)
152+
{
153+
Builder builder;
154+
builder.get_table(plookup::BasicTableId::UINT_XOR_SLICE_6_ROTATE_0).table_index = 0;
155+
156+
EXPECT_THROW_OR_ABORT(builder.finalize_circuit(), "Lookup table indices must be positive");
157+
}
158+
124159
// Verifies correct behavior when key_b_index is not provided (2-to-1 lookup without second index)
125160
TEST_F(UltraCircuitBuilderLookup, NoKeyBIndex)
126161
{

barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/plookup_tables/plookup_tables.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -285,22 +285,22 @@ BasicTable create_basic_table(const BasicTableId id, const size_t index)
285285
if (id_var >= static_cast<size_t>(SECP256R1_FIXED_BASE_XLO_0) &&
286286
id_var < static_cast<size_t>(SECP256R1_FIXED_BASE_XHI_0)) {
287287
return secp256r1_fixed_base::table::generate_basic_table_runtime<secp256r1_fixed_base::table::AXIS_XLO>(
288-
id, id_var - static_cast<size_t>(SECP256R1_FIXED_BASE_XLO_0));
288+
id, id_var - static_cast<size_t>(SECP256R1_FIXED_BASE_XLO_0), index);
289289
}
290290
if (id_var >= static_cast<size_t>(SECP256R1_FIXED_BASE_XHI_0) &&
291291
id_var < static_cast<size_t>(SECP256R1_FIXED_BASE_YLO_0)) {
292292
return secp256r1_fixed_base::table::generate_basic_table_runtime<secp256r1_fixed_base::table::AXIS_XHI>(
293-
id, id_var - static_cast<size_t>(SECP256R1_FIXED_BASE_XHI_0));
293+
id, id_var - static_cast<size_t>(SECP256R1_FIXED_BASE_XHI_0), index);
294294
}
295295
if (id_var >= static_cast<size_t>(SECP256R1_FIXED_BASE_YLO_0) &&
296296
id_var < static_cast<size_t>(SECP256R1_FIXED_BASE_YHI_0)) {
297297
return secp256r1_fixed_base::table::generate_basic_table_runtime<secp256r1_fixed_base::table::AXIS_YLO>(
298-
id, id_var - static_cast<size_t>(SECP256R1_FIXED_BASE_YLO_0));
298+
id, id_var - static_cast<size_t>(SECP256R1_FIXED_BASE_YLO_0), index);
299299
}
300300
if (id_var >= static_cast<size_t>(SECP256R1_FIXED_BASE_YHI_0) &&
301301
id_var < static_cast<size_t>(SECP256R1_FIXED_BASE_END)) {
302302
return secp256r1_fixed_base::table::generate_basic_table_runtime<secp256r1_fixed_base::table::AXIS_YHI>(
303-
id, id_var - static_cast<size_t>(SECP256R1_FIXED_BASE_YHI_0));
303+
id, id_var - static_cast<size_t>(SECP256R1_FIXED_BASE_YHI_0), index);
304304
}
305305
switch (id) {
306306
case AES_SPARSE_MAP: {

barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/plookup_tables/secp256r1_fixed_base.cpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -143,17 +143,18 @@ template <table::AxisIndex axis> generate_fn_ptr generate_fn_for_window(size_t w
143143
}
144144
} // namespace
145145

146-
template <table::AxisIndex axis> BasicTable table::generate_basic_table_runtime(BasicTableId id, size_t window_idx)
146+
template <table::AxisIndex axis>
147+
BasicTable table::generate_basic_table_runtime(BasicTableId id, size_t window_idx, size_t table_index)
147148
{
148149
BB_ASSERT_LT(window_idx, NUM_WINDOWS);
149-
return generate_fn_for_window<axis>(window_idx)(id, window_idx);
150+
return generate_fn_for_window<axis>(window_idx)(id, table_index);
150151
}
151152

152153
// Explicit instantiations for the four axes.
153-
template BasicTable table::generate_basic_table_runtime<table::AXIS_XLO>(BasicTableId, size_t);
154-
template BasicTable table::generate_basic_table_runtime<table::AXIS_XHI>(BasicTableId, size_t);
155-
template BasicTable table::generate_basic_table_runtime<table::AXIS_YLO>(BasicTableId, size_t);
156-
template BasicTable table::generate_basic_table_runtime<table::AXIS_YHI>(BasicTableId, size_t);
154+
template BasicTable table::generate_basic_table_runtime<table::AXIS_XLO>(BasicTableId, size_t, size_t);
155+
template BasicTable table::generate_basic_table_runtime<table::AXIS_XHI>(BasicTableId, size_t, size_t);
156+
template BasicTable table::generate_basic_table_runtime<table::AXIS_YLO>(BasicTableId, size_t, size_t);
157+
template BasicTable table::generate_basic_table_runtime<table::AXIS_YHI>(BasicTableId, size_t, size_t);
157158

158159
namespace {
159160
// Returns `&table::get_values<axis, window_idx>` for a runtime (axis, window_idx). The per-axis 32-entry

barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/plookup_tables/secp256r1_fixed_base.hpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -116,10 +116,11 @@ class table : public Secp256r1FixedBaseParams {
116116
static BasicTable generate_basic_table(BasicTableId id, size_t table_index);
117117

118118
/**
119-
* @brief Runtime dispatch helper used by plookup_tables.cpp::create_basic_table. Given an axis and a
120-
* runtime window_idx ∈ [0, NUM_WINDOWS), instantiate the corresponding generator.
119+
* @brief Runtime dispatch helper used by plookup_tables.cpp::create_basic_table. Selects table contents using
120+
* window_idx and assigns the independently supplied circuit-local table_index.
121121
*/
122-
template <AxisIndex axis> static BasicTable generate_basic_table_runtime(BasicTableId id, size_t table_index);
122+
template <AxisIndex axis>
123+
static BasicTable generate_basic_table_runtime(BasicTableId id, size_t window_idx, size_t table_index);
123124

124125
/**
125126
* @brief Construct one of the 10 MultiTables described in the file-header docstring.

barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_circuit_builder.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,13 @@ template <typename ExecutionTrace> void UltraCircuitBuilder_<ExecutionTrace>::fi
5151
* our circuit is finalized, and we must not to execute these functions again.
5252
*/
5353
if (!this->circuit_finalized) {
54+
std::unordered_set<size_t> table_indices;
55+
for (const auto& table : lookup_tables) {
56+
BB_ASSERT_GT(table.table_index, 0U, "Lookup table indices must be positive");
57+
BB_ASSERT(table_indices.insert(table.table_index).second,
58+
"Lookup table indices must be unique within a circuit");
59+
}
60+
5461
process_non_native_field_multiplications();
5562
#ifndef ULTRA_FUZZ
5663
this->rom_ram_logic.process_ROM_arrays(this);

0 commit comments

Comments
 (0)