As restrições do circuito Phoenix de leitura me impediram. Em Dusk $DUSK #dusk @Duskfoundation o Transfer Contract nunca olha para os valores reais das notas nem para qual folha Merkle é gasta.
Ele só verifica uma prova PLONK de que as entradas privadas satisfazem cinco condições: o hash da nota se abre contra uma raiz Merkle recente de notas, o prover conhece a chave secreta da nota, o nullifier é igual a Poseidon(npk′ ‖ posição), os compromissos de saída são abertos corretamente e a soma dos valores de entrada é igual às saídas mais a taxa mais qualquer depósito.
Os próprios nullifiers são publicados para que a rede possa rejeitar reutilização. Como cada um é derivado da chave e da posição ocultas da nota, nenhum observador consegue mapear um nullifier de volta para uma folha específica. A validade vive inteiramente dentro do cumprimento do circuito; o conteúdo nunca aparece no ledger.
O que mudou para mim foi perceber que a proteção contra double-spend e a integridade do saldo ficam ambas dentro da prova, em vez de qualquer mudança de estado visível.
Próxima verificação: se cada transação Phoenix aceita, cujos nullifiers publicados permanecem únicos no conjunto de nullifiers on-chain após a finalização.
@Dusk