Eu estava olhando para o modelo de transação transparente da Dusk e, inicialmente, passei por cima de algo que soava quase bom demais para ser verdade: o nonce.

Moonlight é o modelo de transações baseado em contas da Dusk. Cada conta tem uma chave pública, um saldo e um nonce, sendo que o nonce atua como um contador das transações enviadas a partir daquela conta.

Esse pequeno contador tem uma função maior do que parece à primeira vista.

O whitepaper conecta explicitamente o nonce à proteção contra replay. Uma transação não é apenas autorizada porque a assinatura é válida; a sequência de transações da conta também precisa fazer sentido.

Esta é uma daquelas peças da infraestrutura de blockchain que os usuários quase nunca notam quando funciona corretamente.

Você assina uma transação, a rede a processa, seu saldo muda e você segue em frente.
Mas sem mecanismos que impeçam que uma transação válida e antiga seja aceita novamente, a mesma autorização poderia potencialmente se transformar em um problema de segurança completamente diferente.
O que acho interessante sobre a Dusk é que Moonlight e Phoenix resolvem os mesmos requisitos fundamentais de transação por meio de modelos bem diferentes.

Moonlight expõe publicamente o estado da conta, os saldos e os metadados da transação. Phoenix leva a verificação de saldo e a proteção contra double-spend para dentro de provas ZK e nullifiers. Ainda assim, ambos precisam estabelecer propriedade, impedir malleabilidade e parar double spending.

Então a decisão de design real não é simplesmente pública vs. privada.

É quanto da transição de estado a rede consegue verificar diretamente versus quanto precisa ser provado criptograficamente.
Isso torna o humilde nonce mais interessante do que parece.

A transação visível é apenas a superfície. Por baixo dela há um conjunto de regras garantindo que a mesma autorização não possa simplesmente ser repetida.

Quantos “recursos” de blockchain são, na verdade, suposições invisíveis de segurança que os usuários só percebem quando falham?

@Dusk $DUSK #dusk