14#include <gtest/gtest.h>
26template <AccessType access_type>
28 const std::vector<bb::fr>& table_values,
34 access_type == AccessType::Read ? table_values[table_index] : table_values[table_index] +
bb::fr(1);
44 trace.push_back(read_op);
54 trace.push_back(read_op);
63 trace.push_back(read_op);
67template <
typename Builder_,
size_t TableSize_,
size_t NumReads_,
bool PerformConstantOps_>
struct ROMTestParams {
74template <
typename Builder_,
size_t table_size,
size_t num_reads,
bool perform_constant_ops>
class ROMTestingFunctions {
84 if constexpr (num_reads > 0 && table_size > 0) {
91 std::vector<std::string> labels = {
"None" };
92 if constexpr (num_reads > 0 && table_size > 0) {
93 labels.push_back(
"ReadValueIncremented");
104 std::vector<bb::fr> table_values;
105 table_values.reserve(table_size);
106 for (
size_t _i = 0; _i < table_size; _i++) {
111 std::vector<uint32_t> init_indices;
112 for (
const auto& val : table_values) {
115 init_indices.push_back(value_index);
122 if constexpr (table_size > 0) {
123 for (
size_t _i = 0; _i < num_reads; ++_i) {
126 bb::fr read_value = table_values[rom_index_to_read];
134 .index = index_for_read,
135 .
value = value_for_read };
137 trace.push_back(read_op);
139 if constexpr (perform_constant_ops) {
140 add_constant_ops<AccessType::Read>(table_size, table_values, witness_values,
trace);
152 switch (invalid_witness_target) {
156 if constexpr (num_reads > 0 && table_size > 0) {
161 const size_t read_value_witness_index = table_size + (random_read * 2) + 1;
162 witness_values[read_value_witness_index] +=
bb::fr(1);
167 return { memory_constraint, witness_values };
170template <
typename Params>
172 public TestClass<ROMTestingFunctions<typename Params::Builder,
175 Params::perform_constant_ops>> {
180using ROMTestConfigs = testing::Types<ROMTestParams<UltraCircuitBuilder, 0, 0, false>,
198 TestFixture::template test_vk_independence<Flavor>();
203 TestFixture::test_tampering();
206template <
typename Builder_,
size_t TableSize_,
size_t NumReads_,
size_t NumWrites_,
bool PerformConstantOps_>
215template <
typename Builder_,
size_t table_size,
size_t num_reads,
size_t num_writes,
bool perform_constant_ops>
233 if constexpr (num_reads > 0 && table_size > 0) {
240 std::vector<std::string> labels = {
"None" };
241 if constexpr (num_reads > 0 && table_size > 0) {
242 labels.push_back(
"ReadValueIncremented");
253 std::vector<bb::fr> table_values;
254 table_values.reserve(table_size);
255 for (
size_t _i = 0; _i < table_size; _i++) {
260 std::vector<uint32_t> init_indices;
261 for (
size_t i = 0; i < table_size; ++i) {
262 const auto val = table_values[i];
264 init_indices.push_back(value_index);
268 size_t num_reads_remaining = num_reads;
269 size_t num_writes_remaining = num_writes;
273 while (num_reads_remaining + num_writes_remaining > 0) {
275 if (try_read && (num_reads_remaining > 0)) {
276 read_write_sequence.push_back(AccessType::Read);
277 num_reads_remaining--;
278 }
else if (num_writes_remaining > 0) {
279 read_write_sequence.push_back(AccessType::Write);
280 num_writes_remaining--;
283 for (
size_t _j = 0; _j < num_reads_remaining; _j++) {
284 read_write_sequence.push_back(AccessType::Read);
286 num_reads_remaining = 0;
291 if constexpr (table_size > 0) {
292 for (
auto& access_type : read_write_sequence) {
294 switch (access_type) {
295 case AccessType::Read: {
297 const uint32_t index_for_read =
299 bb::fr read_value = table_values[ram_index_to_read];
305 trace.push_back(mem_op);
308 case AccessType::Write: {
310 const uint32_t index_to_write =
316 table_values[ram_index_to_write] = write_value;
321 trace.push_back(mem_op);
326 if constexpr (perform_constant_ops) {
327 add_constant_ops<AccessType::Read>(table_size, table_values, witness_values,
trace);
328 add_constant_ops<AccessType::Write>(table_size, table_values, witness_values,
trace);
341 switch (invalid_witness_target) {
345 if constexpr (num_reads > 0 && table_size > 0) {
348 while (memory_constraint.trace[random_read_idx].access_type != AccessType::Read) {
352 const uint32_t witness_idx = memory_constraint.trace[random_read_idx].value.index;
353 witness_values[witness_idx] +=
bb::fr(1);
358 return { memory_constraint, witness_values };
362template <
typename Params>
364 public TestClass<RAMTestingFunctions<typename Params::Builder,
368 Params::perform_constant_ops>> {
375 testing::Types<RAMTestParams<UltraCircuitBuilder, 0, 0, 0, false>,
400 TestFixture::template test_vk_independence<Flavor>();
405 TestFixture::test_tampering();
408template <CallDataType CallDataType_,
size_t CallDataSize_,
size_t NumReads_,
bool PerformConstantOps_>
416template <CallDataType calldata_type,
size_t calldata_size,
size_t num_reads,
bool perform_constant_ops>
428 if constexpr (num_reads > 0) {
436 if constexpr (num_reads > 0) {
437 return {
"None",
"ReadValueIncremented" };
449 std::vector<bb::fr> calldata_values;
456 std::vector<uint32_t> init_indices;
459 init_indices.push_back(value_index);
466 for (
size_t idx = 0; idx < num_reads; ++idx) {
469 const uint32_t index_for_read =
471 bb::fr read_value = calldata_values[calldata_idx_to_read];
477 trace.push_back(mem_op);
480 if constexpr (perform_constant_ops) {
481 add_constant_ops<AccessType::Read>(
calldata_size, calldata_values, witness_values,
trace);
486 .
init = init_indices, .trace =
trace, .type = BlockType::CallData, .calldata_id = calldata_type
495 switch (invalid_witness_target) {
500 if constexpr (num_reads > 0) {
502 const uint32_t witness_idx = memory_constraint.
trace[random_read_idx].index.index;
503 witness_values[witness_idx] +=
bb::fr(1);
508 return { memory_constraint, witness_values };
519template <
typename Params>
521 public TestClass<CallDataTestingFunctions<Params::calldata_type,
522 Params::calldata_size,
524 Params::perform_constant_ops>> {
533 TestFixture::template test_vk_independence<MegaFlavor>();
538 TestFixture::test_tampering();
541template <
size_t returndata_size>
557 static std::vector<std::string>
get_labels() {
return {
"None" }; };
565 std::vector<bb::fr> returndata_values;
566 returndata_values.reserve(returndata_size);
567 for (
size_t _i = 0; _i < returndata_size; _i++) {
572 std::vector<uint32_t> init_indices;
573 for (
size_t i = 0; i < returndata_size; ++i) {
575 init_indices.push_back(value_index);
579 memory_constraint =
AcirConstraint{ .
init = init_indices, .trace = {}, .type = BlockType::ReturnData };
587 switch (invalid_witness_target) {
592 return { memory_constraint, witness_values };
601template <
typename Params>
613 TestFixture::template test_vk_independence<MegaFlavor>();
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, 0, 0, false >, CallDataTestParams< CallDataType::Primary, 10, 5, false >, CallDataTestParams< CallDataType::Primary, 10, 5, true >, CallDataTestParams< CallDataType::Secondary, 0, 0, false >, CallDataTestParams< CallDataType::Secondary, 10, 5, false >, CallDataTestParams< CallDataType::Secondary, 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.
testing::Types< ROMTestParams< UltraCircuitBuilder, 0, 0, false >, ROMTestParams< UltraCircuitBuilder, 10, 0, false >, ROMTestParams< UltraCircuitBuilder, 10, 0, true >, ROMTestParams< UltraCircuitBuilder, 10, 20, false >, ROMTestParams< UltraCircuitBuilder, 10, 20, true >, ROMTestParams< MegaCircuitBuilder, 0, 0, false >, ROMTestParams< MegaCircuitBuilder, 10, 0, false >, ROMTestParams< MegaCircuitBuilder, 10, 0, true >, ROMTestParams< MegaCircuitBuilder, 10, 20, false >, ROMTestParams< MegaCircuitBuilder, 10, 20, true > > ROMTestConfigs
testing::Types< ReturnDataTestsParams< 0 >, ReturnDataTestsParams< 10 > > ReturnDataTestConfigs
static std::vector< std::string > get_labels()
static std::vector< Target > get_all()
static ProgramMetadata generate_metadata()
static std::pair< AcirConstraint, WitnessVector > invalidate_witness(AcirConstraint memory_constraint, WitnessVector witness_values, const InvalidWitness::Target &invalid_witness_target)
static void generate_constraints(AcirConstraint &memory_constraint, WitnessVector &witness_values)
static void SetUpTestSuite()
static void SetUpTestSuite()
static std::vector< Target > get_all()
static std::vector< std::string > get_labels()
static std::pair< AcirConstraint, WitnessVector > invalidate_witness(AcirConstraint memory_constraint, WitnessVector witness_values, const InvalidWitness::Target &invalid_witness_target)
static ProgramMetadata generate_metadata()
static void generate_constraints(AcirConstraint &memory_constraint, WitnessVector &witness_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 std::pair< AcirConstraint, WitnessVector > invalidate_witness(AcirConstraint memory_constraint, WitnessVector witness_values, const InvalidWitness::Target &invalid_witness_target)
static ProgramMetadata generate_metadata()
static std::vector< Target > get_all()
static std::vector< std::string > get_labels()
static ProgramMetadata generate_metadata()
static std::pair< AcirConstraint, WitnessVector > invalidate_witness(AcirConstraint memory_constraint, WitnessVector witness_values, const InvalidWitness::Target &invalid_witness_target)
static void generate_constraints(AcirConstraint &memory_constraint, WitnessVector &witness_values)
static void SetUpTestSuite()
static constexpr size_t returndata_size
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)
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
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