695 const auto transcript_rows =
698 const auto point_table_rows =
701 msms,
builder.get_number_of_muls(),
builder.op_queue->get_num_msm_rows());
703 const auto& point_table_read_counts =
std::get<1>(result);
705 const size_t num_rows =
707 vinfo(
"Num rows in the ECCVM: ", num_rows);
709 size_t dyadic_num_rows = 1UL << (log_num_rows + (1UL << log_num_rows == num_rows ? 0 : 1));
712 "The ECCVM circuit size has exceeded the fixed upper bound! Fixed size: " +
717 if (disable_fixed_dyadic_trace_size) {
718 dyadic_num_rows = num_rows;
728 const auto offset_size = [](
const size_t size) {
return TRACE_OFFSET + size; };
729 const size_t transcript_alloc_size = offset_size(transcript_rows.size());
730 const size_t point_table_alloc_size = offset_size(point_table_rows.size());
731 const size_t msm_alloc_size = offset_size(msm_rows.size());
732 const size_t read_counts_alloc_size = offset_size(point_table_read_counts[0].size() + 1);
743 poly =
Polynomial(transcript_alloc_size, dyadic_num_rows);
747 poly =
Polynomial(point_table_alloc_size, dyadic_num_rows);
751 poly =
Polynomial(msm_alloc_size, dyadic_num_rows);
755 poly =
Polynomial(read_counts_alloc_size, dyadic_num_rows);
777 for (
auto& poly : get_all()) {
778 if (poly.is_empty()) {
783 lookup_inverses.add_masking();
786 lagrange_first.at(trace_offset) = 1;
787 lagrange_second.at(trace_offset + 1) = 1;
788 lagrange_third.at(trace_offset + 2) = 1;
789 lagrange_last.at(dyadic_num_rows - 1) = 1;
790 for (
size_t i = 0; i < point_table_read_counts[0].size(); ++i) {
797 lookup_read_counts_0.at(trace_offset + i + 1) = point_table_read_counts[0][i];
798 lookup_read_counts_1.at(trace_offset + i + 1) = point_table_read_counts[1][i];
803 for (size_t i = start; i < end; i++) {
804 const size_t idx = trace_offset + i;
805 transcript_accumulator_not_empty.set_if_valid_index(idx, transcript_rows[i].accumulator_not_empty);
806 transcript_add.set_if_valid_index(idx, transcript_rows[i].q_add);
807 transcript_mul.set_if_valid_index(idx, transcript_rows[i].q_mul);
808 transcript_eq.set_if_valid_index(idx, transcript_rows[i].q_eq);
809 transcript_reset_accumulator.set_if_valid_index(idx, transcript_rows[i].q_reset_accumulator);
810 transcript_msm_transition.set_if_valid_index(idx, transcript_rows[i].msm_transition);
811 transcript_pc.set_if_valid_index(idx, transcript_rows[i].pc);
812 transcript_msm_count.set_if_valid_index(idx, transcript_rows[i].msm_count);
813 transcript_Px.set_if_valid_index(idx, transcript_rows[i].base_x);
814 transcript_Py.set_if_valid_index(idx, transcript_rows[i].base_y);
815 transcript_z1.set_if_valid_index(idx, transcript_rows[i].z1);
816 transcript_z2.set_if_valid_index(idx, transcript_rows[i].z2);
817 transcript_z1zero.set_if_valid_index(idx, transcript_rows[i].z1_zero);
818 transcript_z2zero.set_if_valid_index(idx, transcript_rows[i].z2_zero);
819 transcript_op.set_if_valid_index(idx, transcript_rows[i].opcode);
820 transcript_accumulator_x.set_if_valid_index(idx, transcript_rows[i].accumulator_x);
821 transcript_accumulator_y.set_if_valid_index(idx, transcript_rows[i].accumulator_y);
822 transcript_msm_x.set_if_valid_index(idx, transcript_rows[i].msm_output_x);
823 transcript_msm_y.set_if_valid_index(idx, transcript_rows[i].msm_output_y);
824 transcript_base_infinity.set_if_valid_index(idx, transcript_rows[i].base_infinity);
825 transcript_base_x_inverse.set_if_valid_index(idx, transcript_rows[i].base_x_inverse);
826 transcript_base_y_inverse.set_if_valid_index(idx, transcript_rows[i].base_y_inverse);
827 transcript_add_x_equal.set_if_valid_index(idx, transcript_rows[i].transcript_add_x_equal);
828 transcript_add_y_equal.set_if_valid_index(idx, transcript_rows[i].transcript_add_y_equal);
829 transcript_add_lambda.set_if_valid_index(idx, transcript_rows[i].transcript_add_lambda);
830 transcript_msm_intermediate_x.set_if_valid_index(idx,
831 transcript_rows[i].transcript_msm_intermediate_x);
832 transcript_msm_intermediate_y.set_if_valid_index(idx,
833 transcript_rows[i].transcript_msm_intermediate_y);
834 transcript_msm_infinity.set_if_valid_index(idx, transcript_rows[i].transcript_msm_infinity);
835 transcript_msm_x_inverse.set_if_valid_index(idx, transcript_rows[i].transcript_msm_x_inverse);
836 transcript_msm_count_zero_at_transition.set_if_valid_index(
837 idx, transcript_rows[i].msm_count_zero_at_transition);
838 transcript_msm_count_at_transition_inverse.set_if_valid_index(
839 idx, transcript_rows[i].msm_count_at_transition_inverse);
844 for (size_t i = start; i < end; i++) {
845 const size_t idx = trace_offset + i;
849 precompute_select.set_if_valid_index(idx, (i != 0) ? 1 : 0);
850 precompute_pc.set_if_valid_index(idx, point_table_rows[i].pc);
851 precompute_point_transition.set_if_valid_index(
852 idx, static_cast<uint64_t>(point_table_rows[i].point_transition));
853 precompute_round.set_if_valid_index(idx, point_table_rows[i].round);
854 precompute_scalar_sum.set_if_valid_index(idx, point_table_rows[i].scalar_sum);
855 precompute_s1hi.set_if_valid_index(idx, point_table_rows[i].s1);
856 precompute_s1lo.set_if_valid_index(idx, point_table_rows[i].s2);
857 precompute_s2hi.set_if_valid_index(idx, point_table_rows[i].s3);
858 precompute_s2lo.set_if_valid_index(idx, point_table_rows[i].s4);
859 precompute_s3hi.set_if_valid_index(idx, point_table_rows[i].s5);
860 precompute_s3lo.set_if_valid_index(idx, point_table_rows[i].s6);
861 precompute_s4hi.set_if_valid_index(idx, point_table_rows[i].s7);
862 precompute_s4lo.set_if_valid_index(idx, point_table_rows[i].s8);
866 precompute_skew.set_if_valid_index(idx, point_table_rows[i].skew ? 7 : 0);
867 precompute_dx.set_if_valid_index(idx, point_table_rows[i].precompute_double.x);
868 precompute_dy.set_if_valid_index(idx, point_table_rows[i].precompute_double.y);
869 precompute_tx.set_if_valid_index(idx, point_table_rows[i].precompute_accumulator.x);
870 precompute_ty.set_if_valid_index(idx, point_table_rows[i].precompute_accumulator.y);
876 for (size_t i = start; i < end; i++) {
877 const size_t idx = trace_offset + i;
878 msm_transition.set_if_valid_index(idx, static_cast<int>(msm_rows[i].msm_transition));
879 msm_add.set_if_valid_index(idx, static_cast<int>(msm_rows[i].q_add));
880 msm_double.set_if_valid_index(idx, static_cast<int>(msm_rows[i].q_double));
881 msm_skew.set_if_valid_index(idx, static_cast<int>(msm_rows[i].q_skew));
882 msm_accumulator_x.set_if_valid_index(idx, msm_rows[i].accumulator_x);
883 msm_accumulator_y.set_if_valid_index(idx, msm_rows[i].accumulator_y);
884 msm_pc.set_if_valid_index(idx, msm_rows[i].pc);
885 msm_size_of_msm.set_if_valid_index(idx, msm_rows[i].msm_size);
886 msm_count.set_if_valid_index(idx, msm_rows[i].msm_count);
887 msm_round.set_if_valid_index(idx, msm_rows[i].msm_round);
888 msm_add1.set_if_valid_index(idx, static_cast<int>(msm_rows[i].add_state[0].add));
889 msm_add2.set_if_valid_index(idx, static_cast<int>(msm_rows[i].add_state[1].add));
890 msm_add3.set_if_valid_index(idx, static_cast<int>(msm_rows[i].add_state[2].add));
891 msm_add4.set_if_valid_index(idx, static_cast<int>(msm_rows[i].add_state[3].add));
892 msm_x1.set_if_valid_index(idx, msm_rows[i].add_state[0].point.x);
893 msm_y1.set_if_valid_index(idx, msm_rows[i].add_state[0].point.y);
894 msm_x2.set_if_valid_index(idx, msm_rows[i].add_state[1].point.x);
895 msm_y2.set_if_valid_index(idx, msm_rows[i].add_state[1].point.y);
896 msm_x3.set_if_valid_index(idx, msm_rows[i].add_state[2].point.x);
897 msm_y3.set_if_valid_index(idx, msm_rows[i].add_state[2].point.y);
898 msm_x4.set_if_valid_index(idx, msm_rows[i].add_state[3].point.x);
899 msm_y4.set_if_valid_index(idx, msm_rows[i].add_state[3].point.y);
900 msm_collision_x1.set_if_valid_index(idx, msm_rows[i].add_state[0].collision_inverse);
901 msm_collision_x2.set_if_valid_index(idx, msm_rows[i].add_state[1].collision_inverse);
902 msm_collision_x3.set_if_valid_index(idx, msm_rows[i].add_state[2].collision_inverse);
903 msm_collision_x4.set_if_valid_index(idx, msm_rows[i].add_state[3].collision_inverse);
904 msm_lambda1.set_if_valid_index(idx, msm_rows[i].add_state[0].lambda);
905 msm_lambda2.set_if_valid_index(idx, msm_rows[i].add_state[1].lambda);
906 msm_lambda3.set_if_valid_index(idx, msm_rows[i].add_state[2].lambda);
907 msm_lambda4.set_if_valid_index(idx, msm_rows[i].add_state[3].lambda);
908 msm_slice1.set_if_valid_index(idx, msm_rows[i].add_state[0].slice);
909 msm_slice2.set_if_valid_index(idx, msm_rows[i].add_state[1].slice);
910 msm_slice3.set_if_valid_index(idx, msm_rows[i].add_state[2].slice);
911 msm_slice4.set_if_valid_index(idx, msm_rows[i].add_state[3].slice);