15#include <gtest/gtest.h>
27template <AccessType access_type>
29 const std::vector<bb::fr>& table_values,
35 access_type == AccessType::Read ? table_values[table_index] : table_values[table_index] +
bb::fr(1);
45 trace.push_back(read_op);
55 trace.push_back(read_op);
64 trace.push_back(read_op);
68template <
typename Builder_,
size_t TableSize_,
size_t NumReads_,
bool PerformConstantOps_>
struct ROMTestParams {
75template <
typename Builder_,
size_t table_size,
size_t num_reads,
bool perform_constant_ops>
class ROMTestingFunctions {
85 if constexpr (num_reads > 0 && table_size > 0) {
92 std::vector<std::string> labels = {
"None" };
93 if constexpr (num_reads > 0 && table_size > 0) {
94 labels.push_back(
"ReadValueIncremented");
103 std::vector<bb::fr> table_values;
104 table_values.reserve(table_size);
105 for (
size_t _i = 0; _i < table_size; _i++) {
110 std::vector<uint32_t> init_indices;
111 for (
const auto& val : table_values) {
114 init_indices.push_back(value_index);
121 if constexpr (table_size > 0) {
122 for (
size_t _i = 0; _i < num_reads; ++_i) {
125 bb::fr read_value = table_values[rom_index_to_read];
133 .index = index_for_read,
134 .
value = value_for_read };
136 trace.push_back(read_op);
138 if constexpr (perform_constant_ops) {
139 add_constant_ops<AccessType::Read>(table_size, table_values, witness_values,
trace);
150 switch (invalid_witness_target) {
154 if constexpr (num_reads > 0 && table_size > 0) {
159 const size_t read_value_witness_index = table_size + (random_read * 2) + 1;
160 witness_values[read_value_witness_index] +=
bb::fr(1);
166template <
typename Params>
168 public TestClass<ROMTestingFunctions<typename Params::Builder,
171 Params::perform_constant_ops>> {
176using ROMTestConfigs = testing::Types<ROMTestParams<UltraCircuitBuilder, 0, 0, false>,
189 TestFixture::template test_vk_independence<Flavor>();
194 TestFixture::test_tampering();
197template <
typename Builder_,
size_t TableSize_,
size_t NumReads_,
size_t NumWrites_,
bool PerformConstantOps_>
206template <
typename Builder_,
size_t table_size,
size_t num_reads,
size_t num_writes,
bool perform_constant_ops>
227 if constexpr (num_reads > 0 && table_size > 0) {
234 std::vector<std::string> labels = {
"None" };
235 if constexpr (num_reads > 0 && table_size > 0) {
236 labels.push_back(
"ReadValueIncremented");
248 std::vector<bb::fr> table_values;
249 table_values.reserve(table_size);
250 for (
size_t _i = 0; _i < table_size; _i++) {
255 std::vector<uint32_t> init_indices;
256 for (
size_t i = 0; i < table_size; ++i) {
257 const auto val = table_values[i];
259 init_indices.push_back(value_index);
263 size_t num_reads_remaining = num_reads;
264 size_t num_writes_remaining = num_writes;
268 while (num_reads_remaining + num_writes_remaining > 0) {
270 if (try_read && (num_reads_remaining > 0)) {
271 read_write_sequence.push_back(AccessType::Read);
272 num_reads_remaining--;
273 }
else if (num_writes_remaining > 0) {
274 read_write_sequence.push_back(AccessType::Write);
275 num_writes_remaining--;
278 for (
size_t _j = 0; _j < num_reads_remaining; _j++) {
279 read_write_sequence.push_back(AccessType::Read);
281 num_reads_remaining = 0;
286 if constexpr (table_size > 0) {
287 for (
auto& access_type : read_write_sequence) {
289 switch (access_type) {
290 case AccessType::Read: {
292 const uint32_t index_for_read =
294 bb::fr read_value = table_values[ram_index_to_read];
298 read_values.push_back({ .value = read_value, .witness_index = value_for_read });
303 trace.push_back(mem_op);
306 case AccessType::Write: {
308 const uint32_t index_to_write =
314 table_values[ram_index_to_write] = write_value;
319 trace.push_back(mem_op);
324 if constexpr (perform_constant_ops) {
325 add_constant_ops<AccessType::Read>(table_size, table_values, witness_values,
trace);
326 add_constant_ops<AccessType::Write>(table_size, table_values, witness_values,
trace);
339 switch (invalid_witness_target) {
343 if constexpr (num_reads > 0 && table_size > 0) {
347 const uint32_t witness_idx =
read_values[random_read_idx].witness_index;
348 witness_values[witness_idx] +=
bb::fr(1);
356template <
typename Params>
358 public TestClass<RAMTestingFunctions<typename Params::Builder,
362 Params::perform_constant_ops>> {
369 testing::Types<RAMTestParams<UltraCircuitBuilder, 0, 0, 0, false>,
394 TestFixture::template test_vk_independence<Flavor>();
399 TestFixture::test_tampering();
402template <CallDataType CallDataType_,
size_t CallDataSize_,
size_t NumReads_,
bool PerformConstantOps_>
410template <CallDataType calldata_type,
size_t calldata_size,
size_t num_reads,
bool perform_constant_ops>
422 static std::vector<std::string>
get_labels() {
return {
"None",
"ReadValueIncremented" }; };
429 std::vector<bb::fr> calldata_values;
430 calldata_values.reserve(calldata_size);
431 for (
size_t _i = 0; _i < calldata_size; _i++) {
436 std::vector<uint32_t> init_indices;
437 for (
size_t i = 0; i < calldata_size; ++i) {
439 init_indices.push_back(value_index);
445 for (
size_t idx = 0; idx < num_reads; ++idx) {
448 const uint32_t index_for_read =
450 bb::fr read_value = calldata_values[calldata_idx_to_read];
456 trace.push_back(mem_op);
458 if constexpr (perform_constant_ops) {
459 add_constant_ops<AccessType::Read>(calldata_size, calldata_values, witness_values,
trace);
464 .
init = init_indices, .trace =
trace, .type = BlockType::CallData, .calldata_id = calldata_type
472 switch (invalid_witness_target) {
478 const uint32_t witness_idx = memory_constraint.
trace[random_read_idx].index.index;
479 witness_values[witness_idx] +=
bb::fr(1);
488template <
typename Params>
490 public TestClass<CallDataTestingFunctions<Params::calldata_type,
491 Params::calldata_size,
493 Params::perform_constant_ops>> {
502 TestFixture::template test_vk_independence<MegaFlavor>();
507 TestFixture::test_tampering();
510template <
size_t returndata_size>
526 static std::vector<std::string>
get_labels() {
return {
"None" }; };
532 std::vector<bb::fr> returndata_values;
533 returndata_values.reserve(returndata_size);
534 for (
size_t _i = 0; _i < returndata_size; _i++) {
539 std::vector<uint32_t> init_indices;
540 for (
size_t i = 0; i < returndata_size; ++i) {
542 init_indices.push_back(value_index);
546 memory_constraint =
AcirConstraint{ .
init = init_indices, .trace = {}, .type = BlockType::ReturnData };
553 switch (invalid_witness_target) {
560static constexpr size_t RETURNDATA_SIZE = 10;
568 test_vk_independence<MegaFlavor>();
573using BuilderTypes = testing::Types<UltraCircuitBuilder, MegaCircuitBuilder>;
585 types_to_test = { { BlockType::ROM, CallDataType::None }, { BlockType::RAM, CallDataType::None } };
587 types_to_test = { { BlockType::ROM, CallDataType::None },
588 { BlockType::RAM, CallDataType::None },
589 { BlockType::CallData, CallDataType::Primary },
590 { BlockType::CallData, CallDataType::Secondary },
591 { BlockType::ReturnData, CallDataType::None } };
595 for (
auto type : types_to_test) {
600 .calldata_id =
type.second,
607 .block_constraints = { block },
614 auto circuit = create_circuit<Builder>(program);
#define BB_ASSERT_EQ(actual, expected,...)
testing::Types< ROMTestParams< UltraCircuitBuilder, 0, 0, false >, ROMTestParams< UltraCircuitBuilder, 10, 0, false >, ROMTestParams< UltraCircuitBuilder, 10, 0, true >, ROMTestParams< MegaCircuitBuilder, 10, 10, true >, ROMTestParams< MegaCircuitBuilder, 10, 20, true > > ROMTestConfigs
testing::Types< RAMTestParams< UltraCircuitBuilder, 0, 0, 0, false >, RAMTestParams< UltraCircuitBuilder, 10, 0, 0, false >, RAMTestParams< UltraCircuitBuilder, 10, 0, 0, true >, RAMTestParams< UltraCircuitBuilder, 10, 0, 10, false >, RAMTestParams< UltraCircuitBuilder, 10, 0, 10, true >, RAMTestParams< UltraCircuitBuilder, 10, 10, 0, false >, RAMTestParams< UltraCircuitBuilder, 10, 10, 0, true >, RAMTestParams< UltraCircuitBuilder, 10, 20, 10, true >, RAMTestParams< MegaCircuitBuilder, 0, 0, 0, false >, RAMTestParams< MegaCircuitBuilder, 10, 0, 0, false >, RAMTestParams< MegaCircuitBuilder, 10, 0, 0, true >, RAMTestParams< MegaCircuitBuilder, 10, 0, 10, false >, RAMTestParams< MegaCircuitBuilder, 10, 0, 10, true >, RAMTestParams< MegaCircuitBuilder, 10, 10, 0, false >, RAMTestParams< MegaCircuitBuilder, 10, 10, 0, true >, RAMTestParams< MegaCircuitBuilder, 10, 20, 10, true > > RAMTestConfigs
testing::Types< CallDataTestParams< CallDataType::Primary, 10, 5, false >, CallDataTestParams< CallDataType::Primary, 10, 5, true > > CallDataTestConfigs
void add_constant_ops(const size_t table_size, const std::vector< bb::fr > &table_values, WitnessVector &witness_values, std::vector< MemOp > &trace)
Utility method to add read/write operations with constant indices/values.
static std::vector< std::string > get_labels()
static std::vector< Target > get_all()
void generate_constraints(AcirConstraint &memory_constraint, WitnessVector &witness_values)
void invalidate_witness(AcirConstraint &memory_constraint, WitnessVector &witness_values, const InvalidWitness::Target &invalid_witness_target)
static void SetUpTestSuite()
static void SetUpTestSuite()
static std::vector< Target > get_all()
static std::vector< std::string > get_labels()
void invalidate_witness(AcirConstraint &memory_constraint, WitnessVector &witness_values, const InvalidWitness::Target &invalid_witness_target)
void generate_constraints(AcirConstraint &memory_constraint, WitnessVector &witness_values)
std::vector< WitnessValue > read_values
static void SetUpTestSuite()
static std::vector< Target > get_all()
static std::vector< std::string > get_labels()
static void generate_constraints(AcirConstraint &memory_constraint, WitnessVector &witness_values)
static void invalidate_witness(AcirConstraint &memory_constraint, WitnessVector &witness_values, const InvalidWitness::Target &invalid_witness_target)
static std::vector< Target > get_all()
static std::vector< std::string > get_labels()
void invalidate_witness(AcirConstraint &memory_constraint, WitnessVector &witness_values, const InvalidWitness::Target &invalid_witness_target)
void generate_constraints(AcirConstraint &memory_constraint, WitnessVector &witness_values)
static void SetUpTestSuite()
static bool check(const Builder &circuit)
Check the witness satisifies the circuit.
virtual uint32_t get_random_uint32()=0
RNG & get_debug_randomness(bool reset, std::uint_fast64_t seed)
std::filesystem::path bb_crs_path()
void init_file_crs_factory(const std::filesystem::path &path)
TEST_F(BoomerangGoblinRecursiveVerifierTests, graph_description_basic)
Construct and check a goblin recursive verification circuit.
TYPED_TEST_SUITE(BoomerangRecursiveVerifierTest, Flavors)
field< Bn254FrParams > fr
TYPED_TEST(ShpleminiTest, CorrectnessOfMultivariateClaimBatching)
MegaCircuitBuilder_< field< Bn254FrParams > > MegaCircuitBuilder
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
::testing::Types< UltraCircuitBuilder, MegaCircuitBuilder > BuilderTypes
static constexpr CallDataType calldata_type
static constexpr size_t calldata_size
static constexpr bool perform_constant_ops
static constexpr size_t num_reads
static constexpr bool perform_constant_ops
static constexpr size_t num_reads
static constexpr size_t num_writes
static constexpr size_t table_size
static constexpr bool perform_constant_ops
static constexpr size_t table_size
static constexpr size_t num_reads
static field random_element(numeric::RNG *engine=nullptr) noexcept