Concepts: Airdrop Nullifiers
To guard against airdrop double-claims while keeping claims unlinkable to later Zcash shielded spends, we publish an airdrop nullifier: a public, deterministic, airdrop-scoped identifier derived from the note’s nullifier key material via domain separation.
An airdrop configuration fixes two public domain parameters:
- targetS: Sapling domain parameter (BLAKE2s personalization, exactly 8 bytes).
- targetO: Orchard domain parameter used as the hash-to-curve domain string (at most 32 bytes, and must be valid UTF-8).
These parameters must be chosen so they do not coincide with the protocol domains for standard nullifiers: Zcash_nf (Sapling) and z.cash:Orchard (Orchard). See the cited specifications below.
If targetS = "Zcash_nf" (Sapling) or targetO = "z.cash:Orchard" (Orchard), then the airdrop construction collapses to the standard Zcash nullifier domain for that pool, meaning the published airdrop nullifiers will match Zcash nullifiers for the same notes and remove privacy.
The codebase uses targetS = "ZAIRTEST" and targetO = "ZAIRTEST:O" as defaults.
- Sapling:
targetSis compiled into the Groth16 circuit; changing it requires a new trusted setup and verifying key, which is required for every target deployment supporting Sapling. - Orchard:
targetOis baked into the circuit. Keys are re-derived deterministically pertargetOat runtime (transparent setup, no ceremony).
Sapling
Sapling specifies the standard nullifier PRF (Sapling Protocol Specification, §5.4.2):
The Sapling airdrop nullifier uses the same construction, but replaces the personalization string with the public airdrop parameter targetS:
Orchard
Orchard specifies nullifier derivation (Zcash Protocol Specification, §4.16):
with generator:
The Orchard airdrop nullifier is derived by using an airdrop-specific generator:
and then computing as specified, but replacing with .