Creazione di grafi delle transazioni · Lezione 5 di 6
Mixer, CoinJoin e offuscamento nei grafi
9 min di lettura
I mixer e le transazioni CoinJoin sono progettati per spezzare proprio i collegamenti da cui dipende il tracciamento. Gli analisti li incontrano continuamente: nei casi di furto e ransomware, ma anche nei wallet di persone comuni che tengono alla privacy finanziaria. Occorre riconoscere ogni struttura in un grafo, sapere che cosa nasconde davvero, applicare con cautela i punti deboli noti e riferire i risultati senza esagerare ciò che mostra la blockchain.
Come l'offuscamento modifica un grafo
Tutte le tecniche di mixing mirano a sostituire un arco deterministico (questo output è stato speso da quella transazione) con un insieme di candidati altrettanto plausibili. La dimensione di tale insieme è l'insieme di anonimato: il numero di partecipanti, depositi o output tra cui potrebbe trovarsi una determinata moneta. Esistono tre famiglie:
| Famiglia | Chi detiene i fondi | Aspetto on-chain |
|---|---|---|
| CoinJoin | Gli utenti mantengono le proprie chiavi; firmano insieme una transazione | Molti input, diversi output dello stesso valore |
| Mixer centralizzato (custodial) | Temporaneamente, l'operatore | Depositi in un cluster del servizio; pagamenti in uscita da monete non correlate |
| Mixer con smart contract | Uno smart contract; gli utenti prelevano con una prova crittografica | Depositi di importo fisso in un pool; prelievi verso indirizzi nuovi |
Schemi CoinJoin
Un CoinJoin è una singola transazione Bitcoin creata da più utenti, ciascuno dei quali contribuisce con input e riceve output. Poiché tutti gli output dello stesso valore appaiono uguali, un osservatore non può stabilire quale partecipante possieda ciascuno di essi. Un esempio fittizio sul modello di un pool da 0,05 BTC:
txid 8e21…a0f4 5 input, 5 output
in 0.05031200 bc1q…r8cw (moneta nuova, paga la commissione di mining)
in 0.05000000 bc1q…2ufj (remix di un output di un mixing precedente)
in 0.05000000 bc1q…kq7n (remix)
in 0.05024600 bc1q…9fhe (moneta nuova)
in 0.05000000 bc1q…w3ld (remix)
out 0.05000000 × 5 verso cinque indirizzi bc1q nuovi
fee 0.00055800
La firma è inconfondibile: cinque output uguali, cinque input provenienti da cronologie non correlate e nessun output di resto. In questo caso l'euristica della titolarità comune degli input non funziona, perché gli input appartengono a persone diverse; gli strumenti di clustering devono rilevare i CoinJoin ed escluderli (vedi la lezione L'euristica della titolarità comune degli input).
Le principali strutture differiscono tra loro:
- Whirlpool (Samourai Wallet, anche Sparrow): pool fissi da 0,001, 0,01, 0,05 e 0,5 BTC, in genere con cinque input e cinque output uguali per ogni mixing. Una transazione preparatoria (tx0) suddivide la moneta dell'utente in porzioni delle dimensioni del pool e paga la commissione, perciò il «resto» compare nella tx0, non nel mixing. I remix sono gratuiti, quindi le monete spesso attraversano molti mixing.
- WabiSabi (Wasabi Wallet 2.x, dal 2022): un coordinatore usa credenziali anonime che consentono agli utenti di registrare input e output di importi variabili. Gli output rientrano in un insieme di tagli standard, i round sono ampi e vi sono diversi gruppi di output uguali anziché uno solo.
- JoinMarket: non c'è un coordinatore centrale. I «taker» pagano una commissione ai «maker» per partecipare a un CoinJoin su richiesta. I round sono più piccoli e in genere prevedono un gruppo di output uguali, oltre a output di resto per la maggior parte dei partecipanti.
I coordinatori sono cambiati nel tempo. Dopo l'arresto dei fondatori di Samourai Wallet nell'aprile 2024, il coordinatore Whirlpool è andato offline e la società dietro al coordinatore predefinito di Wasabi ha interrotto il servizio il 1° giugno 2024. Altri coordinatori e fork continuano a operare, quindi occorre indicare la data quando si afferma quali strutture siano attive.
Rilevare i CoinJoin in SQL consiste nel contare gli output uguali:
WITH eq AS ( -- gruppo più numeroso di output uguali per transazione
SELECT transaction_hash, value, COUNT(*) AS n_equal
FROM outputs
WHERE block_number BETWEEN 870000 AND 871000
GROUP BY transaction_hash, value
)
SELECT t.hash, t.input_count, t.output_count, MAX(eq.n_equal) AS max_equal
FROM transactions t
JOIN eq ON eq.transaction_hash = t.hash
WHERE t.block_number BETWEEN 870000 AND 871000
GROUP BY t.hash, t.input_count, t.output_count
HAVING MAX(eq.n_equal) >= 5 AND t.input_count >= 5;
La CTE raggruppa gli output di ogni transazione in base al valore; la query esterna mantiene le transazioni con almeno cinque input e almeno cinque output identici. Sono prevedibili falsi positivi, come i pagamenti di exchange o pool di mining in importi identici (che di solito hanno uno o pochi input, da qui la condizione sugli input), e falsi negativi per i round WabiSabi, i cui gruppi di output uguali possono essere piccoli. I rilevatori usati in produzione aggiungono regole per le strutture note, come la configurazione cinque per cinque tipica di Whirlpool.
Mixer centralizzati
Un mixer centralizzato è un servizio custodial: l'utente deposita monete e, dopo un ritardo, l'operatore paga lo stesso importo al netto di una commissione, attingendo a una riserva composta dalle monete di altre persone; spesso il pagamento è suddiviso tra più indirizzi e distribuito nel tempo. On-chain, il deposito confluisce nel cluster del mixer e i pagamenti in uscita provengono da monete non correlate: la traccia termina esattamente come accade presso un exchange (vedi la lezione Seguire il flusso di valore attraverso exchange e servizi). Il collegamento è detenuto dall'operatore, non dalla blockchain: ecco perché i sequestri sono importanti. ChipMixer, che secondo le stime delle autorità europee avrebbe riciclato circa 152.000 BTC dal 2017, è stato smantellato il 15 marzo 2023 e i suoi server e registri sono stati sequestrati. Qualsiasi servizio custodial che consenta depositi e prelievi può essere usato allo stesso modo; nel caso Bitfinex del 2016, gli analisti hanno riferito che un mercato darknet era stato usato come mixer improvvisato.
Mixer con smart contract
Tornado Cash, lanciato su Ethereum nel 2019, è il mixer con smart contract più noto. Ogni pool accetta un importo fisso; i pool ETH accettano 0,1, 1, 10 o 100 ETH. Chi deposita invia tale importo con un commitment, un hash di due segreti (un nullifier e un valore casuale), che lo smart contract aggiunge a un albero di Merkle e registra in un evento Deposit. In seguito, l'utente preleva verso qualsiasi indirizzo presentando una prova a conoscenza zero (uno zk-SNARK) che dimostra di conoscere i segreti associati a un commitment presente nell'albero, insieme a un hash del nullifier che impedisce di prelevare due volte lo stesso deposito. Un indirizzo di prelievo nuovo non dispone di ETH per pagare il gas, quindi un relayer può inviare il prelievo e trattenere una commissione; l'evento Withdrawal registra il destinatario, l'hash del nullifier, il relayer e la commissione.
La prova non rivela quale deposito venga prelevato, quindi, all'interno di un pool, ogni deposito precedente non ancora speso è un candidato. Quando, nell'agosto 2022, il Tesoro degli Stati Uniti ha sanzionato il protocollo, ha dichiarato che era stato utilizzato per riciclare oltre 7 miliardi di dollari dal 2019, compresi oltre 455 milioni di dollari rubati dal Lazarus Group. Le sanzioni sono state revocate nel marzo 2025 in seguito a una sentenza; gli smart contract non hanno mai smesso di funzionare.
Che cosa si può e non si può dedurre
La blockchain mostra sempre chi ha depositato, quanto e quando; chi ha prelevato, quanto e quando; e che è avvenuto un mixing. Ciò che nasconde è il collegamento tra i due, a meno che gli utenti non lo rivelino. Ecco le fughe di informazioni note:
- Riutilizzo degli indirizzi: lo stesso indirizzo deposita e preleva.
- Finanziamento del gas: l'indirizzo del depositante paga il gas per un prelievo verso un altro indirizzo, oppure finanzia direttamente l'indirizzo di prelievo.
- Coppie collegate: depositante e destinatario del prelievo hanno effettuato transazioni tra loro prima o dopo.
- Impronte degli importi: un totale insolito, come 13,7 ETH depositati come 10 + 1 + 1 + 1 + 0,1 × 7 e prelevati nella stessa combinazione poco dopo.
- Tempistiche: un prelievo effettuato pochi minuti dopo un deposito in un pool poco frequentato, quando sono pochi gli altri depositi candidati.
- Specifiche dei CoinJoin: il resto non miscelato che torna nel wallet dell'utente («resto tossico») e il consolidamento successivo al mixing, quando diversi output miscelati vengono spesi insieme, ricollegandoli.
Uno studio su Tornado Cash e su un mixer simile operante su un'altra blockchain (Wang e colleghi, «Su come i mixer blockchain a prove a conoscenza zero migliorano e peggiorano la privacy degli utenti», ACM Web Conference 2023) ha applicato cinque di queste euristiche e ha rilevato che riducevano in media di circa il 27% gli insiemi di anonimato dichiarati per i pool Ethereum. Ciò dimostra che le fughe di informazioni sono comuni; dimostra anche che, per gli utenti attenti, sopravvive la maggior parte dell'insieme di anonimato.
Chain hopping e wallet per la privacy
Il mixing spesso si combina con il chain hopping, cioè lo scambio in un altro asset, in particolare una moneta per la privacy come Monero, che nasconde per impostazione predefinita importi e controparti (vedi la lezione Altre strutture di blockchain che gli analisti incontrano). La traccia visibile termina quindi con lo scambio e può riapparire quando i fondi vengono riconvertiti. I wallet per la privacy aggiungono il controllo delle monete, la privacy di rete (per esempio, connettendosi tramite Tor) e CoinJoin integrati, così i loro utenti lasciano meno tracce di quelle indicate sopra.
Nel riferire i risultati, specifica il pool o il servizio, gli importi e gli orari di entrata e uscita, la dimensione dell'insieme dei candidati e quale eventuale fuga di informazioni supporta un collegamento. «L'indirizzo B ha prelevato 100 ETH tre blocchi dopo il deposito di A e A ha pagato il gas di B» è un risultato. «I fondi di B sono contaminati perché provengono da Tornado Cash» applica la contaminazione per avvelenamento a ogni utente di un pool, la maggior parte dei quali non ha alcun legame con il caso in esame.
Focus sull'esame: l'insieme di anonimato e le tre famiglie di mixing (CoinJoin, mixer centralizzato, mixer con smart contract); riconoscere un CoinJoin dagli output uguali e capire perché l'euristica degli input comuni non funziona in questo caso; le differenze strutturali tra Whirlpool, WabiSabi e JoinMarket; il funzionamento di un mixer con smart contract (pool fissi, commitment, prova zk-SNARK, hash del nullifier, relayer); perché i mixer custodial interrompono la traccia come gli exchange; le fughe di informazioni che possono collegare depositi e prelievi (riutilizzo degli indirizzi, finanziamento del gas, coppie collegate, importi e tempistiche, resto tossico, consolidamento); il chain hopping verso monete per la privacy; riferire gli insiemi di candidati invece di applicare la contaminazione per avvelenamento agli utenti dei mixer.
Domande di esercitazione
Verifica la tua comprensione. Queste domande non contano per l’esame.
Accedi per salvare i tuoi progressi e riprendere da dove hai lasciato. È gratuito. Accedi