Nullifier 是每张票据独有的指纹,SolMask 程序借助它来检测双花,同时又不会知道你具体动用的是哪笔存款。存款时,你的浏览器先生成一个随机的 nullifier_secret,再用 Poseidon 哈希进链上 commitment 之中。后来取款时,你的零知识证明只会公开这个同一秘密的 Poseidon 哈希——这个哈希就是 nullifier。
程序在链上维护一份已用过的 nullifier 集合。取款指令会拒绝任何 nullifier 已在集合中的证明,所以每张票据只能被花一次。关键在于,nullifier 仅由 secret 决定性地推导而来:两笔不同的存款会得到两个不同的 nullifier,观察者若不打破 Poseidon 的原像抗性,就无法把某个 nullifier 反推到对应的 commitment。
由于 nullifier 在取款时才被披露,而 nullifier 到 commitment 的对应关系被证明本身遮盖住,因此防止双花并不会损失你的隐私。这正是整个构造的核心目的。
注意:中文社区对 nullifier 没有完全统一的固定译名,业界多直接沿用 "nullifier",本词条采用 "Nullifier(作废符)" 兼顾搜索习惯与可读性。