Nullifier — это отпечаток каждой отдельной ноты, по которому программа SolMask распознаёт двойную трату, не узнавая при этом, какой именно депозит вы тратите. При депозите ваш браузер выбирает случайный nullifier_secret и хеширует его Poseidon-ом в commitment, который и попадает в блокчейн. Позже, при выводе, ваш zero-knowledge-proof раскрывает только Poseidon-хеш того же самого секрета — этот хеш и есть nullifier.
Программа поддерживает on-chain множество всех когда-либо использованных nullifier-ов. Инструкция вывода отклоняет любой proof, чей nullifier уже есть в этом множестве, так что одну ноту можно потратить ровно один раз. Принципиально, что nullifier — детерминированная функция только от секрета: два разных депозита дают два разных nullifier-а, и наблюдатель не может связать nullifier с конкретным commitment, не сломав сопротивляемость Poseidon-а к нахождению прообраза.
Поскольку nullifier раскрывается на выводе, а связь nullifier-а с commitment-ом скрыта самим proof-ом, защита от двойной траты не стоит вам приватности. Именно в этом и весь смысл конструкции.