#dusk $DUSK
The double-spending solutions appeared in two different sections of the same protocol docs, and I kept treating them as the same idea until I looked at both closely.

Moonlight nonce: a simple counter. Your account has a current nonce. Every transaction must include exactly current_nonce + 1. The network rejects anything else. Visible, sequential, publicly verifiable.

Phoenix nullifier: a cryptographic value derived from the note's secret key. When you spend a note, you submit the nullifier. The network adds it to the nullifier list. Nobody can resubmit the same nullifier — double spend blocked. The nullifier reveals nothing about the note or the amount.

On mainnet, transactions settle in under 10 seconds. Both mechanisms operate within that window — whichever model you use, the double-spend check resolves before the next block.

Moonlight's nonce is transparent by design: it lets anyone verify a transaction is genuinely new. Phoenix's nullifier is private by design: it proves uniqueness without revealing which note was spent.

The comparison is more interesting than it sounds: the same fundamental guarantee — this transfer is new and unrepeatable — is enforced with completely different amounts of information disclosure. One broadcasts the counter. The other proves it without showing anything.

Which approach scales better under high transaction load — visible sequential state or private nullifier sets? @Dusk

$DUSK #dusk