19class MockDatabusProducer {
24 using BusDataArray = std::vector<FF>;
26 static constexpr size_t BUS_ARRAY_SIZE = 3;
28 BusDataArray kernel_return_data;
30 uint64_t next_bus_value = 1;
32 BusDataArray generate_mock_bus_array()
35 for (
size_t i = 0; i < BUS_ARRAY_SIZE; ++i) {
36 result.emplace_back(
FF(next_bus_value++));
41 static BusDataArray generate_default_commitment_bus_array(
const BusId bus_idx)
45 return BusDataArray(
static_cast<size_t>(bus_idx) + 1,
FF(0));
48 static void append_calldata(ClientCircuit& circuit,
const BusId bus_idx,
const BusDataArray&
data)
50 for (
const auto& val :
data) {
51 circuit.add_public_calldata(bus_idx, circuit.add_variable(val));
55 static void append_return_data(ClientCircuit& circuit,
const BusDataArray&
data)
57 for (
const auto& val :
data) {
58 circuit.add_public_return_data(circuit.add_variable(val));
62 static void exercise_calldata_lookup(ClientCircuit& circuit,
const BusId bus_idx,
const size_t bus_size)
65 const size_t read_idx =
static_cast<size_t>(bus_idx) % bus_size;
66 circuit.read_calldata(bus_idx, circuit.add_variable(
FF(read_idx)));
69 static void exercise_return_data_lookup(ClientCircuit& circuit,
const size_t bus_size)
72 const size_t read_idx =
static_cast<size_t>(BusId::RETURNDATA) % bus_size;
73 circuit.read_return_data(circuit.add_variable(
FF(read_idx)));
80 void populate_app_databus(ClientCircuit& circuit)
82 for (
auto& app_data : app_return_data) {
83 if (app_data.empty()) {
84 app_data = generate_mock_bus_array();
85 append_return_data(circuit, app_data);
86 exercise_return_data_lookup(circuit, app_data.size());
96 void populate_kernel_databus(ClientCircuit& circuit)
99 const BusDataArray& kernel_calldata = kernel_return_data.empty()
100 ? generate_default_commitment_bus_array(BusId::KERNEL_CALLDATA)
101 : kernel_return_data;
102 append_calldata(circuit, BusId::KERNEL_CALLDATA, kernel_calldata);
103 exercise_calldata_lookup(circuit, BusId::KERNEL_CALLDATA, kernel_calldata.size());
106 for (
size_t idx = 0; idx < app_return_data.size(); ++idx) {
107 const auto bus_idx =
static_cast<BusId>(idx +
static_cast<size_t>(BusId::APP_CALLDATA));
108 const BusDataArray& app_calldata =
109 app_return_data[idx].empty() ? generate_default_commitment_bus_array(bus_idx) : app_return_data[idx];
110 append_calldata(circuit, bus_idx, app_calldata);
111 exercise_calldata_lookup(circuit, bus_idx, app_calldata.size());
112 app_return_data[idx].clear();
116 kernel_return_data = generate_mock_bus_array();
117 append_return_data(circuit, kernel_return_data);
118 exercise_return_data_lookup(circuit, kernel_return_data.size());
129 size_t num_public_inputs = 0;
133 size_t log2_num_gates = 0;
144class PrivateFunctionExecutionMockCircuitProducer {
149 size_t circuit_counter = 0;
150 std::vector<bool> is_kernel_flags;
152 MockDatabusProducer mock_databus;
153 bool large_first_app =
true;
154 constexpr static size_t NUM_TRAILING_KERNELS = bb::NUM_TRAILING_KERNELS;
157 size_t total_num_circuits = 0;
165 kinds.reserve(total_num_circuits);
166 for (
size_t idx = 0; idx < total_num_circuits; ++idx) {
167 if (!is_kernel_flags[idx]) {
168 kinds.push_back(Chonk::CircuitKind::App);
170 kinds.push_back(idx + 1 == total_num_circuits ? Chonk::CircuitKind::HidingKernel
177 PrivateFunctionExecutionMockCircuitProducer(
size_t num_app_circuits,
bool large_first_app =
true)
178 : large_first_app(large_first_app)
180 for (
size_t i = 0; i < num_app_circuits / MAX_APPS_PER_KERNEL; ++i) {
181 for (
size_t idx = 0; idx < MAX_APPS_PER_KERNEL; ++idx) {
182 is_kernel_flags.emplace_back(
false);
184 is_kernel_flags.emplace_back(
true);
186 if (num_app_circuits % MAX_APPS_PER_KERNEL != 0) {
187 for (
size_t idx = 0; idx < num_app_circuits % MAX_APPS_PER_KERNEL; ++idx) {
188 is_kernel_flags.emplace_back(
false);
190 is_kernel_flags.emplace_back(
true);
192 for (
size_t i = 0; i < NUM_TRAILING_KERNELS; ++i) {
193 is_kernel_flags.emplace_back(
true);
195 total_num_circuits = is_kernel_flags.size();
198 PrivateFunctionExecutionMockCircuitProducer(std::vector<bool> leading_is_kernel_flags,
bool large_first_app =
false)
199 : is_kernel_flags(
std::move(leading_is_kernel_flags))
200 , large_first_app(large_first_app)
202 BB_ASSERT(!is_kernel_flags.empty(),
"Mock circuit layout must contain at least one leading circuit");
203 BB_ASSERT_EQ(is_kernel_flags[0],
false,
"Mock circuit layout must start with an app circuit");
204 for (
size_t i = 0; i < NUM_TRAILING_KERNELS; ++i) {
205 is_kernel_flags.emplace_back(
true);
207 total_num_circuits = is_kernel_flags.size();
216 ClientCircuit create_next_circuit(
Chonk& ivc,
217 size_t log2_num_gates = 0,
218 size_t num_public_inputs = 0,
219 bool check_circuit_sizes =
false)
221 const bool is_kernel = is_kernel_flags[circuit_counter++];
222 const bool use_large_circuit = large_first_app && (circuit_counter == 1);
224 const bool is_trailing_kernel =
229 if (log2_num_gates != 0) {
232 for (
size_t i = 0; i < num_public_inputs; ++i) {
233 circuit.add_public_variable(
typename Flavor::FF(13634816 + i));
240 if (!is_trailing_kernel) {
249 mock_databus.populate_kernel_databus(circuit);
251 mock_databus.populate_app_databus(circuit);
260 if (check_circuit_sizes) {
266 if (log2_num_gates != 0) {
272 "Log number of gates in a kernel with fixed number of arithmetic gates has exceeded bound.");
273 vinfo(
"Log number of gates in a kernel with fixed number of arithmetic gates is: ",
277 size_t LOG2_OFFSET = 2;
279 log2_num_gates + LOG2_OFFSET,
280 "Log number of arithemtic gates produced is different from the one requested.");
285 if (is_trailing_kernel) {
289 "Trailing kernel circuit size has exceeded expected bound (should be <= 2^16).");
290 vinfo(
"Log number of gates in a trailing kernel circuit is: ", log2_dyadic_size);
292 const bool is_init_kernel = circuit_counter == 2;
293 const size_t expected_log2_dyadic_size = is_init_kernel ? 17UL : 18UL;
295 expected_log2_dyadic_size,
296 "There has been a change in the number of gates of a mock kernel circuit.");
300 use_large_circuit ? 19UL : 17UL,
301 "There has been a change in the of gates generated for a mock app circuit.");
308 void construct_and_accumulate_next_circuit(
Chonk& ivc,
TestSettings settings = {},
bool check_circuit_sizes =
false)
312 if (is_hiding_kernel) {
316 create_next_circuit(ivc, settings.log2_num_gates, settings.num_public_inputs, check_circuit_sizes);
324 ClientCircuit& builder_in)
328 using VK =
typename FlavorT::VerificationKey;
#define BB_ASSERT(expression,...)
#define BB_ASSERT_GT(left, right,...)
#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.
CircuitKind current_kind() const
Kind of the circuit currently being accumulated (or, between accumulate calls, the next one expected)...
void accumulate(ClientCircuit &circuit, const CircuitVerificationKey &vk)
Accumulate a circuit into the running IVC.
bb::CircuitVerificationKey CircuitVerificationKey
size_t get_num_circuits() const
size_t get_num_circuits_accumulated() const
Get the number of circuits accumulated by the IVC.
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.
Contains all the information required by a Honk prover to create a proof, constructed from a finalize...
size_t log_dyadic_size() const
static void add_default(Builder &builder)
Add default public inputs when they are not present.
Entry point for Barretenberg command-line interface.
typename flavor_for_impl< K >::type flavor_for
::testing::Types< BN254Settings > TestSettings
constexpr decltype(auto) dispatch_kind(CircuitKind kind, F &&f)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept