Relatórios analíticos · Aula 3 de 6
Visualizando fluxos e grafos
9 min de leitura
A maioria dos leitores de um relatório on-chain olha primeiro as imagens e depois o texto, e alguns nunca leem o texto. Um bom diagrama de fluxo permite que um promotor, um responsável por compliance ou um editor entenda em dez segundos para onde o dinheiro foi; um diagrama ruim sugere uma conclusão que as evidências não sustentam. Esta aula aborda os quatro recursos visuais mais usados por analistas, como criá-los a partir dos resultados de consultas e como torná-los confiáveis e legíveis para todos.
Escolha o recurso visual de acordo com a pergunta
Comece pela pergunta que o leitor precisa ver respondida, não pela ferramenta que você tem aberta.
| Pergunta do leitor | Melhor recurso visual | O que ele oculta |
|---|---|---|
| Quanto foi para cada destino? | Diagrama de Sankey | Momento, transações individuais |
| Como esses endereços estão conectados e por qual caminho? | Grafo de fluxo | Valores, a menos que sejam identificados |
| Quando as coisas aconteceram e em que ordem? | Linha do tempo | Estrutura da rede |
| Quais endereços pertencem a cada entidade? | Mapa de clusters | Direção e momento do fluxo |
| Como um saldo ou volume mudou ao longo do tempo? | Gráfico de linhas ou barras | Contrapartes |
Todo recurso visual simplifica e cada um oculta algo. Um relatório que precisa mostrar valor, caminho e tempo geralmente requer duas ou três figuras, cada uma com uma função, em vez de uma única figura que tente mostrar tudo.
Diagramas de Sankey
Um diagrama de Sankey representa os fluxos como faixas cuja largura é proporcional ao valor transferido. Seu nome vem de Matthew Sankey, que o utilizou em 1898 para mostrar a eficiência energética de uma máquina a vapor; é a forma mais clara de mostrar como um total foi dividido.
Exemplo resolvido. Um endereço de um invasor tem 941,2 ETH após trocar o produto do ataque. Um diagrama de Sankey mostra três faixas saindo dele: 600 ETH para um serviço de swap entre cadeias, 300 ETH para uma ponte e 41,2 ETH que permaneceram no endereço. As larguras das faixas estão na proporção 600 : 300 : 41,2, então o leitor percebe imediatamente que quase dois terços seguiram por um caminho.
Regras para manter um diagrama de Sankey confiável:
- Conserve o valor. O que entra em um nó deve ser igual ao que sai dele mais o que permanece. Mostre taxas, saldos não gastos e valores não rastreados como faixas explícitas ("taxas 0,002 BTC", "não movimentado 41,2 ETH", "não rastreado"); nunca deixe que desapareçam sem explicação.
- Use uma unidade por diagrama. Não misture faixas de ETH e BTC. Faça um diagrama de Sankey por ativo ou converta tudo para uma única moeda no momento de cada transferência e informe a fonte do preço.
- Ordene as colunas por salto ou por tempo, da esquerda para a direita, e indique qual critério foi usado.
- Evite ciclos. Os layouts de Sankey pressupõem fluxo em uma única direção. O retorno de fundos ao ponto de origem (veja Métricas e padrões de grafos) deve ser representado em um grafo de fluxo.
Os dados por trás de um diagrama de Sankey formam uma lista de arestas: origem, destino, valor. Uma consulta em uma tabela de transferências rastreadas os produz diretamente:
-- Lista de arestas para um diagrama de Sankey: valor transferido entre entidades identificadas
SELECT
COALESCE(ls.entity, t.from_address) AS source,
COALESCE(lt.entity, t.to_address) AS target,
SUM(t.amount_wei) / 1e18 AS eth_moved, -- precisão: veja a observação
COUNT(*) AS transfers
FROM traced_transfers t
LEFT JOIN labels ls ON ls.address = t.from_address
LEFT JOIN labels lt ON lt.address = t.to_address
GROUP BY 1, 2
ORDER BY eth_moved DESC;
As duas junções à esquerda substituem os endereços pelos nomes das entidades quando existe um rótulo e, caso contrário, mantêm o endereço bruto. Usar o endereço como alternativa, em vez de um único agrupamento "Sem rótulo", é importante: um único nó "Sem rótulo" reuniria endereços sem relação entre si e desenharia fluxos entre eles que nunca aconteceram. As junções pressupõem um rótulo por endereço; se a tabela de rótulos puder conter vários, mantenha apenas um primeiro, como mostrado na aula Junções, funções de janela e CTEs para fluxos, caso contrário, as somas serão multiplicadas. Duas observações sobre portabilidade: GROUP BY 1, 2 posicional funciona na maioria dos mecanismos, mas não em todos, e a divisão por 1e18 produz um número de ponto flutuante em muitos mecanismos. Portanto, para obter valores exatos, converta primeiro para um tipo decimal de alta precisão (veja Fundamentos de SQL para tabelas de blockchain).
Grafos de fluxo
Um grafo de fluxo representa endereços ou entidades como caixas e transferências como setas. É a representação visual natural do trabalho de rastreamento (veja Grafos de transações: nós, arestas e direção).
- Use um layout em camadas, da esquerda para a direita, para rastreamentos, com cada coluna representando um salto ou uma etapa temporal. Assim, os leitores acompanham o dinheiro como se estivessem lendo um texto.
- Use layouts direcionados por força apenas para exploração. Nesses layouts, a posição é um artefato do algoritmo: dois nós desenhados próximos parecem relacionados mesmo quando não são. Nunca inclua esse tipo de layout em um relatório sem explicá-lo.
- Identifique as arestas com o valor, a data e uma referência curta à transação, e deixe o hash completo no apêndice.
- Diferencie o que foi observado do que foi inferido. Represente transferências que são fatos com setas contínuas e vínculos que são inferências (uma correspondência entre valor e horário de uma ponte, uma atribuição de saída de troco) com setas tracejadas, indicando ao lado a probabilidade. Isso leva para a imagem a distinção entre fato e inferência apresentada na aula Confiança, incerteza e linguagem.
- Mostre onde o rastreamento parou. Uma linha curta identificada como "não rastreado além deste ponto" ou "serviço de custódia" informa ao leitor que o limite é uma escolha, não o fim do dinheiro.
- Mantenha o grafo pequeno. Acima de cerca de 30 a 50 nós, um grafo deixa de ser legível. Reúna cadeias peel em uma caixa ("cadeia peel, 9 saltos") e clusters em um único nó, e coloque os detalhes em um apêndice.
Ferramentas abertas como Graphviz (layouts em camadas), Gephi e Cytoscape (exploração de redes), além de bibliotecas de gráficos como d3, são opções comuns. Seja qual for a ferramenta usada, exporte a lista de arestas subjacente junto com a figura para que ela possa ser verificada.
Linhas do tempo
Uma linha do tempo responde a "quando" e "em que ordem", o que muitas vezes é mais importante para leitores jurídicos e operacionais do que o próprio caminho: com que rapidez os fundos chegaram a um exchange, houve tempo para congelá-los?
- Use UTC em todo o material e mostre as alturas dos blocos junto aos horários.
- Em casos entre cadeias, use uma faixa por cadeia, para que um depósito em uma ponte em uma faixa e a liberação em outra apareçam lado a lado.
- Os intervalos também têm significado: um período de inatividade de semanas aparece como um espaço vazio. Se comprimir o eixo para economizar espaço, indique claramente a quebra.
Mapas de clusters
Um mapa de clusters mostra a resolução de entidades: quais endereços foram agrupados e por quê. Desenhe cada cluster como um contêiner e inclua nele os endereços (ou a quantidade de endereços); represente o motivo de cada vínculo, como entradas comuns ou um endereço de depósito compartilhado, com um estilo de linha distinto. Se o tamanho do cluster for indicado pela área de um círculo, informe se ela representa a quantidade de endereços ou o saldo. Avise o leitor quando um cluster for suspeitosamente grande, pois superclusters são um modo de falha conhecido (veja Avaliação da qualidade de clusters).
Como evitar layouts enganosos
Os recursos visuais enganam mais frequentemente por causa das escolhas de layout do que por causa de dados incorretos. Confira cada figura usando esta lista:
- Eixos truncados ou inconsistentes: um gráfico de barras cujo eixo começa em 900 ETH faz 950 parecer o dobro de 925. Use a mesma escala em gráficos que serão comparados.
- Área versus comprimento: se o raio de um círculo representar o valor, dobrar o raio quadruplica a área e exagera a diferença. Escale a área, não o raio.
- Escalas logarítmicas sem identificação: são úteis para intervalos amplos, mas enganosas se o leitor presumir que a escala é linear.
- Cores carregadas: usar vermelho para uma entidade apenas suspeita implica um veredito. Use cores neutras e reserve as cores de alerta para fatos estabelecidos, como um contrato de exploração confirmado.
- Omissão seletiva: mostrar apenas os caminhos que chegam ao suspeito e omitir os fluxos maiores que seguiram para outros destinos.
- Precisão falsa: "1.912.400,000000 USDC" em uma figura sugere um grau de certeza na atribuição que o valor não oferece; arredonde os valores nas figuras e mantenha os valores exatos no apêndice.
Acessibilidade
Os relatórios são lidos em celulares, impressos em tons de cinza e lidos por pessoas com deficiência na visão de cores, que afeta aproximadamente 1 em cada 12 homens e 1 em cada 200 mulheres. As Diretrizes de Acessibilidade para Conteúdo Web (WCAG 2.1 e 2.2) oferecem metas úteis até mesmo para documentos que não são páginas da web:
- Contraste do texto de pelo menos 4,5:1 em relação ao fundo (3:1 para texto grande).
- Contraste de pelo menos 3:1 para elementos gráficos significativos, como linhas e faixas.
- Nunca use apenas a cor para transmitir significado: combine-a com rótulos, padrões ou estilos de linha (contínua para observado, tracejada para inferido também funciona em tons de cinza).
Inclua para cada figura um texto alternativo ou uma legenda que indique a conclusão principal ("dois terços dos fundos foram para o swap entre cadeias"), e não apenas uma descrição ("um diagrama de Sankey"); inclua também a tabela subjacente no apêndice para que leitores que usam leitores de tela e revisores tenham acesso às mesmas informações.
Foco no exame: combinar o recurso visual com a pergunta do leitor (diagrama de Sankey para valores, grafo de fluxo para caminhos, linha do tempo para ordem, mapa de clusters para resolução de entidades); regras para diagramas de Sankey (conservação, taxas e valores não rastreados explícitos, uma unidade por diagrama, sem ciclos); criar uma lista de arestas em SQL sem agrupar endereços sem rótulo; layouts em camadas versus layouts direcionados por força; setas contínuas para fatos e tracejadas para inferências; mostrar onde o rastreamento parou; escolhas comuns que induzem a erro (eixos truncados, área versus raio, cores carregadas, omissão); metas de contraste da WCAG de 4,5:1 para texto e 3:1 para gráficos, e nunca depender apenas da cor.