Mixer, CoinJoin e criptovalute orientate alla privacy · Lezione 3 di 5
Mixer basati su smart contract
9 min di lettura
Un mixer basato su smart contract lascia una traccia pubblica più completa di qualsiasi servizio di custodia: ogni deposito e ogni prelievo è un evento che chiunque può decodificare. Ciò che elimina è l’unico fatto che interessa agli investigatori, il collegamento tra i due, e lo elimina con la crittografia anziché con un database che può essere sequestrato. Questa lezione illustra cosa dimostrano i registri del contratto, come funzionano le euristiche di collegamento pubblicate e fino a che punto ci si può fidare, e dove si trovano le prove che permettono di stabilire davvero un collegamento: note, relayer e interfacce front-end.
Tornado Cash in termini probatori
Tornado Cash è il modello di riferimento. Ogni pool è un contratto che accetta un importo fisso; i pool ETH accettano 0,1, 1, 10 o 100 ETH e sono disponibili anche pool di token per asset come DAI, USDC, USDT e WBTC. I contratti dei pool non possono essere messi in pausa né aggiornati. Il funzionamento è descritto nella lezione IDFE-BA Mixer, CoinJoin e offuscamento nei grafi; qui vediamo cosa dimostra ciascun registro.
| Registro | Campi chiave | Cosa dimostra | Cosa non dimostra |
|---|---|---|---|
Chiamata deposit(bytes32 _commitment) ed evento Deposit | commitment, leafIndex, timestamp, mittente nella transazione | Questo indirizzo ha versato l’importo nel pool e registrato questo commitment | Chi lo ha successivamente prelevato |
Chiamata withdraw(...) | prova, radice di Merkle, nullifierHash, destinatario, relayer, commissione, rimborso | È stata presentata una prova valida per un deposito non speso qualsiasi nell’albero | Quale deposito |
Evento Withdrawal | to, nullifierHash, relayer, fee | Questo destinatario ha ricevuto l’importo al netto della commissione; questo relayer, se presente, è stato pagato | Chi lo ha richiesto |
Il software del depositante genera due segreti, un nullifier e un valore casuale. Il commitment è un hash di entrambi; l’hash del nullifier è un hash del solo nullifier. L’utente conserva entrambi i segreti in una nota, una stringa come tornado-eth-0.1-1-0x… che codifica la valuta, l’importo, l’ID della chain e i segreti. Il contratto registra ogni hash del nullifier e rifiuta un secondo prelievo con lo stesso valore. Chiunque possieda la nota può prelevare; in pratica, la nota è una chiave al portatore.
L’insieme di anonimato e come riportarlo
Per un dato prelievo, i candidati sono i depositi effettuati nello stesso pool prima del prelievo. Due numeri descrivono onestamente tale insieme, ed entrambi sono ricavabili dalle tabelle degli eventi decodificati:
-- Insieme di anonimato per un prelievo dal pool da 10 ETH al blocco 15.200.000
SELECT
(SELECT COUNT(*) FROM tc_deposits
WHERE pool = 'ETH-10' AND block_number < 15200000) AS prior_deposits,
(SELECT COUNT(*) FROM tc_withdrawals
WHERE pool = 'ETH-10' AND block_number < 15200000) AS prior_withdrawals;
La prima sottoquery conta tutti i depositi precedenti al blocco del prelievo: ciascuno è un candidato, perché il contratto non rivela quali depositi siano stati spesi. La seconda conta i prelievi precedenti. La differenza indica il numero di depositi ancora non spesi in quel momento, ovvero la dimensione operativa del pool. Riporta entrambi i valori, insieme al pool, al blocco e alla fonte dei dati. I nomi delle tabelle qui sono a titolo illustrativo; costruiscile a partire dai log del contratto del pool filtrati per firma dell’evento (vedi la lezione IDFE-BA Interrogare log e trace EVM).
Euristiche di collegamento nella ricerca pubblicata
I ricercatori hanno misurato quanto spesso gli utenti rivelino da soli il collegamento. Le euristiche citate più spesso sono:
| Euristica | Logica | Punti di forza e riserve |
|---|---|---|
| Corrispondenza dell’indirizzo | Lo stesso indirizzo deposita e preleva | Quasi deterministica per il controllo; verifica comunque la presenza di indirizzi condivisi o di custodia |
| Indirizzi collegati | Gli indirizzi del depositante e del destinatario hanno effettuato transazioni tra loro al di fuori del mixer (Tutela ne ha usate almeno tre) | Forte quando le interazioni sono dirette e ripetute |
| Finanziamento del gas | Il depositante, o un indirizzo da esso finanziato, paga il gas per l’indirizzo di prelievo | Schema forte; i fornitori di gas e i finanziatori condivisi creano falsi collegamenti |
| Più denominazioni | Un insieme insolito di depositi nei vari pool (per esempio, 3 × 10 ETH e 1 × 1 ETH) corrisponde allo stesso insieme di prelievi nell’arco di circa un giorno | Probabilistica; si indebolisce con l’aumentare dell’attività del pool |
| Prezzo del gas univoco | Il deposito e il prelievo hanno usato lo stesso prezzo del gas insolito impostato dall’utente | Solo prima della modifica del mercato delle commissioni dell’agosto 2021 (EIP-1559) e solo per prelievi non inoltrati tramite relayer |
| Tempistica | Un prelievo effettuato poco dopo un deposito in un pool poco attivo | Debole da sola; utile per restringere gli insiemi |
| Richieste di ricompensa | Le richieste nell’ambito del programma di ricompense per il mining di anonimato (da dicembre 2020 a dicembre 2021) rivelavano per quanto tempo un deposito era rimasto nel pool | Limitata; riguarda solo gli utenti che hanno presentato richieste |
Due studi indicano l’ordine di grandezza. Tutela (Wu e colleghi, 2022) ha segnalato circa 42.800 depositi su 97.300, all’incirca il 44%, come potenzialmente compromessi da almeno un’euristica; le principali erano indirizzi collegati (18.900), corrispondenza dell’indirizzo (18.600) e più denominazioni (16.200). Lo studio ha stimato una riduzione media del 37% (±15%) degli insiemi di anonimato. Wang e colleghi (ACM Web Conference 2023) hanno riportato riduzioni medie del 27,34% per i pool di mixer Ethereum più popolari e del 46,02% per un mixer comparabile su un’altra chain. Béres e colleghi (2021) hanno usato identificativi di servizi di denominazione come riferimento parziale per profilare gli utenti in base alle abitudini relative al prezzo del gas e all’attività nelle diverse ore del giorno.
Il punto fondamentale per le prove è che gli autori di Tutela dichiarano che le loro euristiche produrranno falsi positivi e non riportano alcuna convalida rispetto a dati di riferimento per le euristiche applicate a Tornado Cash. I dati pubblicati mostrano che le fughe di informazioni sono comuni, ma non forniscono un tasso di errore per un collegamento nel caso specifico. Assegna a un singolo collegamento basato su un’euristica un grado C o D, a seconda della sua logica, e cerca conferme in una categoria di prove diversa.
Esempio svolto. L’indirizzo 0xA1b2…9F deposita 3 × 10 ETH e 1 × 1 ETH nell’arco di un’ora. Diciannove ore dopo, il nuovo indirizzo 0x5cE0…71 riceve tre prelievi dal pool da 10 ETH e uno dal pool da 1 ETH tramite un relayer, ciascuno al netto della commissione del relayer; la sua prima transazione in uscita paga un indirizzo di deposito di un exchange. L’esaminatore conta quanti altri indirizzi abbiano depositato la stessa combinazione nelle 48 ore precedenti (nessuno) e quanti insiemi di prelievi di quella forma si siano verificati (uno). La corrispondenza basata su più denominazioni viene registrata con grado D e i relativi conteggi; si richiedono i registri dell’exchange per l’indirizzo di deposito. Se mostrano lo stesso cliente che ha finanziato 0xA1b2…9F, il collegamento passa al grado B.
Note: le prove che permettono di stabilire un collegamento
Una nota trovata nell’ambito di un’attività autorizzata fa ciò che nessuna euristica può fare. A partire dai segreti della nota, l’esaminatore ricalcola il commitment, che identifica l’evento Deposit, e l’hash del nullifier, che identifica l’evento Withdrawal, se presente. Si ottiene così un collegamento deterministico e ripetibile in modo indipendente dal depositante al destinatario. Se nessun prelievo riporta quell’hash del nullifier, il deposito è ancora nel pool e la nota ne consente ancora il controllo; metterla al sicuro diventa allora una questione di recupero dell’asset (vedi le lezioni Opzioni di congelamento e sequestro e Mettere al sicuro le cripto-attività sequestrate).
Dove trovare le note:
- file di testo, compresi i file di backup creati dal client a riga di comando quando genera una nota;
- gestori di password, app per le note, schermate, messaggi in chat inviati a sé stessi e supporti cartacei;
- backup cifrati che l’interfaccia può archiviare on-chain tramite un «account note», leggibili con la chiave dell’account;
- report generati dallo strumento di conformità dell’interfaccia, che creava un documento a partire da una nota ed elencava il relativo deposito e prelievo.
Tratta una nota come faresti con una chiave privata (vedi le lezioni Wallet sui dispositivi sequestrati e Hashing, registrazione e catena di custodia). Non incollarla mai in un’interfaccia ospitata o in un sito di terzi: chiunque la veda può prelevare i fondi non spesi. Ricalcola usando codice open source su una macchina isolata dell’esaminatore, registra la versione e l’hash del software e fai ripetere il calcolo a un secondo esaminatore.
Relayer e interfacce front-end
L’evento Withdrawal indica il relayer e la relativa commissione, quindi l’indirizzo del relayer è un dato deterministico. I relayer sono operatori indipendenti; quelli registrati depositano token di governance in uno smart contract di registro on-chain letto dall’interfaccia, ma i pool pagano qualunque relayer indicato nel prelievo. Un relayer riceve la richiesta di prelievo tramite la rete e può conservare registri degli orari delle richieste e degli indirizzi di rete, se ne tiene. Consideralo un possibile detentore di registri, identifica il suo operatore consultando i registri e i dati di denominazione e tieni presente che molti operano tramite reti di anonimizzazione o non conservano nulla.
Il front-end è codice separato, distribuito tramite archiviazione decentralizzata e gateway, e può cambiare. All’inizio del 2024 una proposta di governance malevola ha inserito codice nell’interfaccia distribuita tramite gateway IPFS, che inviava le note degli utenti a un server esterno dal 1 gennaio 2024 fino a quando non è stato individuato. Ne derivano due lezioni: registra quale versione dell’interfaccia e quale gateway ha usato il soggetto (cronologia del browser, registri di connessione dell’estensione del wallet) e ricorda che la nota potrebbe essere anche nelle mani di qualcun altro.
Un’autorità ha sanzionato i contratti di Tornado Cash nell’agosto 2022 e ha revocato la designazione nel marzo 2025; i contratti hanno continuato a funzionare per tutto il periodo (vedi la lezione IDFE-CC Screening di wallet e transazioni).
Focus sull'esame: cosa dimostrano e non dimostrano gli eventiDepositeWithdrawale i parametri diwithdraw; commitment, hash del nullifier e nota come chiave al portatore; come riportare i depositi precedenti e i depositi non spesi come insieme di anonimato; euristiche di corrispondenza dell’indirizzo, indirizzi collegati, finanziamento del gas, più denominazioni, prezzo del gas univoco, tempistica e richieste di ricompensa, con le relative riserve; Tutela (circa il 44% dei depositi segnalati, riduzione media del 37%) e Wang et al. (27,34%), e l’assenza di tassi di errore convalidati; la nota rinvenuta come collegamento deterministico, i luoghi in cui trovare le note e come gestirle in sicurezza; prove relative a relayer e interfacce front-end.