Construção de grafos de transações · Aula 5 de 6
Mixers, CoinJoin e ofuscação em grafos
9 min de leitura
Mixers e transações CoinJoin são projetados para romper exatamente os vínculos dos quais o rastreamento depende. Analistas se deparam constantemente com eles: em casos de roubo e ransomware, mas também nas carteiras de pessoas comuns que valorizam a privacidade financeira. Você precisa reconhecer cada projeto em um grafo, saber o que ele realmente oculta, aplicar cuidadosamente as fragilidades conhecidas e relatar o resultado sem exagerar o que a blockchain revela.
O que a ofuscação faz com um grafo
Todas as técnicas de mistura buscam substituir uma aresta determinística (esta saída foi gasta por aquela transação) por um conjunto de candidatas igualmente plausíveis. O tamanho desse conjunto é o conjunto de anonimato: o número de participantes, depósitos ou saídas entre os quais uma determinada moeda poderia estar. Há três famílias:
| Família | Quem detém os fundos | Aparência na blockchain |
|---|---|---|
| CoinJoin | Os usuários mantêm suas chaves; eles assinam conjuntamente uma transação | Muitas entradas, várias saídas de valor idêntico |
| Mixer centralizado (custodial) | O operador, temporariamente | Depósitos em um cluster de serviço; pagamentos com moedas não relacionadas |
| Mixer de contrato inteligente | Um contrato; os usuários sacam com uma prova criptográfica | Depósitos de valor fixo em um pool; saques para endereços novos |
Padrões de CoinJoin
Um CoinJoin é uma única transação de Bitcoin criada por vários usuários, cada um contribuindo com entradas e recebendo saídas. Como todas as saídas de mesmo valor parecem iguais, um observador não consegue saber qual participante é dono de cada uma. Um exemplo fictício no estilo de um pool de 0,05 BTC:
txid 8e21…a0f4 5 inputs, 5 outputs
in 0.05031200 bc1q…r8cw (new coin, pays the mining fee)
in 0.05000000 bc1q…2ufj (remix of an earlier mix output)
in 0.05000000 bc1q…kq7n (remix)
in 0.05024600 bc1q…9fhe (new coin)
in 0.05000000 bc1q…w3ld (remix)
out 0.05000000 × 5 to five fresh bc1q addresses
fee 0.00055800
A assinatura é inconfundível: cinco saídas iguais, cinco entradas de históricos não relacionados e nenhuma saída de troco. A heurística de propriedade comum das entradas falha aqui, porque as entradas pertencem a pessoas diferentes; as ferramentas de clusterização precisam detectar CoinJoins e excluí-los (veja a aula A heurística de propriedade comum das entradas).
Os principais projetos diferem em sua estrutura:
- Whirlpool (Samourai Wallet, também Sparrow): pools fixos de 0,001, 0,01, 0,05 e 0,5 BTC, normalmente com cinco entradas e cinco saídas iguais por mistura. Uma transação preparatória (tx0) divide a moeda do usuário em partes do tamanho do pool e paga a taxa; assim, o "troco" restante aparece na tx0, não na mistura. As remixagens são gratuitas, então as moedas muitas vezes passam por várias misturas.
- WabiSabi (Wasabi Wallet 2.x, a partir de 2022): um coordenador usa credenciais anônimas para que os usuários possam registrar entradas e saídas de valores variados. As saídas se enquadram em um conjunto de denominações padrão, as rodadas são grandes e há vários grupos de saídas iguais, em vez de apenas um.
- JoinMarket: não há coordenador central. Os "takers" pagam uma taxa aos "makers" para participar de um CoinJoin sob demanda. As rodadas são menores, normalmente com um grupo de saídas iguais e saídas de troco para a maioria dos participantes.
Os coordenadores mudaram ao longo do tempo. Após a prisão dos fundadores da Samourai Wallet em abril de 2024, o coordenador Whirlpool ficou offline, e a empresa responsável pelo coordenador padrão da Wasabi encerrou o serviço em 1.º de junho de 2024. Outros coordenadores e forks continuam em operação; portanto, indique a data de qualquer afirmação sobre quais projetos estão ativos.
Detectar CoinJoins em SQL é uma questão de contar saídas iguais:
WITH eq AS ( -- maior grupo de saídas iguais por tx
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;
A CTE agrupa as saídas de cada transação por valor; a consulta externa mantém as transações com pelo menos cinco entradas e pelo menos cinco saídas idênticas. Espere falsos positivos, como pagamentos de exchanges ou pools de mineração em valores idênticos (que geralmente têm uma ou poucas entradas, daí a condição das entradas), e falsos negativos em rodadas WabiSabi, cujos grupos de saídas iguais podem ser pequenos. Detectores de produção acrescentam regras para estruturas conhecidas, como o formato cinco por cinco típico do Whirlpool.
Mixers centralizados
Um mixer centralizado é um serviço custodial: o usuário deposita moedas e, após um intervalo, o operador paga o mesmo valor, menos uma taxa, usando uma reserva de moedas de outras pessoas, muitas vezes dividida entre vários endereços e horários. Na blockchain, o depósito entra no cluster do mixer e os pagamentos vêm de moedas não relacionadas; assim, o rastro termina exatamente como terminaria em uma exchange (veja a aula Rastreando valor por meio de exchanges e serviços). O vínculo fica com o operador, não com a blockchain, e é por isso que operações de desmantelamento são importantes: autoridades europeias estimam que o ChipMixer, que foi desmantelado em 15 de março de 2023, lavou cerca de 152.000 BTC desde 2017, e seus servidores e registros foram apreendidos. Qualquer serviço custodial com funções de depósito e saque pode ser usado indevidamente da mesma forma; no caso da Bitfinex de 2016, analistas relataram que um mercado da darknet serviu como mixer improvisado.
Mixers de contrato inteligente
O Tornado Cash, lançado na Ethereum em 2019, é o mixer de contrato inteligente mais conhecido. Cada pool aceita um valor fixo; os pools de ETH aceitam 0,1, 1, 10 ou 100 ETH. O depositante envia esse valor com um compromisso criptográfico, um hash de dois segredos (um nullifier e um valor aleatório), que o contrato adiciona a uma árvore de Merkle e registra em um evento Deposit. Mais tarde, o usuário saca para qualquer endereço enviando uma prova de conhecimento zero (um zk-SNARK) de que conhece os segredos por trás de algum compromisso na árvore, além de um hash do nullifier, que impede que o mesmo depósito seja sacado duas vezes. Um endereço novo para saque não tem ETH para pagar o gás, então um relayer pode enviar o saque e cobrar uma taxa dele; o evento Withdrawal registra o destinatário, o hash do nullifier, o relayer e a taxa.
A prova não revela qual depósito está sendo sacado; portanto, dentro de um pool, todo depósito anterior ainda não sacado é uma possibilidade. Ao sancionar o protocolo em agosto de 2022, o Tesouro dos EUA afirmou que ele havia sido usado para lavar mais de US$ 7 bilhões desde 2019, incluindo mais de US$ 455 milhões roubados pelo Grupo Lazarus. As sanções foram suspensas em março de 2025 após uma decisão judicial; os contratos nunca pararam de funcionar.
O que pode e o que não pode ser inferido
O que a blockchain sempre mostra: quem depositou, quanto e quando; quem sacou, quanto e quando; e que houve mistura. O que ela oculta é o vínculo entre eles, a menos que os usuários o revelem. Vazamentos conhecidos:
- Reutilização de endereço: o mesmo endereço deposita e saca.
- Financiamento de gás: o endereço do depositante paga o gás de um saque para um endereço diferente ou financia diretamente o endereço de saque.
- Pares vinculados: o depositante e quem sacou já fizeram transações entre si antes ou depois.
- Impressões digitais de valores: um total incomum, como 13,7 ETH depositados como 10 + 1 + 1 + 1 + 0,1 × 7 e sacados na mesma combinação pouco depois.
- Tempo: um saque minutos após um depósito em um pool pouco movimentado, quando há poucos outros depósitos candidatos.
- Específicos de CoinJoin: troco não misturado que volta para a carteira do usuário ("troco tóxico") e consolidação pós-mistura, quando várias saídas misturadas são gastas juntas, restabelecendo o vínculo entre elas.
Um estudo do Tornado Cash e de um mixer semelhante em outra blockchain (Wang e colegas, "On How Zero-Knowledge Proof Blockchain Mixers Improve, and Worsen User Privacy", ACM Web Conference 2023) aplicou cinco dessas heurísticas e constatou que elas reduziram em cerca de 27% em média os conjuntos de anonimato informados para os pools de Ethereum. Isso mostra que vazamentos são comuns; também mostra que, para usuários cuidadosos, a maior parte do conjunto de anonimato permanece.
Encadeamento entre blockchains e carteiras de privacidade
A mistura costuma ser combinada com o encadeamento entre blockchains, trocando por outro ativo, especialmente uma moeda de privacidade como Monero, na qual valores e contrapartes ficam ocultos por padrão (veja a aula Outros projetos de blockchain que os analistas encontram). O rastro visível termina então na troca e pode reaparecer quando os fundos são trocados de volta. Carteiras de privacidade acrescentam controle de moedas, privacidade de rede (por exemplo, conexão por meio do Tor) e CoinJoin integrado, de modo que seus usuários deixam menos dos vazamentos acima.
Ao relatar, especifique o pool ou serviço, os valores e horários de entrada e saída, o tamanho do conjunto de candidatos e qual vazamento, se houver, sustenta um vínculo. "O endereço B sacou 100 ETH três blocos após o depósito de A, e A pagou o gás de B" é uma constatação. "Os fundos de B estão contaminados porque vieram do Tornado Cash" aplica contaminação por envenenamento a todos os usuários de um pool, a maioria dos quais não tem vínculo com seu caso.
Foco no exame: o conjunto de anonimato e as três famílias de mistura (CoinJoin, mixer centralizado, mixer de contrato inteligente); reconhecer um CoinJoin pelas saídas iguais e entender por que a heurística de propriedade comum das entradas falha nesse caso; as diferenças estruturais entre Whirlpool, WabiSabi e JoinMarket; como funciona um mixer de contrato inteligente (pools fixos, compromisso criptográfico, prova zk-SNARK, hash do nullifier, relayers); por que mixers custodiais rompem o rastro como as exchanges; os vazamentos que podem vincular depósitos e saques (reutilização de endereço, financiamento de gás, pares vinculados, valores e tempo, troco tóxico, consolidação); encadeamento entre blockchains até moedas de privacidade; relatar conjuntos de candidatos em vez de aplicar contaminação por envenenamento aos usuários de mixers.