3#include <gtest/gtest.h>
19using FlavorTypes = ::testing::Types<MegaFlavor, MegaZKFlavor>;
21template <
typename Flavor>
class DataBusTests :
public ::testing::Test {
38 Prover prover{ prover_instance, verification_key };
39 auto proof = prover.construct_proof();
40 Verifier verifier{ vk_and_hash };
41 bool result = verifier.verify_proof(proof).result;
46 static Builder construct_test_builder()
64 static Builder construct_circuit_with_databus_reads(
66 const std::function<
void(
Builder&, uint32_t)>& add_bus_data,
67 const std::function<uint32_t(
Builder&, uint32_t)>& read_bus_data)
70 const uint32_t NUM_BUS_ENTRIES = 5;
71 const uint32_t NUM_READS = 7;
74 for (
size_t i = 0; i < NUM_BUS_ENTRIES; ++i) {
76 uint32_t val_witness_idx =
builder.add_variable(val);
77 add_bus_data(
builder, val_witness_idx);
81 for (
size_t i = 0; i < NUM_READS; ++i) {
83 uint32_t read_idx_witness_idx =
builder.add_variable(
FF(read_idx));
84 read_bus_data(
builder, read_idx_witness_idx);
93 auto add_method = [](
Builder&
builder, uint32_t witness_idx) {
builder.add_public_calldata(witness_idx); };
94 auto read_method = [](
Builder&
builder, uint32_t witness_idx) {
return builder.read_calldata(witness_idx); };
96 return construct_circuit_with_databus_reads(
builder, add_method, read_method);
103 builder.add_public_secondary_calldata(witness_idx);
106 return builder.read_secondary_calldata(witness_idx);
109 return construct_circuit_with_databus_reads(
builder, add_method, read_method);
115 auto add_method = [](
Builder&
builder, uint32_t witness_idx) {
builder.add_public_return_data(witness_idx); };
116 auto read_method = [](
Builder&
builder, uint32_t witness_idx) {
return builder.read_return_data(witness_idx); };
118 return construct_circuit_with_databus_reads(
builder, add_method, read_method);
130 typename TypeParam::CircuitBuilder
builder = this->construct_test_builder();
131 this->construct_circuit_with_calldata_reads(
builder);
133 EXPECT_TRUE(this->construct_and_verify_proof(
builder));
142 typename TypeParam::CircuitBuilder
builder = this->construct_test_builder();
143 this->construct_circuit_with_secondary_calldata_reads(
builder);
145 EXPECT_TRUE(this->construct_and_verify_proof(
builder));
154 typename TypeParam::CircuitBuilder
builder = this->construct_test_builder();
155 this->construct_circuit_with_return_data_reads(
builder);
157 EXPECT_TRUE(this->construct_and_verify_proof(
builder));
166 typename TypeParam::CircuitBuilder
builder = this->construct_test_builder();
167 this->construct_circuit_with_calldata_reads(
builder);
168 this->construct_circuit_with_secondary_calldata_reads(
builder);
169 this->construct_circuit_with_return_data_reads(
builder);
171 EXPECT_TRUE(this->construct_and_verify_proof(
builder));
179TYPED_TEST(DataBusTests, CallDataDuplicateRead)
182 typename TypeParam::CircuitBuilder
builder = this->construct_test_builder();
183 using FF = TypeParam::FF;
187 std::vector<FF> calldata_values = { 7, 10, 3, 12, 1 };
188 for (
auto& val : calldata_values) {
193 std::vector<uint32_t> read_indices = { 1, 4, 1 };
196 std::vector<uint32_t> result_witness_indices;
197 for (uint32_t& read_idx : read_indices) {
199 uint32_t read_idx_witness_idx =
builder.add_variable(
FF(read_idx));
201 auto value_witness_idx =
builder.read_calldata(read_idx_witness_idx);
202 result_witness_indices.emplace_back(value_witness_idx);
206 auto expected_read_result_at_1 = calldata_values[1];
207 auto expected_read_result_at_4 = calldata_values[4];
208 auto duplicate_read_result_0 =
builder.get_variable(result_witness_indices[0]);
209 auto duplicate_read_result_1 =
builder.get_variable(result_witness_indices[1]);
210 auto duplicate_read_result_2 =
builder.get_variable(result_witness_indices[2]);
211 EXPECT_EQ(duplicate_read_result_0, expected_read_result_at_1);
212 EXPECT_EQ(duplicate_read_result_1, expected_read_result_at_4);
213 EXPECT_EQ(duplicate_read_result_2, expected_read_result_at_1);
216 bool result = this->construct_and_verify_proof(
builder);
ECCVMCircuitBuilder CircuitBuilder
static void construct_simple_circuit(MegaBuilder &builder)
Generate a simple test circuit with some ECC op gates and conventional arithmetic gates.
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