Rastreo y grafos de transacciones · Lección 1 de 6
Grafos de transacciones y métricas de grafos
15 min de lectura
Casi toda pregunta de rastreo, desde «¿adónde fueron los fondos robados?» hasta «¿está este depósito expuesto a un servicio sancionado?», es una pregunta sobre un grafo. Lo que se elige como nodos y aristas determina, de manera implícita, qué respuestas son posibles y, una vez que existe el grafo, se necesitan formas de encontrar lo relevante sin leer miles de aristas manualmente. Esta lección muestra cómo construir un grafo que se pueda defender, las métricas y formas recurrentes que utilizan los analistas para interpretarlo y por qué ninguna de ellas constituye una prueba por sí sola.
Tres grafos a partir de los mismos datos
Los mismos datos de bloques se pueden modelar de tres formas, y los analistas pasan constantemente de una a otra.
| Grafo | Nodos | Aristas | Más adecuado para |
|---|---|---|---|
| Grafo de transacciones | Transacciones (y, en cadenas UTXO, las salidas que crean) | Una salida creada por una transacción y gastada por otra | Rastreo UTXO exacto y sin pérdida de información |
| Grafo de direcciones | Direcciones | Valor enviado de una dirección a otra | Cadenas con modelo de cuentas, vistas generales rápidas |
| Grafo de entidades | Agrupaciones o servicios etiquetados | Flujos agregados entre entidades | Elaboración de informes, exposición, análisis de contrapartes |
El grafo de transacciones es el más cercano a los datos sin procesar. En Bitcoin, cada salida permanece sin gastar o es consumida por exactamente una entrada posterior, por lo que las relaciones de gasto forman un grafo acíclico dirigido preciso: el dinero no puede fluir hacia atrás en el tiempo y no se infiere nada. El grafo de direcciones convierte cada dirección en un nodo. Resulta natural para las cadenas con modelo de cuentas, donde una transferencia realmente va de una cuenta a otra, pero en las cadenas UTXO introduce ambigüedad, como muestra el ejemplo siguiente. El grafo de entidades sustituye las direcciones por agrupaciones («Billeteras calientes del exchange X»). La mayoría de los informes lo muestran, pero cada nodo depende de la agrupación y la atribución, que tienen sus propias tasas de error (lección 4.1), por lo que las capas inferiores deben poder desplegarse detrás de cada arista entre entidades.
Muchas herramientas visuales de rastreo dibujan un grafo bipartito híbrido con dos tipos de nodos, direcciones y transacciones: las aristas van de una dirección a una transacción (una entrada) y de una transacción a una dirección (una salida). Conserva la exactitud del grafo de transacciones y, al mismo tiempo, muestra quién posee qué.
Aristas: dirección, peso y tiempo
Una arista útil contiene más que «A pagó a B». Como mínimo, registre:
- Dirección: origen y destino. El rastreo hacia adelante sigue las aristas salientes; el rastreo hacia atrás sigue las entrantes.
- Peso: el importe en unidades nativas tras la conversión decimal, opcionalmente con su valor en una moneda de referencia en ese momento, citando la fuente del precio.
- Tiempo: altura del bloque y marca de tiempo del bloque en UTC. La altura ordena los eventos de forma fiable; las marcas de tiempo son aproximadas (lección 2.1).
- Identidad: hash de la transacción más el índice de salida (UTXO), o el índice del registro o la posición en la traza (modelo de cuentas), para que la arista sea única y se pueda verificar con un nodo.
- Activo: moneda nativa o dirección del contrato del token. Nunca sume aristas de activos diferentes.
Dos direcciones pueden estar vinculadas por muchas aristas en distintos momentos (un multigrafo). Agregarlas en una sola arista de «total enviado» sirve para una visualización, pero destruye el orden del que depende el rastreo: los fondos que llegaron después de un pago no pueden haberlo financiado.
De una transacción UTXO a las aristas
Considere una transacción de Bitcoin decodificada, 4f3a…c21e, en el bloque 871.204, enriquecida con la dirección y el valor de cada salida gastada (las entradas sin procesar solo hacen referencia a un punto de salida, por lo que un indexador o una segunda consulta proporciona estos campos):
| Lado | Referencia | Dirección | Valor (BTC) |
|---|---|---|---|
| Entrada | 9b1e…04aa:1 | bc1q…7k3f | 0,60000000 |
| Entrada | c07d…e912:0 | bc1q…m2pz | 0,50000000 |
| Salida 0 | 4f3a…c21e:0 | bc1q…x9td | 0,80000000 |
| Salida 1 | 4f3a…c21e:1 | bc1q…h4wa | 0,29000000 |
Las entradas suman 1,10 BTC y las salidas 1,09 BTC, por lo que la comisión es de 0,01 BTC.
En el grafo de transacciones, esto es un nodo con dos aristas entrantes (los puntos de salida) y dos aristas salientes (las salidas); no se necesita ningún supuesto. En el grafo de direcciones, Bitcoin no indica qué entrada pagó qué salida, porque las entradas se combinan. Todas las combinaciones posibles dan cuatro aristas (2 entradas × 2 salidas), y hay que elegir sus pesos. La elección habitual es la asignación proporcional: la primera entrada aportó 0,60 ÷ 1,10 = 54,55% del valor, por lo que se le atribuye el 54,55% de cada salida, y a la segunda el 45,45%.
| Arista | 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 |
Los pesos suman 1,09 BTC; la comisión sale del grafo (algunos analistas añaden un nodo sumidero de «comisión» para conservar el valor). Una transacción de 50 entradas y 50 salidas crearía 2.500 aristas de este tipo, razón por la que las consolidaciones y los pagos por lotes saturan los grafos de direcciones. Determinar si bc1q…h4wa es un pago o un cambio es una inferencia aparte (lección 4.2), y la ponderación proporcional es solo una regla de asignación (lección 3.3).
De los datos del modelo de cuentas a las aristas
En las cadenas de tipo Ethereum, las aristas provienen de tres fuentes, y un grafo construido a partir de solo una de ellas omitirá dinero:
- Transacciones de nivel superior con un
valuedistinto de cero: del firmante a la direcciónto. - Transferencias internas de moneda nativa realizadas por contratos durante la ejecución, que aparecen solo en las trazas (marcos
callcon valor). - Transferencias de tokens, decodificadas a partir de registros: un evento ERC-20
Transfer(address,address,uint256)tiene topic00xddf252ad…b3ef, el remitente y el destinatario en los temas 1 y 2, y el importe sin procesar en el campo de datos.
Excluya las transacciones revertidas (status del recibo = 0) y los marcos de traza revertidos: no movieron nada, aunque el remitente sí pagó gas. Trate los contratos como nodos etiquetados, porque un enrutador DEX o un contrato de token es un mecanismo, no una contraparte. Un intercambio suele producir dos aristas en activos diferentes, usuario → pool y pool → usuario (lección 5.2).
La mayor parte del trabajo con grafos comienza como una lista de aristas plana en un almacén de datos, construida a partir del esquema genérico de la lección 2.7 y guardada como una tabla edges que reutilizan las consultas de este módulo y del siguiente:
-- Lista de aristas (guardada como edges): ETH nativo de trazas más transferencias ERC-20
SELECT block_number, block_timestamp, transaction_hash,
from_address AS src, to_address AS dst,
'ETH' AS asset, value / 1e18 AS amount -- de wei a ETH
FROM traces
WHERE value > 0
AND (call_type IS NULL OR call_type = 'call') -- sin delegatecall ni staticcall
AND status = 1 AND tx_status = 1 -- solo marcos exitosos
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 -- decimales por token
WHERE tt.block_number BETWEEN 21000000 AND 21050000;
La parte de trazas incluye tanto las llamadas de nivel superior como las internas, por lo que no necesita la tabla transactions. UNION ALL conserva las filas que parecen idénticas, pero que son transferencias reales y distintas, y el intervalo de bloques compartido mantiene el resultado acotado y reproducible. La unión interna descarta silenciosamente los tokens que faltan en tokens; compare los recuentos de filas (la lección 2.9 aborda los filtros de trazas y la lección 2.8, las uniones).
Decisiones prácticas antes de rastrear
- Acote el grafo. Fije un punto de partida, una ventana temporal y un límite de saltos antes de consultar; una expansión sin límites llega a todos los exchanges en unos pocos saltos y deja de ser evidencia.
- Marque los supernodos. Las billeteras calientes de exchanges, los puentes y los contratos populares tienen millones de aristas; márquelos como puntos de detención.
- Adapte el almacenamiento a la pregunta. Las listas de aristas en SQL sirven para la agregación y el filtrado; las bases de datos de grafos y las bibliotecas como NetworkX o igraph sirven para la búsqueda de rutas y la centralidad, por lo que muchos equipos exportan un subgrafo acotado a una herramienta de grafos.
- Conserve la procedencia de cada arista: txid, índice, altura del bloque y la consulta que la produjo, para que otro analista pueda reconstruir el mismo grafo.
Grado y flujo de valor
Las métricas más sencillas son recuentos y sumas por nodo, calculados sobre una ventana temporal fija y un único activo:
- Grado de entrada: número de contrapartes distintas que enviaron al nodo. Grado de salida: número de contrapartes a las que envió.
- Grado ponderado: valor total recibido y enviado.
- Ratio de transferencia: valor saliente ÷ valor entrante durante la ventana. Un ratio cercano a 1 con un tiempo de retención corto señala a un intermediario que reenvía lo que recibe en lugar de conservarlo.
- Período de actividad y tiempo de retención: primera y última actividad, y el tiempo entre la recepción y el envío.
Estas métricas, por sí solas, permiten distinguir muchos roles. Una billetera personal tiene un grado bajo y conserva los fondos durante semanas. Una dirección de depósito de un exchange tiene unas pocas entradas de distintos remitentes y salidas hacia un único destino, la billetera de barrido. Una billetera caliente tiene grados de decenas de miles. Un intermediario de lavado de activos suele tener un grado de entrada de 1, un grado de salida de 2 a 20, un ratio de transferencia cercano a 1 y un tiempo de retención de minutos. La consulta siguiente caracteriza un mes de aristas de moneda nativa.
WITH io AS ( -- una fila por cada lado de cada arista
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;
La CTE convierte cada arista en una fila de receptor y otra de remitente, de modo que un solo GROUP BY produce ambas direcciones; NULLIF evita la división por cero y HAVING conserva los nodos con una dispersión elevada. La ventana solo contempla la actividad que ocurre dentro de ella: una dirección financiada en febrero muestra un ratio de transferencia muy superior a 1 en marzo.
Centralidad
La centralidad mide la importancia de un nodo para la estructura del grafo, no solo su nivel de actividad.
| Métrica | Qué mide | Uso habitual |
|---|---|---|
| Centralidad de grado | Número de conexiones directas | Encontrar centros de conexión y servicios |
| Centralidad de intermediación | Frecuencia con la que el nodo se encuentra en las rutas más cortas entre otros nodos | Encontrar intermediarios y cuellos de botella entre grupos que, de otro modo, estarían separados |
| PageRank | Importancia heredada de vecinos importantes | Clasificar nodos en grandes grafos de flujo |
En un subgrafo de investigación, una dirección con una centralidad de intermediación alta, pero un grado moderado, suele ser el nodo más interesante: el recolector al que vuelve cada ruta de dispersión, o el único puente entre una agrupación vinculada a un robo y los exchanges donde convierte los fondos en efectivo. Calcule la centralidad en un subgrafo acotado con los servicios como puntos finales; en la cadena completa, los exchanges y los contratos populares dominan todas las clasificaciones. Las bibliotecas de grafos calculan estas métricas; SQL por sí solo permite calcular el grado, pero no la centralidad de intermediación.
Patrones: dispersión, convergencia y cadenas de desprendimiento
La dispersión consiste en que un nodo envíe a muchos en un período corto; la convergencia consiste en que muchos envíen a uno. Ambas son normales (retiros por lotes, barridos, pagos de minería, airdrops); las preguntas son quiénes son las partes y qué ocurre después:
- Dispersión de fondos: una dirección vinculada a un robo distribuye fondos a decenas de direcciones nuevas sin historial previo, con valores similares. Los importes similares y los destinatarios nuevos distinguen este patrón de un pago empresarial.
- Recaudación: muchas víctimas de una estafa pagan a una dirección (convergencia), que reenvía el total.
- Consolidación: en las cadenas UTXO, una transacción de convergencia que gasta muchas salidas juntas también constituye evidencia para la agrupación (lección 4.1).
Una cadena de desprendimiento, descrita en el estudio de 2013 "A Fistful of Bitcoins", de Meiklejohn y sus colegas, comienza con un importe grande en una dirección. Cada transacción desprende un pago pequeño y envía el remanente grande a una dirección nueva, que repite el proceso. Con una comisión de 0,01 BTC por paso:
| Paso | Entrada | Importe desprendido | Remanente (cambio) |
|---|---|---|---|
| T1 | 50,00 | 1,20 → depósito en un exchange | 48,79 |
| T2 | 48,79 | 0,80 → depósito en un exchange | 47,98 |
| T3 | 47,98 | 2,50 → intermediario OTC | 45,47 |
| T4 | 45,47 | 0,95 → depósito en un exchange | 44,51 |
Indicios: una entrada y dos salidas por transacción; una salida mucho mayor que pronto se gasta en una transacción con la misma estructura; el mismo tipo de script y las mismas huellas de billetera; saltos separados por minutos o bloques. Un estudio de 2023 de Gong, Chow, Yiu y Ting ("Analyzing the Peeling Chain Patterns on the Bitcoin Blockchain") determinó que aproximadamente el 71% de las transacciones de las cadenas que identificó desprendían menos del 1% de la entrada, y que alrededor del 79% de las cadenas se creaban en un día. El remanente transporta la mayor parte del valor, por lo que el analista lo sigue y registra cada desprendimiento como un punto de conversión en efectivo. La forma no es intrínsecamente ilícita: una billetera que paga facturas a partir de un saldo grande, o una billetera caliente que paga retiros uno por uno, presenta el mismo aspecto.
Estratificación, ciclos y motivos
La estratificación, la etapa del lavado de activos que aleja los fondos de su origen, aparece en la cadena como largas cadenas de direcciones nuevas de corta duración, saltos automatizados rápidos, divisiones y reunificaciones, intercambios de activos y movimientos entre cadenas. Ningún salto aislado es sospechoso; lo es la combinación. El recorrido de ida y vuelta es valor que regresa a su nodo, o a otro nodo de la misma parte: un ciclo. Los ciclos cortos pueden inflar el volumen de negociación de un token o NFT (operaciones ficticias), simular un historial de pagos o reciclar fondos a través de un servicio. La detección de ciclos funciona mejor en un grafo de entidades, porque una parte que devuelve fondos a otra dirección propia solo forma un ciclo después de la agrupación.
Un motivo es una forma de subgrafo pequeño que se repite con más frecuencia de la que predice el azar. Un conjunto de datos sintéticos ampliamente utilizado para entrenar modelos de prevención del lavado de activos (Altman y sus colegas, NeurIPS 2023) genera ocho: dispersión, convergencia, convergencia-dispersión, dispersión-convergencia, ciclo, bipartito, pila y aleatorio. En la dispersión-convergencia, un origen divide los fondos entre intermediarios que los reenvían todos a un único destino, añadiendo saltos sin cambiar la titularidad; la convergencia-dispersión consiste en muchos orígenes que convergen en un nodo que dispersa el total, algo típico de una dirección de recaudación de una estafa; una pila consiste en dos capas de intermediarios completamente conectadas entre sí. Las búsquedas de motivos son consultas de patrones en bases de datos de grafos o autouniones con restricciones temporales sobre la lista de aristas. La ventana temporal es el parámetro clave: una dispersión-convergencia en una hora es una señal fuerte; a lo largo de un año es comercio cotidiano.
Señales, no conclusiones
Las aristas son hechos registrados; los roles, patrones y motivos son interpretaciones con explicaciones inocentes. Trate cada uno como una razón para examinar más a fondo, combine señales independientes antes de realizar una inferencia y registre los umbrales utilizados (límites de grado, ventanas temporales, tolerancias de importes) para que otro analista pueda reproducirlos y cuestionarlos.
Enfoque del examen: la diferencia entre los grafos de transacciones, de direcciones y de entidades y para qué sirve cada uno; por qué el grafo de gasto UTXO es exacto mientras que el grafo de direcciones necesita un supuesto de asignación; el cálculo de pesos proporcionales de aristas para una transacción con múltiples entradas y salidas; los atributos que necesita cada arista y por qué las aristas paralelas conservan sus marcas de tiempo; las tres fuentes de aristas del modelo de cuentas y por qué se excluyen las revertidas; la delimitación de un grafo y el tratamiento de los supernodos como puntos de detención; el grado, el ratio de transferencia y el tiempo de retención como indicadores de rol; la centralidad de intermediación en un subgrafo acotado; la convergencia, la dispersión, las cadenas de desprendimiento (y por qué se sigue el remanente), los ciclos y los motivos de dispersión-convergencia como señales que necesitan corroboración y umbrales documentados.