3#include <gtest/gtest.h>
18using FlavorTypes = ::testing::Types<MegaFlavor, MegaZKFlavor>;
20template <
typename Flavor>
class DataBusTests :
public ::testing::Test {
36 Prover prover{ proving_key, verification_key };
37 auto proof = prover.construct_proof();
38 Verifier verifier{ verification_key };
39 bool result = verifier.template verify_proof<DefaultIO>(proof).result;
44 static Builder construct_test_builder()
62 static Builder construct_circuit_with_databus_reads(
64 const std::function<
void(
Builder&, uint32_t)>& add_bus_data,
65 const std::function<uint32_t(
Builder&, uint32_t)>& read_bus_data)
68 const uint32_t NUM_BUS_ENTRIES = 5;
69 const uint32_t NUM_READS = 7;
72 for (
size_t i = 0; i < NUM_BUS_ENTRIES; ++i) {
74 uint32_t val_witness_idx =
builder.add_variable(val);
75 add_bus_data(
builder, val_witness_idx);
79 for (
size_t i = 0; i < NUM_READS; ++i) {
81 uint32_t read_idx_witness_idx =
builder.add_variable(read_idx);
82 read_bus_data(
builder, read_idx_witness_idx);
91 auto add_method = [](
Builder&
builder, uint32_t witness_idx) {
builder.add_public_calldata(witness_idx); };
92 auto read_method = [](
Builder&
builder, uint32_t witness_idx) {
return builder.read_calldata(witness_idx); };
94 return construct_circuit_with_databus_reads(
builder, add_method, read_method);
101 builder.add_public_secondary_calldata(witness_idx);
104 return builder.read_secondary_calldata(witness_idx);
107 return construct_circuit_with_databus_reads(
builder, add_method, read_method);
113 auto add_method = [](
Builder&
builder, uint32_t witness_idx) {
builder.add_public_return_data(witness_idx); };
114 auto read_method = [](
Builder&
builder, uint32_t witness_idx) {
return builder.read_return_data(witness_idx); };
116 return construct_circuit_with_databus_reads(
builder, add_method, read_method);
128 typename TypeParam::CircuitBuilder
builder = this->construct_test_builder();
129 this->construct_circuit_with_calldata_reads(
builder);
131 EXPECT_TRUE(this->construct_and_verify_proof(
builder));
140 typename TypeParam::CircuitBuilder
builder = this->construct_test_builder();
141 this->construct_circuit_with_secondary_calldata_reads(
builder);
143 EXPECT_TRUE(this->construct_and_verify_proof(
builder));
152 typename TypeParam::CircuitBuilder
builder = this->construct_test_builder();
153 this->construct_circuit_with_return_data_reads(
builder);
155 EXPECT_TRUE(this->construct_and_verify_proof(
builder));
164 typename TypeParam::CircuitBuilder
builder = this->construct_test_builder();
165 this->construct_circuit_with_calldata_reads(
builder);
166 this->construct_circuit_with_secondary_calldata_reads(
builder);
167 this->construct_circuit_with_return_data_reads(
builder);
169 EXPECT_TRUE(this->construct_and_verify_proof(
builder));
177TYPED_TEST(DataBusTests, CallDataDuplicateRead)
180 typename TypeParam::CircuitBuilder
builder = this->construct_test_builder();
181 using FF = TypeParam::FF;
185 std::vector<FF> calldata_values = { 7, 10, 3, 12, 1 };
186 for (
auto& val : calldata_values) {
191 std::vector<uint32_t> read_indices = { 1, 4, 1 };
194 std::vector<uint32_t> result_witness_indices;
195 for (uint32_t& read_idx : read_indices) {
197 uint32_t read_idx_witness_idx =
builder.add_variable(read_idx);
199 auto value_witness_idx =
builder.read_calldata(read_idx_witness_idx);
200 result_witness_indices.emplace_back(value_witness_idx);
204 auto expected_read_result_at_1 = calldata_values[1];
205 auto expected_read_result_at_4 = calldata_values[4];
206 auto duplicate_read_result_0 =
builder.get_variable(result_witness_indices[0]);
207 auto duplicate_read_result_1 =
builder.get_variable(result_witness_indices[1]);
208 auto duplicate_read_result_2 =
builder.get_variable(result_witness_indices[2]);
209 EXPECT_EQ(duplicate_read_result_0, expected_read_result_at_1);
210 EXPECT_EQ(duplicate_read_result_1, expected_read_result_at_4);
211 EXPECT_EQ(duplicate_read_result_2, expected_read_result_at_1);
214 bool result = this->construct_and_verify_proof(
builder);
static void construct_simple_circuit(MegaBuilder &builder, bool last_circuit=false)
Generate a simple test circuit with some ECC op gates and conventional arithmetic gates.
MegaCircuitBuilder CircuitBuilder
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)
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
static field random_element(numeric::RNG *engine=nullptr) noexcept