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