701 const auto transcript_rows =
704 const auto point_table_rows =
707 msms,
builder.get_number_of_muls(),
builder.op_queue->get_num_msm_rows());
711 const size_t num_rows =
713 vinfo(
"Num rows in the ECCVM: ", num_rows);
715 size_t dyadic_num_rows = 1UL << (log_num_rows + (1UL << log_num_rows == num_rows ? 0 : 1));
718 "The ECCVM circuit size has exceeded the fixed upper bound! Fixed size: " +
723 if (disable_fixed_dyadic_trace_size) {
724 dyadic_num_rows = num_rows;
734 const auto offset_size = [](
const size_t size) {
return TRACE_OFFSET + size; };
735 const size_t transcript_alloc_size = offset_size(transcript_rows.size());
736 const size_t point_table_alloc_size = offset_size(point_table_rows.size());
737 const size_t msm_alloc_size = offset_size(msm_rows.size());
738 const size_t read_counts_alloc_size = offset_size(point_table_read_counts[0].size() + 1);
749 poly =
Polynomial(transcript_alloc_size, dyadic_num_rows);
753 poly =
Polynomial(point_table_alloc_size, dyadic_num_rows);
757 poly =
Polynomial(msm_alloc_size, dyadic_num_rows);
761 poly =
Polynomial(read_counts_alloc_size, dyadic_num_rows);
783 for (
auto& poly : get_all()) {
784 if (poly.is_empty()) {
789 lookup_inverses.add_masking();
792 lagrange_first.at(trace_offset) = 1;
793 lagrange_second.at(trace_offset + 1) = 1;
794 lagrange_third.at(trace_offset + 2) = 1;
795 lagrange_last.at(dyadic_num_rows - 1) = 1;
797 static const auto MSM_ROUND_MINUS_31_INV_BY_ROUND = []() {
799 for (
size_t round = 0; round < table.size(); ++round) {
809 for (
size_t i = 0; i < point_table_read_counts[0].size(); ++i) {
816 lookup_read_counts_0.at(trace_offset + i + 1) = point_table_read_counts[0][i];
817 lookup_read_counts_1.at(trace_offset + i + 1) = point_table_read_counts[1][i];
822 for (size_t i = start; i < end; i++) {
823 const size_t idx = trace_offset + i;
824 transcript_accumulator_not_empty.set_if_valid_index(idx, transcript_rows[i].accumulator_not_empty);
825 transcript_add.set_if_valid_index(idx, transcript_rows[i].q_add);
826 transcript_mul.set_if_valid_index(idx, transcript_rows[i].q_mul);
827 transcript_eq.set_if_valid_index(idx, transcript_rows[i].q_eq);
828 transcript_reset_accumulator.set_if_valid_index(idx, transcript_rows[i].q_reset_accumulator);
829 transcript_msm_transition.set_if_valid_index(idx, transcript_rows[i].msm_transition);
830 transcript_pc.set_if_valid_index(idx, transcript_rows[i].pc);
831 transcript_msm_count.set_if_valid_index(idx, transcript_rows[i].msm_count);
832 transcript_Px.set_if_valid_index(idx, transcript_rows[i].base_x);
833 transcript_Py.set_if_valid_index(idx, transcript_rows[i].base_y);
834 transcript_z1.set_if_valid_index(idx, transcript_rows[i].z1);
835 transcript_z2.set_if_valid_index(idx, transcript_rows[i].z2);
836 transcript_z1zero.set_if_valid_index(idx, transcript_rows[i].z1_zero);
837 transcript_z2zero.set_if_valid_index(idx, transcript_rows[i].z2_zero);
838 transcript_op.set_if_valid_index(idx, transcript_rows[i].opcode);
839 transcript_accumulator_x.set_if_valid_index(idx, transcript_rows[i].accumulator_x);
840 transcript_accumulator_y.set_if_valid_index(idx, transcript_rows[i].accumulator_y);
841 transcript_msm_x.set_if_valid_index(idx, transcript_rows[i].msm_output_x);
842 transcript_msm_y.set_if_valid_index(idx, transcript_rows[i].msm_output_y);
843 transcript_base_infinity.set_if_valid_index(idx, transcript_rows[i].base_infinity);
844 transcript_base_x_inverse.set_if_valid_index(idx, transcript_rows[i].base_x_inverse);
845 transcript_base_y_inverse.set_if_valid_index(idx, transcript_rows[i].base_y_inverse);
846 transcript_add_x_equal.set_if_valid_index(idx, transcript_rows[i].transcript_add_x_equal);
847 transcript_add_y_equal.set_if_valid_index(idx, transcript_rows[i].transcript_add_y_equal);
848 transcript_add_lambda.set_if_valid_index(idx, transcript_rows[i].transcript_add_lambda);
849 transcript_msm_intermediate_x.set_if_valid_index(idx,
850 transcript_rows[i].transcript_msm_intermediate_x);
851 transcript_msm_intermediate_y.set_if_valid_index(idx,
852 transcript_rows[i].transcript_msm_intermediate_y);
853 transcript_msm_infinity.set_if_valid_index(idx, transcript_rows[i].transcript_msm_infinity);
854 transcript_msm_x_inverse.set_if_valid_index(idx, transcript_rows[i].transcript_msm_x_inverse);
855 transcript_msm_count_zero_at_transition.set_if_valid_index(
856 idx, transcript_rows[i].msm_count_zero_at_transition);
857 transcript_msm_count_at_transition_inverse.set_if_valid_index(
858 idx, transcript_rows[i].msm_count_at_transition_inverse);
863 for (size_t i = start; i < end; i++) {
864 const size_t idx = trace_offset + i;
868 precompute_select.set_if_valid_index(idx, (i != 0) ? 1 : 0);
869 precompute_pc.set_if_valid_index(idx, point_table_rows[i].pc);
870 precompute_point_transition.set_if_valid_index(
871 idx, static_cast<uint64_t>(point_table_rows[i].point_transition));
872 precompute_round.set_if_valid_index(idx, point_table_rows[i].round);
873 precompute_scalar_sum.set_if_valid_index(idx, point_table_rows[i].scalar_sum);
874 precompute_s1hi.set_if_valid_index(idx, point_table_rows[i].s1);
875 precompute_s1lo.set_if_valid_index(idx, point_table_rows[i].s2);
876 precompute_s2hi.set_if_valid_index(idx, point_table_rows[i].s3);
877 precompute_s2lo.set_if_valid_index(idx, point_table_rows[i].s4);
878 precompute_s3hi.set_if_valid_index(idx, point_table_rows[i].s5);
879 precompute_s3lo.set_if_valid_index(idx, point_table_rows[i].s6);
880 precompute_s4hi.set_if_valid_index(idx, point_table_rows[i].s7);
881 precompute_s4lo.set_if_valid_index(idx, point_table_rows[i].s8);
885 precompute_skew.set_if_valid_index(idx, point_table_rows[i].skew ? 7 : 0);
886 precompute_dx.set_if_valid_index(idx, point_table_rows[i].precompute_double.x);
887 precompute_dy.set_if_valid_index(idx, point_table_rows[i].precompute_double.y);
888 precompute_tx.set_if_valid_index(idx, point_table_rows[i].precompute_accumulator.x);
889 precompute_ty.set_if_valid_index(idx, point_table_rows[i].precompute_accumulator.y);
895 for (size_t i = start; i < end; i++) {
896 const size_t idx = trace_offset + i;
897 msm_transition.set_if_valid_index(idx, static_cast<int>(msm_rows[i].msm_transition));
898 msm_add.set_if_valid_index(idx, static_cast<int>(msm_rows[i].q_add));
899 msm_double.set_if_valid_index(idx, static_cast<int>(msm_rows[i].q_double));
900 msm_skew.set_if_valid_index(idx, static_cast<int>(msm_rows[i].q_skew));
901 msm_accumulator_x.set_if_valid_index(idx, msm_rows[i].accumulator_x);
902 msm_accumulator_y.set_if_valid_index(idx, msm_rows[i].accumulator_y);
903 msm_pc.set_if_valid_index(idx, msm_rows[i].pc);
904 msm_size_of_msm.set_if_valid_index(idx, msm_rows[i].msm_size);
905 msm_count.set_if_valid_index(idx, msm_rows[i].msm_count);
906 msm_round.set_if_valid_index(idx, msm_rows[i].msm_round);
909 msm_round_minus_31_inv.set_if_valid_index(idx,
910 MSM_ROUND_MINUS_31_INV_BY_ROUND[msm_rows[i].msm_round]);
911 msm_add1.set_if_valid_index(idx, static_cast<int>(msm_rows[i].add_state[0].add));
912 msm_add2.set_if_valid_index(idx, static_cast<int>(msm_rows[i].add_state[1].add));
913 msm_add3.set_if_valid_index(idx, static_cast<int>(msm_rows[i].add_state[2].add));
914 msm_add4.set_if_valid_index(idx, static_cast<int>(msm_rows[i].add_state[3].add));
915 msm_x1.set_if_valid_index(idx, msm_rows[i].add_state[0].point.x);
916 msm_y1.set_if_valid_index(idx, msm_rows[i].add_state[0].point.y);
917 msm_x2.set_if_valid_index(idx, msm_rows[i].add_state[1].point.x);
918 msm_y2.set_if_valid_index(idx, msm_rows[i].add_state[1].point.y);
919 msm_x3.set_if_valid_index(idx, msm_rows[i].add_state[2].point.x);
920 msm_y3.set_if_valid_index(idx, msm_rows[i].add_state[2].point.y);
921 msm_x4.set_if_valid_index(idx, msm_rows[i].add_state[3].point.x);
922 msm_y4.set_if_valid_index(idx, msm_rows[i].add_state[3].point.y);
923 msm_collision_x1.set_if_valid_index(idx, msm_rows[i].add_state[0].collision_inverse);
924 msm_collision_x2.set_if_valid_index(idx, msm_rows[i].add_state[1].collision_inverse);
925 msm_collision_x3.set_if_valid_index(idx, msm_rows[i].add_state[2].collision_inverse);
926 msm_collision_x4.set_if_valid_index(idx, msm_rows[i].add_state[3].collision_inverse);
927 msm_lambda1.set_if_valid_index(idx, msm_rows[i].add_state[0].lambda);
928 msm_lambda2.set_if_valid_index(idx, msm_rows[i].add_state[1].lambda);
929 msm_lambda3.set_if_valid_index(idx, msm_rows[i].add_state[2].lambda);
930 msm_lambda4.set_if_valid_index(idx, msm_rows[i].add_state[3].lambda);
931 msm_slice1.set_if_valid_index(idx, msm_rows[i].add_state[0].slice);
932 msm_slice2.set_if_valid_index(idx, msm_rows[i].add_state[1].slice);
933 msm_slice3.set_if_valid_index(idx, msm_rows[i].add_state[2].slice);
934 msm_slice4.set_if_valid_index(idx, msm_rows[i].add_state[3].slice);