#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
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

