Construção de grafos de transações · Aula 2 de 6
Rastreando fundos para a frente e para trás
9 min de leitura
Rastrear é a habilidade central de um analista de blockchain: acompanhar o valor de um ponto conhecido até onde ele foi parar, ou voltar até sua origem. A parte difícil não é seguir as arestas, algo que qualquer explorador consegue fazer, mas decidir quanto do valor em cada aresta é “o que você está investigando” depois que ele se mistura com outros fundos. Regras diferentes de alocação dão respostas muito diferentes a partir dos mesmos dados, então você precisa conhecê-las, escolher uma de forma deliberada e dizer qual delas usou.
Rastreamento para a frente e para trás
O rastreamento para a frente começa em uma origem conhecida, como um endereço de roubo, um pagamento de resgate ou uma carteira sancionada, e segue as arestas de saída para descobrir para onde os fundos foram: quais serviços os receberam, quais endereços ainda os mantêm e se algum chegou a um ponto em que pode ser congelado ou explicado.
O rastreamento para trás começa em um destino, normalmente um depósito recebido por uma exchange, e segue as arestas de entrada para responder à pergunta “de onde veio esse dinheiro?”. As equipes de risco de exchanges fazem isso em verificações de origem dos fundos: um depósito que chega a um salto de um mercado da darknet apresenta um risco diferente de outro que chega a dez saltos, passando por uma grande exchange.
As duas direções medem a distância em saltos, o número de transferências entre dois pontos. Exposição direta significa que a contraparte está a um salto de distância; exposição indireta significa que a ligação passa por endereços intermediários. A contagem de saltos só faz sentido em um grafo que você definiu cuidadosamente (consulte a aula Grafos de transações: nós, arestas e direção): um salto em um grafo de entidades pode corresponder a dez em um grafo de endereços.
Contaminação e regras de parada
A contaminação é a parcela de um saldo ou de uma transferência que o analista atribui à origem de interesse. A contaminação não é uma propriedade das moedas; ela é o resultado de uma regra que você aplica. Todo rastreamento também precisa de regras de parada, definidas com antecedência:
- Serviço alcançado: os fundos entram em uma exchange, processadora de pagamentos ou outro serviço custodial, onde o rastreamento on-chain termina (consulte a aula Acompanhando o valor por exchanges e serviços).
- Limite de diluição: a parcela contaminada cai abaixo de um nível definido, por exemplo, 1%.
- Limite de saltos: uma distância máxima, por exemplo, de 3 a 6 saltos, além da qual as ligações são fracas demais para serem relatadas.
- Limite de valor: valores pequenos demais para serem relevantes, como quantias residuais abaixo de uma fração fixa da soma original.
- Janela temporal: transferências ocorridas antes da chegada dos fundos não podem carregá-los.
É fácil esquecer essa última regra em SQL. Um endereço que recebeu fundos roubados em 10 de março e pagou alguém em 2 de março não fez esse pagamento com fundos roubados.
Quatro métodos de alocação
Quando valor contaminado e limpo se encontram em um endereço ou em uma transação, uma regra determina quais valores de saída carregam a contaminação.
| Método | Regra | Premissa | Efeito |
|---|---|---|---|
| FIFO (primeiro a entrar, primeiro a sair) | As saídas são retiradas primeiro das entradas mais antigas | Os fundos se comportam como uma fila | A contaminação permanece concentrada em saídas específicas |
| LIFO (último a entrar, primeiro a sair) | As saídas são retiradas primeiro das entradas mais recentes | Os fundos se comportam como uma pilha | A contaminação avança rapidamente se os fundos forem gastos logo após a chegada |
| Haircut (pro rata) | Cada saída carrega a parcela contaminada do saldo naquele momento | Os fundos se misturam perfeitamente | A contaminação se espalha, diluída, por todas as saídas posteriores |
| Poison | Qualquer saída de um saldo que contenha alguma contaminação é considerada totalmente contaminada | Qualquer contato contamina | A contaminação se expande e cobre muito mais do que o valor original |
Poison e haircut foram nomeados em um estudo acadêmico inicial sobre pontuação de risco para Bitcoin (Möser, Böhme e Breuker, “Towards Risk Scoring of Bitcoin Transactions”, 2014). FIFO adota uma convenção contábil antiga para contas bancárias com fundos misturados; Anderson, Shumailov, Ahmed e Rietmann, da Universidade de Cambridge, argumentaram em “Bitcoin Redux” (2018) que ela é adequada para Bitcoin porque é determinística e não dilui: aplicada dentro de uma transação, ordena o valor pela posição de entradas e saídas, de modo que a contaminação recai sobre satoshis específicos de saídas específicas. LIFO é a ordenação inversa, oferecida por algumas ferramentas de rastreamento como alternativa. Nenhum dos quatro métodos é “correto”; cada um é um modelo.
Um exemplo resolvido
Um endereço A recebe e gasta fundos nesta ordem. S são 2 BTC provenientes de um roubo; C1 e C2 são fundos limpos e não relacionados.
| Etapa | Evento | Saldo após o evento |
|---|---|---|
| 1 | +4 BTC de C1 (limpos) | 4 |
| 2 | +2 BTC do roubo S | 6 |
| 3 | −3 BTC para X | 3 |
| 4 | +4 BTC de C2 (limpos) | 7 |
| 5 | −5 BTC para Y | 2 |
| 6 | −2 BTC para Z | 0 |
FIFO. Após a etapa 2, a fila é [4 limpos, 2 roubados]. X recebe 3 do lote mais antigo: 3 limpos. A fila agora é [1 limpo, 2 roubados]; em seguida, C2 acrescenta [4 limpos]. Y recebe 1 limpo, 2 roubados e 2 limpos. Z recebe os últimos 2 limpos. Resultado: X 0, Y 2, Z 0 BTC contaminados.
LIFO. Após a etapa 2, a pilha é [4 limpos, 2 roubados], com o lote roubado no topo. X recebe os 2 roubados mais 1 limpo. Em seguida, C2 acrescenta 4 limpos no topo. Y recebe esses 4 mais 1 limpo. Z recebe os últimos 2 limpos. Resultado: X 2, Y 0, Z 0.
Haircut. Após a etapa 2, o saldo é de 6 BTC, dos quais 2 estão contaminados (33,33%). X recebe 3 × 2/6 = 1,000 contaminado. Os 3 BTC restantes contêm 1 contaminado; após C2, o saldo é de 7, com 1 contaminado (14,29%). Y recebe 5 × 1/7 = 0,714 contaminado, restando 2 BTC com 0,286 contaminado, que vão todos para Z. Resultado: X 1,000, Y 0,714, Z 0,286.
Poison. Todas as saídas após a etapa 2 vêm de um saldo que contém contaminação. Resultado: X 3, Y 5, Z 2, então 10 BTC são classificados como contaminados, embora apenas 2 BTC tenham sido roubados.
| Destinatário | FIFO | LIFO | Haircut | Poison |
|---|---|---|---|---|
| X (3 BTC) | 0 | 2 | 1,000 | 3 |
| Y (5 BTC) | 2 | 0 | 0,714 | 5 |
| Z (2 BTC) | 0 | 0 | 0,286 | 2 |
| Total contaminado | 2 | 2 | 2,000 | 10 |
FIFO, LIFO e haircut conservam o valor: a quantidade total contaminada permanece em 2 BTC. Poison não. Os métodos também divergem sobre quem recebeu os fundos roubados: FIFO aponta para Y, LIFO para X, e haircut diz que todos receberam um pouco. Se X for uma exchange onde os fundos podem ser congelados e Y for uma carteira privada, a escolha muda o resultado do caso.
O que os métodos fazem em grande escala
Quando o haircut é repetido ao longo de muitos saltos, a contaminação se espalha cada vez mais, mas fica mais diluída, a cada mistura. No mesmo estudo “Bitcoin Redux”, Anderson e colegas rastrearam os 46.653 BTC roubados no roubo da Linode em 2012: o haircut contaminou cerca de 93% dos endereços do conjunto de dados, enquanto o FIFO contaminou cerca de 1,3%. Poison se espalha ainda mais rápido, o que o torna útil apenas para perguntas específicas, como “este endereço teve algum contato com um mixer?”, e enganoso como medida de quantidade.
Orientações práticas:
- Use haircut para pontuações de risco e percentuais de exposição, quando uma resposta proporcional é a mais honesta.
- Use FIFO (ou LIFO) quando precisar identificar saídas específicas que carregam fundos, por exemplo, para solicitar um congelamento, e deixe claro que a atribuição segue a regra, não as moedas.
- Use poison para indicadores binários de contato, nunca para quantidades.
- Execute o rastreamento com dois métodos quando o resultado for importante. Se ambos apontarem para o mesmo serviço, a confiança aumenta; se divergirem, informe o intervalo.
Expandindo saltos em SQL
Um rastreamento limitado para a frente pode começar como uma consulta recursiva sobre a lista de arestas criada na aula anterior. A maioria dos mecanismos oferece suporte a CTEs recursivas, mas nem todos; em alguns data warehouses, você itera salto a salto usando um notebook.
WITH RECURSIVE hops AS (
SELECT dst AS address, 1 AS hop, block_number
FROM edges
WHERE src = '0xA1b2…9F' -- semente: o endereço do roubo
UNION ALL
SELECT e.dst, h.hop + 1, e.block_number
FROM hops h
JOIN edges e ON e.src = h.address
AND e.block_number >= h.block_number -- o tempo avança
WHERE h.hop < 4 -- limite de saltos
AND h.address NOT IN (SELECT address FROM service_labels) -- parar nos serviços
)
SELECT address, MIN(hop) AS first_hop, COUNT(*) AS paths
FROM hops
GROUP BY address;
A linha semente inclui todos os destinatários do endereço do roubo. A parte recursiva segue as arestas de saída de cada endereço alcançado, apenas por meio de transferências ocorridas no bloco de chegada dos fundos ou depois dele; para após quatro saltos e não expande o rastreamento por serviços identificados. Essa consulta encontra endereços alcançáveis; ela não aloca valores. A alocação da contaminação exige as entradas e saídas ordenadas de cada endereço, algo mais fácil de fazer em um notebook ou em uma ferramenta de grafos. Espere que a contagem de caminhos aumente muito em endereços movimentados, outro motivo para parar nos serviços.
Foco no exame: rastreamento para a frente versus para trás e seus usos típicos; saltos e exposição direta versus indireta; regras de parada, incluindo a regra de que saídas anteriores a uma entrada não podem carregá-la; definições e premissas de FIFO, LIFO, haircut e poison, e como calcular cada método em um exemplo pequeno; que FIFO, LIFO e haircut conservam o valor, enquanto poison o infla; como o haircut dilui a contaminação entre muitos endereços em grande escala; qual método é adequado para pontuação de risco, solicitações de congelamento e indicadores de contato; informar o método utilizado e executar um segundo como verificação.