24 vinfo(
"Constructing ProverInstance");
28 BB_ASSERT(circuit.pairing_points_tagging.has_single_pairing_point_tag(),
29 "Pairing points must all be aggregated together. Either no pairing points should be created, or "
30 "all created pairing points must be aggregated into a single pairing point. Found "
31 << circuit.pairing_points_tagging.num_unique_pairing_points() <<
" different pairing points.");
33 BB_ASSERT(circuit.pairing_points_tagging.has_public_pairing_points() ||
34 !circuit.pairing_points_tagging.has_pairing_points(),
35 "Pairing points must be set to public in the circuit before constructing the ProverInstance.");
38 if (!circuit.circuit_finalized) {
39 circuit.finalize_circuit(
true);
41 metadata.dyadic_size = compute_dyadic_size(circuit);
44 circuit.blocks.compute_offsets();
45 for (
auto& block : circuit.blocks.get()) {
46 if (block.size() > 0) {
47 final_active_wire_idx = block.trace_offset() + block.size() - 1;
53 vinfo(
"allocating polynomials object in prover instance...");
55 populate_memory_records(circuit);
57 allocate_permutation_argument_polynomials();
58 allocate_selectors(circuit);
59 allocate_table_lookup_polynomials(circuit);
60 allocate_lagrange_polynomials();
63 allocate_ecc_op_polynomials(circuit);
66 allocate_databus_polynomials(circuit);
70 polynomials.set_shifted();
74 vinfo(
"populating trace...");
79 construct_databus_polynomials(circuit);
83 polynomials.lagrange_first.at(0) = 1;
84 polynomials.lagrange_last.at(final_active_wire_idx) = 1;
86 construct_lookup_polynomials(circuit);
89 metadata.num_public_inputs = circuit.blocks.pub_inputs.size();
90 metadata.pub_inputs_offset = circuit.blocks.pub_inputs.trace_offset();
91 for (
size_t i = 0; i < metadata.num_public_inputs; ++i) {
92 size_t idx = i + metadata.pub_inputs_offset;
93 public_inputs.emplace_back(polynomials.w_r[idx]);
97 ipa_proof = circuit.ipa_proof;
116 const size_t tables_size = circuit.get_tables_size();
119 size_t min_size_of_execution_trace = circuit.blocks.get_total_content_size();
123 size_t total_num_gates =
124 NUM_DISABLED_ROWS_IN_SUMCHECK + NUM_ZERO_ROWS +
std::max(tables_size, min_size_of_execution_trace);
127 return circuit.get_circuit_subgroup_size(total_num_gates);
147 for (
auto& sigma : polynomials.get_sigmas()) {
150 for (
auto&
id : polynomials.get_ids()) {
155 const size_t z_perm_size =
Flavor::HasZK ? dyadic_size() : trace_active_range_size();
187 BB_BENCH_NAME(
"allocate_table_lookup_and_lookup_read_polynomials");
189 const size_t tables_size = circuit.get_tables_size();
193 for (
auto& table_poly : polynomials.get_tables()) {
194 table_poly =
Polynomial(tables_size, dyadic_size());
199 const size_t counts_and_tags_size =
Flavor::HasZK ? dyadic_size() : tables_size;
200 polynomials.lookup_read_counts =
Polynomial(counts_and_tags_size, dyadic_size());
201 polynomials.lookup_read_tags =
Polynomial(counts_and_tags_size, dyadic_size());
205 const size_t lookup_block_end = circuit.blocks.lookup.trace_offset() + circuit.blocks.lookup.size();
206 const size_t lookup_inverses_end =
std::max(lookup_block_end, tables_size);
208 const size_t lookup_inverses_size = (
Flavor::HasZK ? dyadic_size() : lookup_inverses_end);
209 polynomials.lookup_inverses =
Polynomial(lookup_inverses_size, dyadic_size());
231 BB_BENCH_NAME(
"allocate_databus_and_lookup_inverse_polynomials");
234 const size_t sec_calldata_size = circuit.get_secondary_calldata().size();
235 const size_t return_data_size = circuit.get_return_data().size();
239 const size_t sec_calldata_poly_size =
Flavor::HasZK ? dyadic_size() : sec_calldata_size;
240 const size_t return_data_poly_size =
Flavor::HasZK ? dyadic_size() : return_data_size;
242 polynomials.calldata =
Polynomial(calldata_poly_size, dyadic_size());
243 polynomials.calldata_read_counts =
Polynomial(calldata_poly_size, dyadic_size());
244 polynomials.calldata_read_tags =
Polynomial(calldata_poly_size, dyadic_size());
246 polynomials.secondary_calldata =
Polynomial(sec_calldata_poly_size, dyadic_size());
247 polynomials.secondary_calldata_read_counts =
Polynomial(sec_calldata_poly_size, dyadic_size());
248 polynomials.secondary_calldata_read_tags =
Polynomial(sec_calldata_poly_size, dyadic_size());
250 polynomials.return_data =
Polynomial(return_data_poly_size, dyadic_size());
251 polynomials.return_data_read_counts =
Polynomial(return_data_poly_size, dyadic_size());
252 polynomials.return_data_read_tags =
Polynomial(return_data_poly_size, dyadic_size());
256 const size_t q_busread_end = circuit.blocks.busread.trace_offset() + circuit.blocks.busread.size();
258 size_t sec_calldata_inverses_size =
Flavor::HasZK ? dyadic_size() :
std::max(sec_calldata_size, q_busread_end);
259 size_t return_data_inverses_size =
Flavor::HasZK ? dyadic_size() :
std::max(return_data_size, q_busread_end);
261 polynomials.calldata_inverses =
Polynomial(calldata_inverses_size, dyadic_size());
262 polynomials.secondary_calldata_inverses =
Polynomial(sec_calldata_inverses_size, dyadic_size());
263 polynomials.return_data_inverses =
Polynomial(return_data_inverses_size, dyadic_size());
267 const size_t max_databus_column_size =
std::max({
calldata_size, sec_calldata_size, return_data_size, 2UL });
268 polynomials.databus_id =
Polynomial(max_databus_column_size, dyadic_size());
290 auto& calldata_poly = polynomials.calldata;
291 auto& calldata_read_counts = polynomials.calldata_read_counts;
292 auto& calldata_read_tags = polynomials.calldata_read_tags;
293 auto& secondary_calldata_poly = polynomials.secondary_calldata;
294 auto& secondary_calldata_read_counts = polynomials.secondary_calldata_read_counts;
295 auto& secondary_calldata_read_tags = polynomials.secondary_calldata_read_tags;
296 auto& return_data_poly = polynomials.return_data;
297 auto& return_data_read_counts = polynomials.return_data_read_counts;
298 auto& return_data_read_tags = polynomials.return_data_read_tags;
300 const auto&
calldata = circuit.get_calldata();
301 const auto& secondary_calldata = circuit.get_secondary_calldata();
302 const auto& return_data = circuit.get_return_data();
306 for (
size_t idx = 0; idx <
calldata.size(); ++idx) {
307 calldata_poly.at(idx) = circuit.get_variable(
calldata[idx]);
308 calldata_read_counts.at(idx) =
calldata.get_read_count(idx);
309 calldata_read_tags.at(idx) = calldata_read_counts[idx] > 0 ? 1 : 0;
311 for (
size_t idx = 0; idx < secondary_calldata.size(); ++idx) {
312 secondary_calldata_poly.at(idx) = circuit.get_variable(secondary_calldata[idx]);
313 secondary_calldata_read_counts.at(idx) = secondary_calldata.get_read_count(idx);
314 secondary_calldata_read_tags.at(idx) =
315 secondary_calldata_read_counts[idx] > 0 ? 1 : 0;
317 for (
size_t idx = 0; idx < return_data.size(); ++idx) {
318 return_data_poly.at(idx) = circuit.get_variable(return_data[idx]);
319 return_data_read_counts.at(idx) = return_data.get_read_count(idx);
320 return_data_read_tags.at(idx) = return_data_read_counts[idx] > 0 ? 1 : 0;
323 auto& databus_id = polynomials.databus_id;
325 for (
size_t i = 0; i < databus_id.size(); ++i) {
326 databus_id.at(i) = i;
339 uint32_t ram_rom_offset = circuit.blocks.memory.trace_offset();
340 memory_read_records.reserve(circuit.memory_read_records.size());
341 for (
auto&
index : circuit.memory_read_records) {
342 memory_read_records.emplace_back(
index + ram_rom_offset);
344 memory_write_records.reserve(circuit.memory_write_records.size());
345 for (
auto&
index : circuit.memory_write_records) {
346 memory_write_records.emplace_back(
index + ram_rom_offset);
static void populate(Builder &builder, ProverPolynomials &)
Given a circuit, populate a proving key with wire polys, selector polys, and sigma/id polys.