A nullifier is the public marker for one spent child note. It lets the pool stop a double spend without publishing the child secret or Merkle path.

Lifecycle

What becomes public

Observers can see the nullifier, pool, transaction, destination, gross amount, fee, sender, and timing. The nullifier reveals no child secret; the surrounding transaction remains public.

Double-spend rule

The client checks spent state before proving to avoid wasted work, then checks again after proving. The contract performs the final check and records the nullifier atomically with payment. The sibling child has a different nullifier and remains available until that nullifier is spent.

When submission is unclear

Do not assume a timeout means the child is still available. Check the original transaction, its receipt, the pool’s nullifier mapping, and the matching Withdrawal event. Retry only after a definite failure and an unspent pool result. See Choose a submission path for the user flow.