> For the complete documentation index, see [llms.txt](https://valargroup.gitbook.io/shielded-vote-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://valargroup.gitbook.io/shielded-vote-docs/circuit-components/nullifier-derivation.md).

# Nullifier Derivation

**Used in:** ZKP #1 (conditions 2, 12)

## What it does

Derives a nullifier from a note's parameters. This is the standard Orchard nullifier derivation.

## Circuit

```
nf = DeriveNullifier_nk(ρ, ψ, cm)
   = ExtractP( [(PRF^nf_nk(ρ) + ψ) mod q] * NullifierBase + cm )
```

Where:

* `nk` — the nullifier deriving key
* `ρ` — the note's rho value
* `ψ` — the note's psi value
* `cm` — the note commitment (Pallas point)

## Usage in Shielded Vote

* **Condition 2** — Derives the public nullifier for the signed (dummy) note. This nullifier is published.
* **Condition 12** — Derives the real nullifier for each of the 5 input notes. These are kept **private** — they are only used internally for the governance nullifier derivation (condition 14) and the IMT non-membership check (condition 13).

The real nullifiers are never published on the vote chain. This is critical for privacy — publishing them would link governance activity to on-chain spending.

## Reference

Orchard spec §5.4.7.3 — Action Statement
