19class MockDatabusProducer {
24 using BusDataArray = std::vector<FF>;
26 static constexpr size_t BUS_ARRAY_SIZE = 3;
28 BusDataArray kernel_return_data;
30 FF dummy_return_val = 1;
32 BusDataArray generate_random_bus_array()
35 for (
size_t i = 0; i < BUS_ARRAY_SIZE; ++i) {
36 result.emplace_back(dummy_return_val);
38 dummy_return_val += 1;
46 void populate_app_databus(ClientCircuit& circuit)
48 for (
auto& app_data : app_return_data) {
49 if (app_data.empty()) {
50 app_data = generate_random_bus_array();
51 for (
auto& val : app_data) {
52 circuit.add_public_return_data(circuit.add_variable(val));
63 void populate_kernel_databus(ClientCircuit& circuit)
66 for (
auto& val : kernel_return_data) {
67 circuit.add_public_calldata(BusId::KERNEL_CALLDATA, circuit.add_variable(val));
70 for (
size_t idx = 0; idx < app_return_data.size(); ++idx) {
71 for (
auto& val : app_return_data[idx]) {
72 circuit.add_public_calldata(
static_cast<BusId>(idx + 1), circuit.add_variable(val));
74 app_return_data[idx].clear();
78 kernel_return_data = generate_random_bus_array();
79 for (
auto& val : kernel_return_data) {
80 circuit.add_public_return_data(circuit.add_variable(val));
92 size_t num_public_inputs = 0;
96 size_t log2_num_gates = 0;
107class PrivateFunctionExecutionMockCircuitProducer {
112 size_t circuit_counter = 0;
113 std::vector<bool> is_kernel_flags;
115 MockDatabusProducer mock_databus;
116 bool large_first_app =
true;
117 constexpr static size_t NUM_TRAILING_KERNELS = 3;
120 size_t total_num_circuits = 0;
122 PrivateFunctionExecutionMockCircuitProducer(
size_t num_app_circuits,
bool large_first_app =
true)
123 : large_first_app(large_first_app)
125 for (
size_t i = 0; i < num_app_circuits / MAX_APPS_PER_KERNEL; ++i) {
126 for (
size_t idx = 0; idx < MAX_APPS_PER_KERNEL; ++idx) {
127 is_kernel_flags.emplace_back(
false);
129 is_kernel_flags.emplace_back(
true);
131 if (num_app_circuits % MAX_APPS_PER_KERNEL != 0) {
132 for (
size_t idx = 0; idx < num_app_circuits % MAX_APPS_PER_KERNEL; ++idx) {
133 is_kernel_flags.emplace_back(
false);
135 is_kernel_flags.emplace_back(
true);
137 for (
size_t i = 0; i < NUM_TRAILING_KERNELS; ++i) {
138 is_kernel_flags.emplace_back(
true);
140 total_num_circuits = is_kernel_flags.size();
143 PrivateFunctionExecutionMockCircuitProducer(std::vector<bool> leading_is_kernel_flags,
bool large_first_app =
false)
144 : is_kernel_flags(
std::move(leading_is_kernel_flags))
145 , large_first_app(large_first_app)
147 BB_ASSERT(!is_kernel_flags.empty(),
"Mock circuit layout must contain at least one leading circuit");
148 BB_ASSERT_EQ(is_kernel_flags[0],
false,
"Mock circuit layout must start with an app circuit");
149 for (
size_t i = 0; i < NUM_TRAILING_KERNELS; ++i) {
150 is_kernel_flags.emplace_back(
true);
152 total_num_circuits = is_kernel_flags.size();
158 static std::shared_ptr<VerificationKey> get_verification_key(ClientCircuit& builder_in,
159 bool is_hiding_kernel =
false)
169 if (is_hiding_kernel) {
183 ClientCircuit create_next_circuit(
Chonk& ivc,
184 size_t log2_num_gates = 0,
185 size_t num_public_inputs = 0,
186 bool check_circuit_sizes =
false)
188 const bool is_kernel = is_kernel_flags[circuit_counter++];
189 const bool use_large_circuit = large_first_app && (circuit_counter == 1);
195 if (log2_num_gates != 0) {
198 for (
size_t i = 0; i < num_public_inputs; ++i) {
199 circuit.add_public_variable(
typename Flavor::FF(13634816 + i));
206 if (!is_trailing_kernel) {
209 mock_databus.populate_kernel_databus(circuit);
212 mock_databus.populate_app_databus(circuit);
222 if (check_circuit_sizes) {
224 size_t log2_dyadic_size = prover_instance->log_dyadic_size();
225 if (log2_num_gates != 0) {
231 "Log number of gates in a kernel with fixed number of arithmetic gates has exceeded bound.");
232 vinfo(
"Log number of gates in a kernel with fixed number of arithmetic gates is: ",
236 size_t LOG2_OFFSET = 2;
238 log2_num_gates + LOG2_OFFSET,
239 "Log number of arithemtic gates produced is different from the one requested.");
244 if (is_trailing_kernel) {
248 "Trailing kernel circuit size has exceeded expected bound (should be <= 2^16).");
249 vinfo(
"Log number of gates in a trailing kernel circuit is: ", log2_dyadic_size);
251 const bool is_init_kernel = circuit_counter == 2;
252 const size_t expected_log2_dyadic_size = is_init_kernel ? 17UL : 18UL;
254 expected_log2_dyadic_size,
255 "There has been a change in the number of gates of a mock kernel circuit.");
259 use_large_circuit ? 19UL : 17UL,
260 "There has been a change in the of gates generated for a mock app circuit.");
275 if (is_hiding_kernel) {
279 create_next_circuit(ivc, settings.log2_num_gates, settings.num_public_inputs, check_circuit_size);
280 return { circuit, get_verification_key(circuit, is_hiding_kernel) };
283 void construct_and_accumulate_next_circuit(
Chonk& ivc,
TestSettings settings = {},
bool check_circuit_sizes =
false)
285 auto [circuit,
vk] = create_next_circuit_and_vk(ivc, settings, check_circuit_sizes);
#define BB_ASSERT(expression,...)
#define BB_ASSERT_EQ(actual, expected,...)
#define BB_ASSERT_LTE(left, right,...)
The IVC scheme used by the aztec client for private function execution.
void complete_kernel_circuit_logic(ClientCircuit &circuit)
Append logic to complete a kernel circuit.
size_t num_circuits_accumulated
size_t get_num_circuits() const
void accumulate(ClientCircuit &circuit, const std::shared_ptr< MegaVerificationKey > &precomputed_vk) override
Perform prover work for accumulation (e.g. HN folding, merge proving)
MegaCircuitBuilder ClientCircuit
typename Curve::ScalarField FF
std::shared_ptr< OpQueue > op_queue
static void construct_mock_app_circuit(MegaBuilder &builder, bool large=false)
Populate a builder with some arbitrary but nontrivial constraints.
static void construct_mock_folding_kernel(MegaBuilder &builder)
Construct a mock kernel circuit.
std::shared_ptr< ECCOpQueue > op_queue
NativeVerificationKey_< PrecomputedEntities< Commitment >, Codec, HashFunction, CommitmentKey > VerificationKey
The verification key stores commitments to the precomputed (non-witness) polynomials used by the veri...
static void construct_arithmetic_circuit(Builder &builder, const size_t target_log2_dyadic_size=4, bool include_public_inputs=true)
Populate a builder with a specified number of arithmetic gates; includes a PI.
Base Native verification key class.
static void add_default(Builder &builder)
Add default public inputs when they are not present.
Entry point for Barretenberg command-line interface.
::testing::Types< BN254Settings, GrumpkinSettings > TestSettings
VerifierCommitmentKey< Curve > vk
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept