Как однократно использовать nullifier в голосовании Mina
Действительный nullifier подтверждает связь с сообщением, а карта использованных значений фиксирует предыдущее применение. Для ограничения одним голосом нужны обе проверки.
Определите сообщение голосования
Задайте каноническое представление области и номера голосования в полях. Все участники голосования 17 создают nullifier для одного контекста. Если включить произвольное случайное число, один участник сможет получать дополнительные значения заменой числа. Допуск к голосованию проверяйте отдельно по правилам приложения.
nullifier.verify(electionMessage);
nullifier.assertUnused(witness, currentRoot);
const nextRoot = nullifier.setUsed(witness);
Сохраните отметку использования
Привяжите currentRoot к карте в состоянии сети, проверьте nullifier и отсутствие отметки по его ключу. Сохраните nextRoot вместе с результатом голоса. Повтор по новому корню должен отклоняться. Без смены состояния одно корректное доказательство можно было бы применять многократно.