Rastreamento e grafos de transações · Aula 1 de 6
Grafos de transações e métricas de grafos
15 min de leitura
Quase toda pergunta de rastreamento, de "para onde foram os fundos roubados?" a "este depósito tem exposição a um serviço sancionado?", é uma pergunta sobre um grafo. A escolha dos nós e das arestas determina, de forma pouco perceptível, quais respostas são possíveis e, depois que o grafo existe, você precisa de maneiras de encontrar o que importa sem ler milhares de arestas manualmente. Esta aula mostra como construir um grafo que você consiga defender, depois apresenta as métricas e as formas recorrentes que os analistas usam para interpretá-lo e explica por que nenhuma delas, isoladamente, constitui prova.
Três grafos a partir dos mesmos dados
Os mesmos dados de blocos podem ser modelados de três maneiras, e os analistas alternam constantemente entre elas.
| Grafo | Nós | Arestas | Mais indicado para |
|---|---|---|---|
| Grafo de transações | Transações (e, em redes UTXO, as saídas que elas criam) | Uma saída criada por uma transação e gasta por outra | Rastreamento UTXO exato, sem perda de informação |
| Grafo de endereços | Endereços | Valor enviado de um endereço para outro | Redes com modelo de contas, visões gerais rápidas |
| Grafo de entidades | Agrupamentos ou serviços rotulados | Fluxos agregados entre entidades | Elaboração de relatórios, exposição, análise de contrapartes |
O grafo de transações é o mais próximo dos dados brutos. No Bitcoin, cada saída permanece não gasta ou é consumida por exatamente uma entrada posterior; assim, as relações de gasto formam um grafo direcionado acíclico preciso: o dinheiro não pode voltar no tempo e nada é inferido. O grafo de endereços transforma cada endereço em um nó. Ele é natural para redes com modelo de contas, nas quais uma transferência realmente vai de uma conta para outra, mas, em redes UTXO, introduz ambiguidade, como mostra o exemplo abaixo. O grafo de entidades substitui endereços por agrupamentos ("Carteiras quentes da exchange X"). A maioria dos relatórios o apresenta, mas cada nó depende de agrupamento e atribuição, que têm suas próprias taxas de erro (Aula 4.1); portanto, mantenha as camadas inferiores expansíveis por trás de cada aresta entre entidades.
Muitas ferramentas visuais de rastreamento desenham um grafo bipartido híbrido com dois tipos de nó, endereços e transações: as arestas vão de um endereço para uma transação (uma entrada) e de uma transação para um endereço (uma saída). Ele mantém a exatidão do grafo de transações e, ao mesmo tempo, mostra quem detém o quê.
Arestas: direção, peso e tempo
Uma aresta útil contém mais do que "A pagou B". No mínimo, armazene:
- Direção: origem e destino. O rastreamento para a frente segue as arestas de saída; o rastreamento para trás segue as de entrada.
- Peso: a quantia em unidades nativas após a conversão decimal, opcionalmente com seu valor em uma moeda de referência naquele momento, citando a fonte do preço.
- Tempo: altura do bloco e timestamp do bloco em UTC. A altura ordena os eventos de forma confiável; os timestamps são aproximados (Aula 2.1).
- Identidade: hash da transação mais o índice da saída (UTXO) ou o índice do log ou a posição no rastro de execução (modelo de contas), para que a aresta seja única e possa ser verificada em um nó da rede.
- Ativo: moeda nativa ou endereço do contrato do token. Nunca some arestas de ativos diferentes.
Dois endereços podem estar ligados por muitas arestas em momentos diferentes (um multigrafo). Agregá-las em uma única aresta de "total enviado" é adequado para um gráfico, mas destrói a ordenação da qual o rastreamento depende: fundos que chegaram depois de um pagamento não podem tê-lo financiado.
De uma transação UTXO para arestas
Considere uma transação Bitcoin decodificada 4f3a…c21e no bloco 871.204, enriquecida com o endereço e o valor de cada saída gasta (as entradas brutas apenas referenciam um outpoint, portanto um indexador ou uma segunda consulta fornece esses campos):
| Lado | Referência | Endereço | Valor (BTC) |
|---|---|---|---|
| Entrada | 9b1e…04aa:1 | bc1q…7k3f | 0,60000000 |
| Entrada | c07d…e912:0 | bc1q…m2pz | 0,50000000 |
| Saída 0 | 4f3a…c21e:0 | bc1q…x9td | 0,80000000 |
| Saída 1 | 4f3a…c21e:1 | bc1q…h4wa | 0,29000000 |
As entradas totalizam 1,10 BTC e as saídas, 1,09 BTC; portanto, a taxa é de 0,01 BTC.
No grafo de transações, isso corresponde a um nó com duas arestas de entrada (os outpoints) e duas arestas de saída (as saídas); nenhuma suposição é necessária. No grafo de endereços, o Bitcoin não informa qual entrada pagou qual saída, porque as entradas são combinadas. Todos os pareamentos resultam em quatro arestas (2 entradas × 2 saídas), e você precisa escolher seus pesos. A escolha comum é a alocação proporcional: a primeira entrada forneceu 0,60 ÷ 1,10 = 54,55% do valor, portanto são atribuídos a ela 54,55% de cada saída, e à segunda, 45,45%.
| Aresta | Cálculo | Peso (BTC) |
|---|---|---|
| bc1q…7k3f → bc1q…x9td | 0,80 × 0,5455 | 0,4364 |
| bc1q…7k3f → bc1q…h4wa | 0,29 × 0,5455 | 0,1582 |
| bc1q…m2pz → bc1q…x9td | 0,80 × 0,4545 | 0,3636 |
| bc1q…m2pz → bc1q…h4wa | 0,29 × 0,4545 | 0,1318 |
Os pesos somam 1,09 BTC; a taxa sai do grafo (alguns analistas acrescentam um nó sumidouro de "taxa" para conservar o valor). Uma transação com 50 entradas e 50 saídas criaria 2.500 arestas desse tipo, razão pela qual consolidações e pagamentos em lote sobrecarregam os grafos de endereços. Determinar se bc1q…h4wa é um pagamento ou troco é uma inferência separada (Aula 4.2), e a ponderação proporcional é apenas uma regra de alocação (Aula 3.3).
Dos dados do modelo de contas para arestas
Em redes do tipo Ethereum, as arestas vêm de três fontes, e um grafo construído a partir de apenas uma delas deixará de captar movimentações de dinheiro:
- Transações de nível superior com
valuediferente de zero: do signatário para o endereçoto. - Transferências internas de moeda nativa feitas por contratos durante a execução, que aparecem apenas nos rastros de execução (quadros
callcom valor). - Transferências de tokens, decodificadas a partir de logs: um evento ERC-20
Transfer(address,address,uint256)tem topic00xddf252ad…b3ef, o remetente e o destinatário nos tópicos 1 e 2, e a quantia bruta no campo de dados.
Exclua transações revertidas (status do recibo = 0) e quadros revertidos dos rastros de execução: eles não movimentaram nada, embora o remetente ainda tenha pago gas. Trate contratos como nós rotulados, porque um roteador de DEX ou um contrato de token é um mecanismo, não uma contraparte. Um swap geralmente produz duas arestas em ativos diferentes, usuário → pool e pool → usuário (Aula 5.2).
A maior parte do trabalho com grafos começa como uma lista de arestas plana em um repositório analítico, construída a partir do esquema genérico da Aula 2.7 e salva como uma tabela edges que as consultas deste módulo e do próximo reutilizam:
-- Lista de arestas (salva como edges): ETH nativo dos rastros mais transferências ERC-20
SELECT block_number, block_timestamp, transaction_hash,
from_address AS src, to_address AS dst,
'ETH' AS asset, value / 1e18 AS amount -- wei para ETH
FROM traces
WHERE value > 0
AND (call_type IS NULL OR call_type = 'call') -- sem delegatecall ou staticcall
AND status = 1 AND tx_status = 1 -- apenas quadros bem-sucedidos
AND block_number BETWEEN 21000000 AND 21050000
UNION ALL
SELECT tt.block_number, tt.block_timestamp, tt.transaction_hash,
tt.from_address, tt.to_address,
tt.token_address, tt.amount_raw / POWER(10, tk.decimals)
FROM token_transfers AS tt
JOIN tokens AS tk ON tk.token_address = tt.token_address -- casas decimais por token
WHERE tt.block_number BETWEEN 21000000 AND 21050000;
A metade referente aos rastros de execução inclui tanto chamadas de nível superior quanto internas, portanto não precisa da tabela transactions. UNION ALL mantém linhas que parecem idênticas, mas são transferências reais e distintas, e o intervalo de blocos compartilhado mantém o resultado delimitado e reproduzível. A junção interna descarta silenciosamente tokens ausentes em tokens; compare as contagens de linhas (a Aula 2.9 aborda os filtros dos rastros de execução, e a Aula 2.8, as junções).
Escolhas práticas antes de rastrear
- Delimite o grafo. Defina um ponto inicial, uma janela de tempo e um limite de saltos antes de consultar; uma expansão sem limites alcança todas as exchanges em poucos saltos e deixa de servir como evidência.
- Marque os supernós. Carteiras quentes de exchanges, pontes e contratos populares têm milhões de arestas; sinalize-os como pontos de parada.
- Adeque o armazenamento à pergunta. Listas de arestas em SQL são adequadas para agregação e filtragem; bancos de dados de grafos e bibliotecas como NetworkX ou igraph são adequados para busca de caminhos e centralidade, por isso muitas equipes exportam um subgrafo delimitado para uma ferramenta de grafos.
- Mantenha a proveniência em cada aresta: txid, índice, altura do bloco e a consulta que a produziu, para que outro analista possa reconstruir o mesmo grafo.
Grau e fluxo de valor
As métricas mais simples são contagens e somas por nó, calculadas em uma janela de tempo fixa e para um único ativo:
- Grau de entrada: número de contrapartes distintas que enviaram ao nó. Grau de saída: número de contrapartes para as quais ele enviou.
- Grau ponderado: valor total recebido e enviado.
- Razão de repasse: valor de saída ÷ valor de entrada na janela. Uma razão próxima de 1 com um tempo de retenção curto indica um intermediário que encaminha o que recebe em vez de manter os fundos.
- Período de atividade e tempo de retenção: primeira e última atividade, e o tempo entre receber e enviar.
Essas métricas, por si só, distinguem muitos papéis. Uma carteira pessoal tem grau baixo e mantém fundos por semanas. Um endereço de depósito de exchange tem algumas entradas de remetentes diferentes e saídas para um único destino, a carteira de recolhimento. Uma carteira quente tem graus na casa das dezenas de milhares. Um intermediário de lavagem de dinheiro frequentemente tem grau de entrada 1, grau de saída de 2 a 20, razão de repasse próxima de 1 e tempo de retenção de minutos. A consulta abaixo traça o perfil de um mês de arestas de moeda nativa.
WITH io AS ( -- uma linha por lado de cada aresta
SELECT dst AS address, src AS peer, amount AS amt_in, 0 AS amt_out, block_timestamp AS ts
FROM edges WHERE asset = 'ETH'
UNION ALL
SELECT src, dst, 0, amount, block_timestamp
FROM edges WHERE asset = 'ETH'
)
SELECT address,
COUNT(DISTINCT CASE WHEN amt_in > 0 THEN peer END) AS in_degree,
COUNT(DISTINCT CASE WHEN amt_out > 0 THEN peer END) AS out_degree,
SUM(amt_in) AS value_in, SUM(amt_out) AS value_out,
SUM(amt_out) / NULLIF(SUM(amt_in), 0) AS pass_through,
MIN(ts) AS first_seen, MAX(ts) AS last_seen
FROM io
WHERE ts >= TIMESTAMP '2026-03-01' AND ts < TIMESTAMP '2026-04-01'
GROUP BY address
HAVING COUNT(DISTINCT CASE WHEN amt_out > 0 THEN peer END) >= 20;
A CTE transforma cada aresta em uma linha de destinatário e uma linha de remetente, de modo que um único GROUP BY produz ambas as direções; NULLIF evita divisão por zero, e HAVING mantém nós com forte dispersão. A janela abrange apenas a atividade dentro dela: um endereço que recebeu fundos em fevereiro apresenta uma razão de repasse muito acima de 1 em março.
Centralidade
A centralidade mede a importância de um nó para a estrutura do grafo, não apenas seu nível de atividade.
| Métrica | O que mede | Uso típico |
|---|---|---|
| Centralidade de grau | Número de conexões diretas | Encontrar nós concentradores e serviços |
| Centralidade de intermediação | Com que frequência o nó está nos caminhos mais curtos entre outros nós | Encontrar intermediários e gargalos entre grupos que, de outra forma, estariam separados |
| PageRank | Importância herdada de vizinhos importantes | Classificar nós em grandes grafos de fluxo |
Em um subgrafo de investigação, um endereço com alta centralidade de intermediação, mas grau modesto, costuma ser o nó mais interessante: o coletor ao qual todos os caminhos de dispersão retornam ou a única ponte entre um agrupamento ligado a um roubo e as exchanges usadas para converter seus fundos em dinheiro. Calcule a centralidade em um subgrafo delimitado, com serviços como pontos finais; na rede inteira, exchanges e contratos populares dominam todas as classificações. Bibliotecas de grafos calculam essas métricas; SQL puro lida com grau, mas não com centralidade de intermediação.
Padrões: dispersão, convergência e cadeias de descascamento
Dispersão é um nó enviando para muitos em um período curto; convergência é muitos enviando para um. Ambas são normais (saques em lote, recolhimentos, pagamentos de mineração, airdrops); as perguntas são quem são as partes e o que acontece depois:
- Dispersão: um endereço ligado a um roubo distribui valores semelhantes para dezenas de endereços novos, sem histórico anterior. Quantias semelhantes e destinatários novos distinguem isso de um pagamento empresarial.
- Coleta: muitas vítimas de golpe pagam a um endereço (convergência), que encaminha o total adiante.
- Consolidação: em redes UTXO, uma transação de convergência que gasta muitas saídas juntas também é evidência para agrupamento (Aula 4.1).
Uma cadeia de descascamento, descrita no estudo de 2013 "A Fistful of Bitcoins", de Meiklejohn e colegas, começa com uma grande quantia em um endereço. Cada transação destaca um pequeno pagamento e envia o grande saldo restante para um novo endereço, que repete o processo. Com uma taxa de 0,01 BTC por etapa:
| Etapa | Entrada | Parcela destacada | Restante (troco) |
|---|---|---|---|
| T1 | 50,00 | 1,20 → depósito em exchange | 48,79 |
| T2 | 48,79 | 0,80 → depósito em exchange | 47,98 |
| T3 | 47,98 | 2,50 → corretor OTC | 45,47 |
| T4 | 45,47 | 0,95 → depósito em exchange | 44,51 |
Indícios: uma entrada e duas saídas por transação; uma saída muito maior e logo gasta em uma transação com a mesma estrutura; o mesmo tipo de script e as mesmas assinaturas características de carteira; saltos separados por minutos ou blocos. Um estudo de 2023 de Gong, Chow, Yiu e Ting ("Analyzing the Peeling Chain Patterns on the Bitcoin Blockchain") constatou que cerca de 71% das transações nas cadeias identificadas destacavam menos de 1% da entrada, e cerca de 79% das cadeias eram criadas em até um dia. O restante carrega a maior parte do valor, portanto o analista o segue e registra cada parcela destacada como um ponto de conversão em dinheiro. A forma não é inerentemente ilícita: uma carteira pagando contas a partir de um grande saldo, ou uma carteira quente pagando saques um a um, tem a mesma aparência.
Dissimulação, ciclos e motivos
A dissimulação, etapa da lavagem de dinheiro que distancia os fundos de sua origem, aparece na blockchain como longas cadeias de endereços novos de curta duração, saltos automatizados rápidos, divisões e recombinações, trocas de ativos e movimentações entre redes. Nenhum salto isolado é suspeito; a combinação é. A circulação de retorno é o valor que retorna ao seu nó ou a outro nó da mesma parte: um ciclo. Ciclos curtos podem inflar o volume de negociação de um token ou NFT (wash trading), simular um histórico de pagamentos ou reciclar fundos por meio de um serviço. A detecção de ciclos funciona melhor em um grafo de entidades, porque uma parte que devolve fundos a um endereço diferente de sua própria titularidade só forma um ciclo após o agrupamento.
Um motivo é uma pequena forma de subgrafo que se repete com mais frequência do que o acaso prevê. Um conjunto de dados sintético amplamente usado para treinar modelos de prevenção à lavagem de dinheiro (Altman e colegas, NeurIPS 2023) gera oito: dispersão, convergência, coleta-dispersão, dispersão-coleta, ciclo, bipartido, pilha e aleatório. Na dispersão-coleta, uma origem divide os fundos entre intermediários que encaminham tudo para um único destino, acrescentando saltos sem mudar a titularidade; a coleta-dispersão consiste em muitas origens convergindo para um nó que dispersa o total, algo típico de um endereço de coleta de golpes; uma pilha consiste em duas camadas de intermediários totalmente conectadas entre si. As buscas por motivos são consultas de padrões em bancos de dados de grafos ou autojunções com restrições de tempo na lista de arestas. A janela de tempo é o parâmetro principal: dispersão-coleta em uma hora é um sinal forte; ao longo de um ano, é comércio cotidiano.
Sinais, não conclusões
Arestas são fatos registrados; papéis, padrões e motivos são interpretações com explicações inocentes. Trate cada um como um motivo para examinar mais de perto, combine sinais independentes antes de fazer uma inferência e registre os limiares usados (limites de grau, janelas de tempo, tolerâncias de quantia), para que outro analista possa reproduzi-los e contestá-los.
Foco no exame: a diferença entre grafos de transações, de endereços e de entidades e para que cada um é adequado; por que o grafo de gastos UTXO é exato, enquanto o grafo de endereços precisa de uma suposição de alocação; cálculo de pesos proporcionais de arestas para uma transação com múltiplas entradas e saídas; os atributos de que toda aresta precisa e por que arestas paralelas mantêm seus timestamps; as três fontes de arestas do modelo de contas e por que as revertidas são excluídas; delimitação de um grafo e tratamento de supernós como pontos de parada; grau, razão de repasse e tempo de retenção como indicadores de papéis; centralidade de intermediação em um subgrafo delimitado; convergência, dispersão, cadeias de descascamento (e por que o restante é seguido), ciclos e motivos de dispersão-coleta como sinais que precisam de corroboração e limiares documentados.