Написание сингапурского валидатора NRIC в Circcom

Я собираюсь написать схему Circcom для проверки сингапурского NRIC, подробную информацию об алгоритме контрольной суммы проверки можно найти здесь.

Короче говоря, это строка, содержащая

  1. префикс, который представляет собой перечисление вариантов: S, T, G, F и M,
  2. суффикс, опять же перечисление некоторых алфавитов как его вариантов,
  3. 7 цифр

Шаги для проверки NRIC следующие:

  1. Умножьте каждую цифру номера NRIC на ее вес, т.е. 2 7 6 5 4 3 2 по порядку.
  2. Сложите вышеперечисленные продукты.
  3. Если префикс NRIC — T или G, прибавьте 4 к общей сумме.
  4. Найдите остаток от (суммы, рассчитанной выше) по модулю 11.
  5. Если префикс NRIC F или G: 0=X, 1=W, 2=U, 3=T, 4=R, 5=Q, 6=P, 7=N, 8=M, 9=L. , 10=К
  6. Если префикс NRIC S или T: 0=J, 1=Z, 2=I, 3=H, 4=G, 5=F, 6=E, 7=D, 8=C, 9=B. , 10=А
  7. Действительно, если напоминание == номер, который представляет префикс.

Вот моя схема:

      pragma circom 2.1.5;

template NRICValidator() {
  signal input prefix; // 1 or 2
  signal input suffix; // 3 or 4
  signal input digits[7];
  var sumWithOffset;
  var weights[5] = [2, 7, 6, 5, 4, 3, 2];
  var checkDigits[11] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
  var offset = 4;

  var weightedSum = digits[0]*weights[0] + digits[1]*weights[1] + digits[2]*weights[2] + digits[3]*weights[3] + digits[4]*weights[4] + digits[5]*weights[5] + digits[6]*weights[6];
  if (prefix == 1 && prefix == 2) { // T or G
    var sumWithOffset = weightedSum + offset;
  } else {
    var sumWithOffset = weightedSum; // S or F
  }
  
  signal output valid;
  sumWithOffset %= 11; // <=== a number between 0 to 10
  valid <== (checkDigits[sumWithOffset] == suffix); // <=== Error: Non-quadratic constraint was detected statically, using unknown index will cause the constraint to be non-quadratic
}

component main = NRICValidator();

Я попробовал скомпилировать его и получил следующую ошибку:

      error[T20462]: Typing error found
   ┌─ "main.circom":21:14
   │
21 │   valid <== (checkDigits[sumWithOffset] == suffix); // <=== Error: Non-quadratic constraint was detected statically, using unknown index will cause the constraint to be non-quadratic
   │              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Non-quadratic constraint was detected statically, using unknown index will cause the constraint to be non-quadratic

previous errors were found

Есть ли какое-нибудь решение, чтобы обойти это?

0 ответов

Другие вопросы по тегам