4#include <gtest/gtest.h>
20using FlavorTypes = ::testing::Types<MegaFlavor, MegaZKFlavor>;
22template <
typename Flavor>
class DataBusTests :
public ::testing::Test {
39 Prover prover{ prover_instance, verification_key };
40 auto proof = prover.construct_proof();
41 Verifier verifier{ vk_and_hash };
42 bool result = verifier.verify_proof(proof).result;
47 static Builder construct_test_builder()
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 builder.add_public_calldata(bus_idx, val_witness_idx);
79 for (
size_t i = 0; i < NUM_READS; ++i) {
81 uint32_t read_idx_witness_idx =
builder.add_variable(
FF(read_idx));
82 builder.read_calldata(bus_idx, read_idx_witness_idx);
97 typename TypeParam::CircuitBuilder
builder = this->construct_test_builder();
98 this->construct_circuit_with_databus_reads(
builder, BusId::KERNEL_CALLDATA);
100 EXPECT_TRUE(this->construct_and_verify_proof(
builder));
109 for (
size_t idx = 0; idx < MAX_APPS_PER_KERNEL; ++idx) {
110 typename TypeParam::CircuitBuilder
builder = this->construct_test_builder();
111 this->construct_circuit_with_databus_reads(
builder,
static_cast<BusId>(idx + 1));
114 EXPECT_TRUE(this->construct_and_verify_proof(
builder)) <<
"Failed for app calldata bus with index " << idx;
124 typename TypeParam::CircuitBuilder
builder = this->construct_test_builder();
125 this->construct_circuit_with_databus_reads(
builder, BusId::RETURNDATA);
128 EXPECT_TRUE(this->construct_and_verify_proof(
builder));
137 typename TypeParam::CircuitBuilder
builder = this->construct_test_builder();
138 this->construct_circuit_with_databus_reads(
builder, BusId::KERNEL_CALLDATA);
139 for (
size_t idx = 0; idx < MAX_APPS_PER_KERNEL; ++idx) {
140 this->construct_circuit_with_databus_reads(
builder,
static_cast<BusId>(idx + 1));
142 this->construct_circuit_with_databus_reads(
builder, BusId::RETURNDATA);
145 EXPECT_TRUE(this->construct_and_verify_proof(
builder));
153TYPED_TEST(DataBusTests, CallDataDuplicateRead)
156 typename TypeParam::CircuitBuilder
builder = this->construct_test_builder();
157 using FF = TypeParam::FF;
161 std::vector<FF> calldata_values = { 7, 10, 3, 12, 1 };
162 for (
auto& val : calldata_values) {
163 builder.add_public_calldata(BusId::KERNEL_CALLDATA,
builder.add_variable(val));
167 std::vector<uint32_t> read_indices = { 1, 4, 1 };
170 std::vector<uint32_t> result_witness_indices;
171 for (uint32_t& read_idx : read_indices) {
173 uint32_t read_idx_witness_idx =
builder.add_variable(
FF(read_idx));
175 auto value_witness_idx =
builder.read_calldata(BusId::KERNEL_CALLDATA, read_idx_witness_idx);
176 result_witness_indices.emplace_back(value_witness_idx);
180 auto expected_read_result_at_1 = calldata_values[1];
181 auto expected_read_result_at_4 = calldata_values[4];
182 auto duplicate_read_result_0 =
builder.get_variable(result_witness_indices[0]);
183 auto duplicate_read_result_1 =
builder.get_variable(result_witness_indices[1]);
184 auto duplicate_read_result_2 =
builder.get_variable(result_witness_indices[2]);
185 EXPECT_EQ(duplicate_read_result_0, expected_read_result_at_1);
186 EXPECT_EQ(duplicate_read_result_1, expected_read_result_at_4);
187 EXPECT_EQ(duplicate_read_result_2, expected_read_result_at_1);
190 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
testing::Types< UltraFlavor, UltraKeccakFlavor, MegaFlavor > FlavorTypes
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(CommitmentKeyTest, Curves)
TYPED_TEST(CommitmentKeyTest, CommitToZeroPoly)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
static field random_element(numeric::RNG *engine=nullptr) noexcept