Report analitici · Lezione 3 di 6
Visualizzare flussi e grafi
9 min di lettura
La maggior parte dei lettori di un report on-chain guarda prima le immagini e poi il testo, e alcuni non leggono affatto il testo. Un buon diagramma di flusso consente a un pubblico ministero, a un responsabile della conformità o a un redattore di capire in dieci secondi dove sono finiti i fondi; uno cattivo suggerisce una conclusione che le prove non supportano. Questa lezione tratta le quattro visualizzazioni più usate dagli analisti, come crearle a partire dai risultati delle query e come mantenerle corrette e leggibili per tutti.
Scegliere la visualizzazione in base alla domanda
Parti dalla domanda a cui il lettore ha bisogno di una risposta, non dallo strumento che hai aperto.
| Domanda del lettore | Visualizzazione migliore | Cosa nasconde |
|---|---|---|
| Quanto è andato dove? | Diagramma di Sankey | Tempistiche, singole transazioni |
| Come sono collegati questi indirizzi e attraverso quale percorso? | Grafo di flusso | Importi, se non sono etichettati |
| Quando sono avvenuti i fatti e in quale ordine? | Linea del tempo | Struttura della rete |
| Quali indirizzi appartengono a quale entità? | Mappa dei cluster | Direzione e tempistiche dei flussi |
| Come sono cambiati nel tempo un saldo o un volume? | Grafico a linee o a barre | Controparti |
Ogni visualizzazione semplifica e ciascuna nasconde qualcosa. Un report che deve mostrare importo, percorso e tempo di solito necessita di due o tre figure, ciascuna con una sola funzione, anziché di un'unica figura che cerchi di fare tutto.
Diagrammi di Sankey
Un diagramma di Sankey rappresenta i flussi come fasce la cui larghezza è proporzionale al valore trasferito. Prende il nome da Matthew Sankey, che ne usò uno nel 1898 per mostrare l'efficienza energetica di un motore a vapore; è il modo più chiaro per mostrare come è stata suddivisa una somma.
Esempio svolto. Un indirizzo controllato da un attaccante detiene 941,2 ETH dopo aver effettuato lo swap dei fondi sottratti. Un diagramma di Sankey mostra tre fasce che ne escono: 600 ETH verso un servizio di swap cross-chain, 300 ETH verso un bridge e 41,2 ETH rimasti lì. Le larghezze delle fasce sono nel rapporto 600 : 300 : 41,2, quindi il lettore vede subito che quasi due terzi sono andati in una direzione.
Regole per mantenere corretto un diagramma di Sankey:
- Conserva il valore. Ciò che entra in un nodo deve essere uguale a ciò che ne esce più ciò che vi rimane. Mostra commissioni, saldi non spesi e importi non tracciati come fasce esplicite ("commissioni 0,002 BTC", "non movimentati 41,2 ETH", "non tracciati"); non lasciarli mai scomparire senza indicarlo.
- Una sola unità per diagramma. Non mescolare fasce in ETH e BTC. Disegna un diagramma di Sankey per ogni asset oppure converti in un'unica valuta al momento di ciascun trasferimento e indica la fonte dei prezzi.
- Ordina le colonne per passaggio o per tempo, da sinistra a destra, e specifica quale criterio hai usato.
- Evita i cicli. I layout di Sankey presuppongono un flusso in una sola direzione. I trasferimenti di andata e ritorno (vedi Metriche e schemi dei grafi) vanno rappresentati in un grafo di flusso.
I dati alla base di un diagramma di Sankey sono un elenco di archi: sorgente, destinazione, valore. Una query su una tabella di trasferimenti tracciati li produce direttamente:
-- Elenco di archi per un diagramma di Sankey: valore trasferito tra entità etichettate
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, -- precisione: vedi nota
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;
Le due join a sinistra sostituiscono gli indirizzi con i nomi delle entità quando esiste un'etichetta e, in caso contrario, mantengono l'indirizzo grezzo. Ripiegare sull'indirizzo, anziché su un unico contenitore "Senza etichetta", è importante: un solo nodo "Senza etichetta" unirebbe indirizzi non correlati e rappresenterebbe flussi tra loro che non si sono mai verificati. Le join presuppongono un'etichetta per indirizzo; se la tabella delle etichette può contenerne diverse, selezionane prima una, come mostrato nella lezione Join, funzioni finestra e CTE per i flussi, altrimenti le somme si moltiplicheranno. Due note sulla portabilità: GROUP BY 1, 2 con indici posizionali funziona nella maggior parte dei motori, ma non in tutti, e la divisione per 1e18 produce un numero in virgola mobile in molti motori; quindi, per ottenere valori esatti, converti prima a un tipo decimale ad alta precisione (vedi Fondamenti di SQL per le tabelle blockchain).
Grafi di flusso
Un grafo di flusso rappresenta indirizzi o entità come riquadri e i trasferimenti come frecce. È la rappresentazione visiva naturale del lavoro di tracciamento (vedi Grafi delle transazioni: nodi, archi e direzione).
- Usa un layout a livelli, da sinistra a destra per le tracce, con ogni colonna che rappresenta un passaggio o un intervallo temporale. In questo modo i lettori seguono il denaro come se leggessero un testo.
- Usa layout a forze dirette solo per l'esplorazione. In questi layout, la posizione è un artefatto dell'algoritmo: due nodi vicini nel disegno sembrano correlati anche quando non lo sono. Non inserire mai un layout di questo tipo in un report senza spiegarlo.
- Etichetta gli archi con importo, data e un breve riferimento alla transazione; inserisci l'hash completo in appendice.
- Distingui ciò che è osservato da ciò che è inferito. Rappresenta i trasferimenti che sono fatti con frecce continue e i collegamenti che sono inferenze (una corrispondenza tra importo e orario di un bridge, un'identificazione di un output di resto) con frecce tratteggiate, accompagnate dal termine di probabilità. In questo modo la distinzione tra fatto e inferenza della lezione Confidenza, incertezza e linguaggio viene riportata nella figura.
- Mostra dove si è interrotto il tracciamento. Un breve tratto etichettato "non tracciato oltre" o "servizio di custodia" comunica al lettore che il limite è una scelta, non il punto in cui finisce il denaro.
- Mantienilo piccolo. Oltre circa 30-50 nodi, un grafo diventa illeggibile. Raggruppa le catene peel in un unico riquadro ("catena peel, 9 passaggi") e i cluster in un solo nodo, e inserisci i dettagli in appendice.
Strumenti aperti come Graphviz (layout a livelli), Gephi e Cytoscape (esplorazione delle reti) e librerie per la creazione di grafici come d3 sono scelte comuni; qualunque strumento tu usi, esporta l'elenco di archi sottostante insieme alla figura, così che possa essere verificato.
Linee del tempo
Una linea del tempo risponde alle domande "quando" e "in quale ordine", che spesso contano più del percorso stesso per i lettori in ambito legale e operativo: quanto velocemente i fondi hanno raggiunto un exchange, c'era tempo per congelarli?
- Usa sempre UTC e mostra le altezze dei blocchi accanto agli orari.
- Nei casi cross-chain, usa una corsia per ogni chain, in modo che un deposito su un bridge in una corsia e il relativo rilascio in un'altra siano affiancati.
- Gli intervalli vuoti hanno un significato: un periodo di inattività di alcune settimane si manifesta come spazio vuoto. Se comprimi l'asse per risparmiare spazio, indica chiaramente l'interruzione.
Mappe dei cluster
Una mappa dei cluster mostra la risoluzione delle entità: quali indirizzi sono stati raggruppati e perché. Disegna ogni cluster come un contenitore e inserisci al suo interno gli indirizzi (o il numero di indirizzi); rappresenta con uno stile di linea distinto il motivo di ogni collegamento, come gli input comuni o un indirizzo di deposito condiviso. Se le dimensioni del cluster sono rappresentate dall'area di una bolla, indica se questa codifica il numero di indirizzi o il saldo. Avvisa il lettore quando un cluster è sospettosamente grande, perché i supercluster sono una modalità di errore nota (vedi Valutare la qualità dei cluster).
Evitare layout fuorvianti
Le visualizzazioni traggono in inganno più spesso per le scelte di layout che per dati errati. Controlla ogni figura usando questo elenco:
- Assi troncati o incoerenti: un grafico a barre il cui asse parte da 900 ETH fa sembrare 950 il doppio di 925. Usa la stessa scala nei grafici destinati al confronto.
- Area rispetto alla lunghezza: se il raggio di una bolla codifica il valore, raddoppiarlo quadruplica l'area ed esagera la differenza. Scala l'area, non il raggio.
- Scale logaritmiche senza etichetta: utili per intervalli ampi, ma fuorvianti se il lettore presume che la scala sia lineare.
- Colori che suggeriscono un giudizio: usare il rosso per un'entità soltanto sospetta implica un verdetto. Usa colori neutri e riserva quelli di avvertimento a fatti accertati, come un contratto di exploit confermato.
- Omissione selettiva: mostrare solo i percorsi che raggiungono il sospettato, tralasciando i flussi più consistenti diretti altrove.
- Falsa precisione: "1.912.400,000000 USDC" in una figura suggerisce un livello di certezza nell'attribuzione che l'importo non giustifica; arrotonda nelle figure e conserva i valori esatti in appendice.
Accessibilità
I report vengono letti su telefoni, stampati in scala di grigi e consultati da persone con deficit della visione dei colori, una condizione che riguarda circa 1 uomo su 12 e 1 donna su 200. Le Web Content Accessibility Guidelines (WCAG 2.1 e 2.2) forniscono obiettivi utili anche per documenti che non sono pagine web:
- Contrasto del testo di almeno 4,5:1 rispetto allo sfondo (3:1 per il testo grande).
- Contrasto di almeno 3:1 per gli elementi grafici significativi, come linee e fasce.
- Non affidarti mai soltanto al colore per comunicare un significato: abbinalo a etichette, motivi o stili di linea (continuo per ciò che è osservato, tratteggiato per ciò che è inferito funziona anche in scala di grigi).
Aggiungi a ogni figura un testo alternativo o una didascalia che ne indichi il messaggio principale ("due terzi dei fondi sono andati al servizio di swap cross-chain"), non soltanto una descrizione ("un diagramma di Sankey"), e includi la tabella sottostante in appendice, così che chi usa lettori di schermo e chi effettua revisioni ottenga le stesse informazioni.
Focus sull'esame: abbinare la visualizzazione alla domanda del lettore (diagramma di Sankey per gli importi, grafo di flusso per i percorsi, linea del tempo per l'ordine, mappa dei cluster per la risoluzione delle entità); regole per i diagrammi di Sankey (conservazione del valore, indicazione esplicita di commissioni e importi non tracciati, una sola unità per diagramma, assenza di cicli); creare un elenco di archi in SQL senza unire indirizzi privi di etichetta; layout a livelli rispetto a layout a forze dirette; frecce continue per i fatti e tratteggiate per le inferenze; indicare dove si è interrotto il tracciamento; scelte fuorvianti comuni (assi troncati, area rispetto al raggio, colori che suggeriscono un giudizio, omissione); obiettivi di contrasto WCAG di 4,5:1 per il testo e 3:1 per gli elementi grafici, senza mai affidarsi soltanto al colore.