14#include <gtest/gtest.h>
23TEST(BlockConstraintMemOpEncoding, ReadFlagFalseDecodesAsRead)
39 ASSERT_EQ(block.
trace.size(), 1);
40 EXPECT_EQ(block.
trace[0].access_type, AccessType::Read);
41 EXPECT_EQ(block.
trace[0].index, 1);
42 EXPECT_EQ(block.
trace[0].value, 2);
45TEST(BlockConstraintMemOpEncoding, AccessTypeEncodesToReadFlag)
62template <
typename Builder_,
size_t TableSize_,
size_t NumReads_>
struct ROMTestParams {
78 if constexpr (num_reads > 0 && table_size > 0) {
85 std::vector<std::string> labels = {
"None" };
86 if constexpr (num_reads > 0 && table_size > 0) {
87 labels.push_back(
"ReadValueIncremented");
98 std::vector<bb::fr> table_values;
99 table_values.reserve(table_size);
100 for (
size_t _i = 0; _i < table_size; _i++) {
105 std::vector<uint32_t> init_indices;
106 for (
const auto& val : table_values) {
109 init_indices.push_back(value_index);
116 if constexpr (table_size > 0) {
117 for (
size_t _i = 0; _i < num_reads; ++_i) {
120 bb::fr read_value = table_values[rom_index_to_read];
122 const uint32_t index_for_read =
127 .index = index_for_read,
128 .value = value_for_read };
130 trace.push_back(read_op);
142 switch (invalid_witness_target) {
146 if constexpr (num_reads > 0 && table_size > 0) {
151 const size_t read_value_witness_index = table_size + (random_read * 2) + 1;
152 witness_values[read_value_witness_index] +=
bb::fr(1);
157 return { memory_constraint, witness_values };
160template <
typename Params>
162 public TestClass<ROMTestingFunctions<typename Params::Builder, Params::table_size, Params::num_reads>> {
179 TestFixture::template test_vk_independence<Flavor>();
184 TestFixture::test_tampering();
187template <
typename Builder_,
size_t TableSize_,
size_t NumReads_,
size_t NumWrites_>
struct RAMTestParams {
194template <
typename Builder_,
size_t table_size,
size_t num_reads,
size_t num_writes>
class RAMTestingFunctions {
211 if constexpr (num_reads > 0 && table_size > 0) {
218 std::vector<std::string> labels = {
"None" };
219 if constexpr (num_reads > 0 && table_size > 0) {
220 labels.push_back(
"ReadValueIncremented");
231 std::vector<bb::fr> table_values;
232 table_values.reserve(table_size);
233 for (
size_t _i = 0; _i < table_size; _i++) {
238 std::vector<uint32_t> init_indices;
239 for (
size_t i = 0; i < table_size; ++i) {
240 const auto val = table_values[i];
242 init_indices.push_back(value_index);
246 size_t num_reads_remaining = num_reads;
247 size_t num_writes_remaining = num_writes;
251 while (num_reads_remaining + num_writes_remaining > 0) {
253 if (try_read && (num_reads_remaining > 0)) {
254 read_write_sequence.push_back(AccessType::Read);
255 num_reads_remaining--;
256 }
else if (num_writes_remaining > 0) {
257 read_write_sequence.push_back(AccessType::Write);
258 num_writes_remaining--;
261 for (
size_t _j = 0; _j < num_reads_remaining; _j++) {
262 read_write_sequence.push_back(AccessType::Read);
264 num_reads_remaining = 0;
269 if constexpr (table_size > 0) {
270 for (
auto& access_type : read_write_sequence) {
272 switch (access_type) {
273 case AccessType::Read: {
275 const uint32_t index_for_read =
277 bb::fr read_value = table_values[ram_index_to_read];
280 mem_op = { .
access_type = AccessType::Read, .index = index_for_read, .value = value_for_read };
281 trace.push_back(mem_op);
284 case AccessType::Write: {
286 const uint32_t index_to_write =
292 table_values[ram_index_to_write] = write_value;
294 mem_op = { .
access_type = AccessType::Write, .index = index_to_write, .value = value_to_write };
295 trace.push_back(mem_op);
311 switch (invalid_witness_target) {
315 if constexpr (num_reads > 0 && table_size > 0) {
318 while (memory_constraint.trace[random_read_idx].access_type != AccessType::Read) {
322 const uint32_t witness_idx = memory_constraint.trace[random_read_idx].value;
323 witness_values[witness_idx] +=
bb::fr(1);
328 return { memory_constraint, witness_values };
332template <
typename Params>
334 :
public ::testing::Test,
336 RAMTestingFunctions<typename Params::Builder, Params::table_size, Params::num_reads, Params::num_writes>> {
342using RAMTestConfigs = testing::Types<RAMTestParams<UltraCircuitBuilder, 0, 0, 0>,
357 TestFixture::template test_vk_independence<Flavor>();
362 TestFixture::test_tampering();
365template <CallDataType CallDataType_,
size_t CallDataSize_,
size_t NumReads_>
struct CallDataTestParams {
382 if constexpr (num_reads > 0) {
390 if constexpr (num_reads > 0) {
391 return {
"None",
"ReadValueIncremented" };
403 std::vector<bb::fr> calldata_values;
410 std::vector<uint32_t> init_indices;
413 init_indices.push_back(value_index);
420 for (
size_t idx = 0; idx < num_reads; ++idx) {
423 const uint32_t index_for_read =
425 bb::fr read_value = calldata_values[calldata_idx_to_read];
428 mem_op = { .
access_type = AccessType::Read, .index = index_for_read, .value = value_for_read };
429 trace.push_back(mem_op);
435 .
init = init_indices, .trace =
trace, .type = BlockType::CallData, .calldata_id = calldata_type
444 switch (invalid_witness_target) {
449 if constexpr (num_reads > 0) {
451 const uint32_t witness_idx = memory_constraint.
trace[random_read_idx].index;
452 witness_values[witness_idx] +=
bb::fr(1);
457 return { memory_constraint, witness_values };
468template <
typename Params>
470 :
public ::testing::Test,
471 public TestClass<CallDataTestingFunctions<Params::calldata_type, Params::calldata_size, Params::num_reads>> {
480 TestFixture::template test_vk_independence<MegaFlavor>();
485 TestFixture::test_tampering();
488template <
size_t returndata_size>
504 static std::vector<std::string>
get_labels() {
return {
"None" }; };
512 std::vector<bb::fr> returndata_values;
513 returndata_values.reserve(returndata_size);
514 for (
size_t _i = 0; _i < returndata_size; _i++) {
519 std::vector<uint32_t> init_indices;
520 for (
size_t i = 0; i < returndata_size; ++i) {
522 init_indices.push_back(value_index);
526 memory_constraint =
AcirConstraint{ .
init = init_indices, .trace = {}, .type = BlockType::ReturnData };
534 switch (invalid_witness_target) {
539 return { memory_constraint, witness_values };
548template <
typename Params>
560 TestFixture::template test_vk_independence<MegaFlavor>();
testing::Types< CallDataTestParams< CallDataType::KernelCalldata, 0, 0 >, CallDataTestParams< CallDataType::KernelCalldata, 10, 5 >, CallDataTestParams< CallDataType::FirstAppCalldata, 0, 0 >, CallDataTestParams< CallDataType::FirstAppCalldata, 10, 5 >, CallDataTestParams< CallDataType::SecondAppCalldata, 10, 5 >, CallDataTestParams< CallDataType::ThirdAppCalldata, 10, 5 > > CallDataTestConfigs
testing::Types< RAMTestParams< UltraCircuitBuilder, 0, 0, 0 >, RAMTestParams< UltraCircuitBuilder, 10, 0, 0 >, RAMTestParams< UltraCircuitBuilder, 10, 0, 10 >, RAMTestParams< UltraCircuitBuilder, 10, 10, 0 >, RAMTestParams< MegaCircuitBuilder, 0, 0, 0 >, RAMTestParams< MegaCircuitBuilder, 10, 0, 0 >, RAMTestParams< MegaCircuitBuilder, 10, 0, 10 >, RAMTestParams< MegaCircuitBuilder, 10, 10, 0 > > RAMTestConfigs
testing::Types< ROMTestParams< UltraCircuitBuilder, 0, 0 >, ROMTestParams< UltraCircuitBuilder, 10, 0 >, ROMTestParams< UltraCircuitBuilder, 10, 20 >, ROMTestParams< MegaCircuitBuilder, 0, 0 >, ROMTestParams< MegaCircuitBuilder, 10, 0 >, ROMTestParams< MegaCircuitBuilder, 10, 20 > > ROMTestConfigs
testing::Types< ReturnDataTestsParams< 0 >, ReturnDataTestsParams< 10 > > ReturnDataTestConfigs
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 void SetUpTestSuite()
static std::vector< std::string > get_labels()
static std::vector< Target > get_all()
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 ProgramMetadata generate_metadata()
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 ProgramMetadata generate_metadata()
static std::pair< AcirConstraint, WitnessVector > 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()
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)
void read(B &it, field2< base_field, Params > &value)
TYPED_TEST_SUITE(CommitmentKeyTest, Curves)
field< Bn254FrParams > fr
TYPED_TEST(CommitmentKeyTest, CommitToZeroPoly)
TEST(BoomerangMegaCircuitBuilder, BasicCircuit)
MegaCircuitBuilder_< field< Bn254FrParams > > MegaCircuitBuilder
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
std::variant< Memory, CallData, ReturnData > value
static constexpr size_t calldata_size
static constexpr CallDataType calldata_type
static constexpr size_t num_reads
static constexpr size_t table_size
static constexpr size_t num_writes
static constexpr size_t num_reads
static constexpr size_t num_reads
static constexpr size_t table_size
static field random_element(numeric::RNG *engine=nullptr) noexcept