Ho scritto un articolo che spiega Quel progetto è stato il mio primo incontro reale con la tecnologia zero-knowledge-proof, e mi ha aiutato a capire il suo funzionamento interno. In questo nuovo articolo, introdurrò un concetto che si basa su Tornado Cash - essenzialmente un "blockchain incorporato" simile a zCash. Non è una vera soluzione Layer 2, poiché tutta l'attività avviene interamente sulla catena. Ma prima di esplorare la meccanica, prendiamo un momento per rivedere i fondamenti. Come funziona Tornado Cash Come funziona Tornado Cash? Dal momento che ho già scritto un articolo dettagliato sul tema, darò un riassunto qui. Se sei interessato alla subacquea tecnica, ti consiglio di leggere i miei articoli precedenti: La magia della prova di zero conoscenza attraverso il codice sorgente di Tornado Cash JavaScript Tutorial for Zero-Knowledge Proofs Utilizzando snarkjs e circom Come ho costruito un sistema di voto anonimo sulla blockchain di Ethereum utilizzando la prova zero-knowledge In breve, Tornado Cash funziona avendo un deposito utente ETH o un altro token nel contratto intelligente Tornado Cash, insieme a un Ogni azione ha un associato , che è noto solo all'utente. Il contratto intelligente memorizza l'impegno in un albero Merkle. In seguito, l'utente può ritirare i fondi da un indirizzo diverso rivelando il nullifier. commitment nullifier Poiché solo l'utente conosce l'annullatore, nessuno può collegare il prelievo al deposito originale. Tuttavia, il contratto intelligente deve ancora verificare che l'annullatore è collegato a un impegno valido. Questo mostra : zero-knowledge proof L'impegno fa parte dell'albero Merkle (l'utente effettivamente depositato nel contratto), e Il nullifier è derivato da questo impegno. Ogni annullatore può essere utilizzato solo una volta, garantendo che i fondi non possano essere ritirati più di una volta. In Tornado Cash, gli hash di impegno e nullifier sono calcolati come segue: commitment_hash = HASH(nullifier, secret) nullifier_hash = HASH(nullifier) Poiché gli hash criptografici sono funzioni unidirezionali (non è possibile determinare l'ingresso originale dall'hash senza forza bruta), è impossibile collegare il e il Tuttavia, la loro relazione può essere dimostrata utilizzando la prova del sapere zero. commitment_hash nullifier_hash Per esempio, se si deposita 12,34 ETH e poi si ritira esattamente 12,34 ETH, qualcuno potrebbe ragionevolmente indovinare che i due sono collegati. Il concetto che descriverò nella prossima sezione affronta questa limitazione, ispirandosi a come zCash risolve il problema. Risolvere il problema della denominazione fissa La limitazione degli importi di deposito fisso può essere superata introducendo due metodi aggiuntivi insieme al deposito e al prelievo: e . split merge Il La funzione funziona in modo simile a un prelievo, ma invece di specificare un indirizzo Ethereum, l'utente fornisce due nuovi impegni. Una divisione consente all'utente di dividere l'importo memorizzato in due parti - e, soprattutto, questo accade senza rivelare i nuovi importi a chiunque osservi la blockchain. split Nel sistema aggiornato, l’impegno è strutturato come segue: commitment_hash = HASH(amount, nullifier, secret) Questa struttura è essenziale perché, durante una divisione, l'utente deve dimostrare che i due nuovi impegni contengono importi che si aggiungono esattamente all'importo dell'impegno originale. È facile vedere come questo meccanismo affronta il problema della denominazione fissa in Tornado Cash. Ad esempio, un utente potrebbe depositare un importo arbitrario come 100 ETH, dividerlo in parti (ad esempio, 60 ETH e 40 ETH), e poi ritirarli a indirizzi diversi. Poiché i valori sono nascosti all'interno degli impegni, nessuno può collegare il prelievo al deposito originale in base all'importo solo. Non c'è bisogno di ritirare i fondi immediatamente. gli utenti possono funziona come una sorta di portafoglio virtuale. operazione, che consente a due impegni memorizzati (riferiti tramite i loro nullifiers) di essere combinati in un unico nuovo impegno. store value in the smart contract itself merge Per eseguire una fusione, l'utente deve dimostrare che l'importo totale nei due impegni di input corrisponde all'importo nel nuovo impegno. Ciò crea una sorta di , dove ogni utente ha un saldo privato e può inviare fondi liberamente ad altri. I prelievi sono necessari solo quando qualcuno vuole uscire dal sistema e spendere i propri beni al di fuori di questo livello privato. embedded ledger Privacy-Preserving Layer su Ethereum Vediamo un esempio per vedere come funziona questo strato di privacy in pratica: Alice crea un pool di 100 ETH sul contratto intelligente depositando 100 ETH insieme ad un impegno. Bob fa lo stesso, creando un pool di 10 ETH con il proprio impegno. Alice vuole inviare 10 ETH a Bob. Utilizza la funzione split, che consuma il suo nullifier e divide il 100 ETH originale in due nuovi impegni: uno per 10 ETH e uno per 90 ETH. Ora, Alice detiene due nullifiers - uno che rappresenta 10 ETH, l'altro 90 ETH. Alice crittografa il nullalizzatore di 10 ETH utilizzando la chiave pubblica di Bob e lo scrive sulla blockchain. Bob decripta il messaggio utilizzando la sua chiave privata e ottiene il nullifier. ora può o ritirare il 10 ETH o unirlo con il suo saldo esistente. Bob sceglie di mantenere i fondi nel sistema, quindi utilizza l'operazione di fusione. Egli fornisce il nullifier dal suo impegno di 10 ETH e quello ricevuto da Alice, quindi crea un nuovo impegno per 20 ETH. Dopo la transazione: Alice ha un saldo rimanente di 90 ETH, Bob ora controlla 20 ETH nel livello di privacy. Poiché gli annullatori e gli impegni non trasportano informazioni visibili al pubblico, e i messaggi tra utenti sono crittografati, tutte queste transazioni si verificano. . completely anonymously Poiché gli utenti possono liberamente trasferire valore all'interno del sistema senza rivelare somme o identità, spesso non c'è bisogno di ritirare. Con una differenza fondamentale: . Layer 2 blockchain everything happens on-chain Conclusion Conclusione Con due semplici operazioni - e - possiamo migliorare in modo significativo il concetto originale di Tornado Cash e trasformarlo in un su Ethereum. A differenza dei tradizionali mixer limitati a denominazioni fisse, questo modello aggiornato supporta , consentendo agli utenti di dividere, fondere e trasferire valore in modo flessibile e anonimo. split merge privacy-preserving transaction layer arbitrary amounts Al suo interno, il sistema si basa su di , e Inserendo l'importo direttamente nell'impegno, gli utenti possono dimostrare la correttezza delle operazioni di conservazione del valore come la scissione e la fusione, senza mai rivelare gli importi effettivi o i partecipanti coinvolti. zero-knowledge proofs commitments nullifiers Il risultato è una sorta di che funziona interamente Gli utenti possono immagazzinare fondi in privato, inviare risorse gli uni agli altri utilizzando messaggi crittografati e ritirarsi solo quando hanno bisogno di interagire con il livello pubblico di Ethereum. Con il , creando un potente framework per il trasferimento di valore anonimo e programmabile. embedded blockchain on-chain privacy features of zCash smart contract capabilities of Ethereum La cosa migliore è che questo modello è compatibile con , rendendolo una base pratica e scalabile per le applicazioni che preservano la privacy nell'ecosistema più ampio di Ethereum. any EVM-based blockchain