75 size_t total_num_msm_rows =
builder->op_queue->get_num_rows();
77 BB_ASSERT_LTE(total_num_msm_rows, 1UL << CONST_ECCVM_LOG_N,
"ECCVM/Goblin: Too many ops in ecc op queue");
81 const size_t num_non_trivial_scalars_gemini_and_shplonk =
85 const size_t num_msm_rows_unshifted = 33 * ((num_polys - 1 + 3) / 4) + 31;
86 const size_t num_msm_rows_shifted = 33 * ((num_shifted + 3) / 4) + 31;
88 EXPECT_EQ(total_num_msm_rows - num_msm_rows_shifted - num_msm_rows_unshifted,
89 33 * ((num_non_trivial_scalars_gemini_and_shplonk + 1) / 2) + 33);
91 const size_t num_non_trivial_scalars_gemini_and_shplonk =
95 EXPECT_EQ(33 * ((num_polys + num_shifted + num_non_trivial_scalars_gemini_and_shplonk + 1) / 2) + 33,
114 const auto padding_indicator_array =
115 stdlib::compute_padding_indicator_array<Curve, log_circuit_size>(
log_circuit_size);
126 std::vector<std::string> unshifted_batching_challenge_labels;
127 std::vector<std::string> shifted_batching_challenge_labels;
129 for (
size_t idx = 0; idx < num_polys - 1; idx++) {
130 unshifted_batching_challenge_labels.push_back(
"rho_" +
std::to_string(idx));
132 for (
size_t idx = 0; idx < num_shifted; idx++) {
133 shifted_batching_challenge_labels.push_back(
"rho_" +
std::to_string(num_polys - 1 + idx));
138 auto unshifted_challenges =
139 prover_transcript->template get_challenges<NativeFr>(unshifted_batching_challenge_labels);
140 auto shifted_challenges =
141 prover_transcript->template get_challenges<NativeFr>(shifted_batching_challenge_labels);
144 for (
size_t i = 0; i < unshifted_challenges.size(); ++i) {
148 for (
size_t i = 0; i < shifted_challenges.size(); ++i) {
150 shifted_challenges[i]);
157 auto prover_opening_claims =
165 [[maybe_unused]]
auto _ = stdlib_verifier_transcript->template receive_from_prover<Fr>(
"Init");
168 auto stdlib_unshifted_commitments =
170 auto stdlib_shifted_commitments =
173 auto stdlib_unshifted_evaluations =
175 auto stdlib_shifted_evaluations =
180 for (
auto& comm : stdlib_unshifted_commitments) {
181 comm.unset_free_witness_tag();
183 for (
auto& comm : stdlib_shifted_commitments) {
184 comm.unset_free_witness_tag();
186 for (
auto& eval : stdlib_unshifted_evaluations) {
187 eval.unset_free_witness_tag();
189 for (
auto& eval : stdlib_shifted_evaluations) {
190 eval.unset_free_witness_tag();
196 for (
auto& challenge : u_challenge_in_circuit) {
197 challenge.unset_free_witness_tag();
211 std::vector<Fr> unshifted_challenges(num_polys);
214 unshifted_challenges[0] =
Fr(1);
216 auto tail = stdlib_verifier_transcript->template get_challenges<Fr>(unshifted_labels);
217 std::copy(tail.begin(), tail.end(), unshifted_challenges.begin() + 1);
220 auto shifted_challenges = stdlib_verifier_transcript->template get_challenges<Fr>(shifted_labels);
225 auto [unshifted_challenges, shifted_challenges] =
226 get_batching_challenges(unshifted_batching_challenge_labels, shifted_batching_challenge_labels);
229 Commitment::batch_mul(claim_batcher.get_unshifted().commitments, unshifted_challenges, 128);
232 Commitment::batch_mul(claim_batcher.get_shifted().commitments, shifted_challenges, 128);
236 unshifted_challenges.end(),
237 claim_batcher.get_unshifted().evaluations.begin(),
240 shifted_challenges.end(),
241 claim_batcher.get_shifted().evaluations.begin(),
254 u_challenge_in_circuit,
256 stdlib_verifier_transcript);
262 EXPECT_EQ(
vk.pairing_check(pairing_points.
P0.get_value(), pairing_points.
P1.get_value()),
true);
271 using clock = std::chrono::steady_clock;
272 auto start_total = clock::now();
276 auto start_builder = clock::now();
279 ECCVMProver prover(eccvm_builder, eccvm_transcript);
281 auto end_builder = clock::now();
283 info(
"ECCVM prover construction took ",
284 std::chrono::duration_cast<std::chrono::milliseconds>(end_builder - start_builder).count(),
287 auto start_prove = clock::now();
289 auto end_prove = clock::now();
291 info(
"ECCVM proof construction took ",
292 std::chrono::duration_cast<std::chrono::milliseconds>(end_prove - start_prove).count(),
295 auto end_total = clock::now();
296 info(
"ECCVM total (builder + proof) time: ",
297 std::chrono::duration_cast<std::chrono::milliseconds>(end_total - start_total).count(),
301 info(
"builder num gates ",
builder.get_num_finalized_gates_inefficient());