Logo
Nuevos usuarios de RPC: 35% de descuento el primer mesVer oferta
OnFinality Learn
Integración y Desarrollo11 min de lectura

UniWhales y la monitorización on-chain de ballenas: arquitectura, pipelines de datos y requisitos de RPC

Una guía técnica sobre cómo funciona internamente la monitorización de ballenas al estilo UniWhales, desde la ingesta vía RPC y la decodificación de eventos hasta las alertas, además de cómo construir y verificar tu propio pipeline.

TL;DR

UniWhales es una plataforma de analítica DeFi y una DAO con acceso token-gated que monitoriza los movimientos de carteras de ballenas en exchanges descentralizados y los presenta en dashboards y alertas en tiempo real. El problema de ingeniería interesante no es el modelo de membresía, sino el pipeline de datos: cómo los datos brutos de la cadena se convierten en eventos de swap decodificados, atribución de carteras y notificaciones de baja latencia. Este artículo explica ese pipeline como modelo mental, ofrece una implementación ejecutable que puedes adaptar y muestra cómo verificar los resultados y diagnosticar los modos de fallo que hacen que las alertas de ballenas sean incorrectas o tardías. También cubre dónde la calidad del RPC y la infraestructura de nodos determinan si el pipeline es fiable.

Qué es UniWhales y qué cubre esta guía

UniWhales se entiende mejor como dos cosas superpuestas. La primera es un producto de analítica DeFi: un dashboard web y un sistema de alertas que rastrea tokens, direcciones de ballenas y sus movimientos a través de exchanges descentralizados, puentes y mercados de préstamo. La segunda es una comunidad y DAO con acceso token-gated, donde un token de utilidad (UWL) otorga niveles de membresía como Pro y Whale y acceso a la superficie de analítica. Los perfiles públicos lo describen como una comunidad de análisis DeFi que monitoriza los movimientos de posiciones de ballenas en venues como Uniswap, SushiSwap, 1inch y PancakeSwap, y como una de las comunidades token-gated más longevas en cripto.

Esta guía no es un tutorial de membresía ni un resumen de precios o financiación. Se centra en la capa de ingeniería que hace útil a cualquier producto de monitorización de ballenas: cómo se ingieren los datos on-chain, se decodifican, se atribuyen a carteras y se convierten en alertas, y qué propiedades de la infraestructura determinan si esas alertas son correctas y oportunas. Si estás construyendo un dashboard similar, un bot de Telegram o una herramienta de investigación interna, se aplica el mismo pipeline.

El alcance asume que puedes ejecutar código contra un endpoint JSON-RPC de EVM y que tienes una familiaridad básica con logs, eventos y transferencias ERC-20. Donde el artículo necesita un endpoint concreto, utiliza marcadores como RPC_URL en lugar de una URL de proveedor específica.

  • Capa de producto: dashboards, alertas, niveles de membresía, curación comunitaria.
  • Capa de datos: ingesta RPC, decodificación de eventos, atribución de carteras, almacenamiento, alertas.
  • Capa de infraestructura: fiabilidad del nodo, latencia, acceso a archivo, límites de tasa.

Requisitos previos y supuestos

Antes de construir cualquier cosa, sé explícito sobre qué estás monitorizando y por qué. Un rastreador de ballenas que vigila cada transferencia en cada cadena produce ruido; un rastreador que vigila un conjunto curado de direcciones frente a tipos de eventos específicos produce señal. Decide tu universo de direcciones, tus tipos de eventos (swaps, cambios de liquidez, depósitos en puentes, transferencias ERC-20 grandes) y tu objetivo de latencia (segundos frente a minutos).

Necesitarás un endpoint JSON-RPC de EVM que soporte eth_getLogs sobre los rangos de bloques que te interesan, además de eth_blockNumber y eth_getBlockByNumber para el progreso de la cadena. Si necesitas backfill histórico más allá de la ventana reciente, necesitas acceso con capacidad de archivo. Para un sistema de alertas en producción también querrás una ruta websocket o de suscripción, o un bucle de polling ajustado al tiempo de bloque.

Por último, decide de dónde viene el endpoint. Este artículo se mantiene centrado en la metodología; para la elección concreta de endpoint y proveedor, usa la guía del RPC Assistant sobre endpoints RPC multicadena y compara planes en la página de precios de RPC.

Modelo mental: de bloques a alertas de ballenas

Piensa en el pipeline como cinco etapas. La ingesta extrae nuevos bloques y logs. La decodificación convierte los logs brutos en eventos tipados (un swap, una adición de liquidez, un depósito en puente). La atribución mapea esos eventos a carteras etiquetadas. El enriquecimiento añade contexto como metadatos de token, valor en USD y venue. La entrega envía el resultado a un dashboard, una base de datos o una alerta de chat.

La idea crítica es que la mayoría de las alertas incorrectas de ballenas provienen de las etapas dos y tres, no del nodo. Un evento de swap decodificado con el ABI incorrecto produce cantidades sin sentido. Una cartera etiquetada como ballena por una única transferencia grande puede ser en realidad un contrato de puente o una hot wallet de exchange. La atribución es donde los productos de analítica se ganan su reputación, y es donde deberías invertir la mayor parte de tu esfuerzo de ingeniería.

La latencia es un eje separado. Un pipeline puede ser perfectamente correcto y aun así inútil si entrega una alerta diez minutos después de la operación. La latencia está dominada por el intervalo de polling, el tiempo de respuesta del RPC y tu propia cola de procesamiento, en ese orden.

  • Ingesta: obtención de bloques y logs.
  • Decodificación: parseo de eventos guiado por ABI.
  • Atribución: etiquetado de direcciones y resolución de entidades.
  • Enriquecimiento: precios, metadatos de tokens, contexto de venue.
  • Entrega: almacenamiento, dashboards, alertas.

Ingesta ejecutable: obtener logs de swaps con curl

La forma más sencilla de ver la materia prima es consultar logs de un topic de evento conocido en un rango de bloques. El fragmento siguiente obtiene logs para un topic que tú proporcionas, que normalmente establecerías al hash keccak256 de la firma del evento Swap del DEX que estás rastreando. Reemplaza RPC_URL, TOPIC0 y el rango de bloques con valores apropiados para tu cadena y venue.

Mantén rangos de bloques modestos en endpoints públicos; muchos proveedores limitan el número de bloques o resultados por llamada a eth_getLogs. Si recibes un error de rango, divide la consulta en lugar de asumir que el endpoint está roto.

curl -s RPC_URL \
  -H 'Content-Type: application/json' \
  -d '{
    "jsonrpc": "2.0",
    "id": 1,
    "method": "eth_getLogs",
    "params": [{
      "fromBlock": "0x1300000",
      "toBlock": "0x1300064",
      "topics": ["TOPIC0"]
    }]
  }'

Decodificación y atribución en Python

Una vez que tengas los logs, decodifícalos contra el ABI correcto y atribuye el emisor. El ejemplo siguiente usa web3.py para leer un log de estilo transferencia e imprimir los campos from/to/value. Es intencionadamente genérico: los eventos de swap de diferentes forks de DEX tienen órdenes de campos distintos, así que debes confirmar el ABI de cada venue en lugar de asumir un único diseño.

La atribución se muestra como una simple búsqueda de etiquetas. En la práctica mantendrías un registro curado de direcciones, lo actualizarías desde fuentes públicas de etiquetas y marcarías las direcciones que se comportan como contratos (por ejemplo, las que emiten logs pero nunca inician transacciones) para que no se confundan con ballenas.

from web3 import Web3

w3 = Web3(Web3.HTTPProvider("RPC_URL"))

LABELS = {
    "0x0000000000000000000000000000000000000000": "burn",
    # add curated whale, exchange, and bridge labels here
}

def decode_transfer(log):
    topics = log["topics"]
    data = log["data"]
    from_addr = "0x" + topics[1].hex()[-40:]
    to_addr = "0x" + topics[2].hex()[-40:]
    value = int(data, 16) if isinstance(data, str) else int.from_bytes(data, "big")
    return from_addr, to_addr, value

def label(addr):
    return LABELS.get(addr.lower(), "unlabeled")

latest = w3.eth.block_number
logs = w3.eth.get_logs({
    "fromBlock": latest - 50,
    "toBlock": latest,
    "topics": ["TOPIC0"],
})

for log in logs:
    frm, to, value = decode_transfer(log)
    print(f"{label(frm)} -> {label(to)} value={value}")

Verificación: confirmar que tu pipeline es correcto

Antes de confiar en cualquier alerta, verifica el pipeline contra la verdad fundamental. Elige un conjunto pequeño de transacciones que puedas inspeccionar manualmente en un explorador de bloques, pásalas por tu decodificador y compara las cantidades y direcciones decodificadas con lo que muestra el explorador. Si difieren, el ABI o el filtro de topics es incorrecto.

Una tabla de verificación útil registra, para cada transacción de prueba, el emisor, receptor y cantidad esperados, y los valores que produjo tu pipeline. No rellenes los números medidos de memoria; ejecuta el pipeline y registra la salida real. La tabla siguiente es una plantilla que completas con tus propias ejecuciones.

Tx de pruebaFrom esperadoTo esperadoValor esperadoFrom del pipelineTo del pipelineValor del pipelineCoincide
tx A
tx B
tx C

Una segunda verificación comprueba la latencia. Registra el momento en que un bloque está disponible en tu nodo y el momento en que se dispara tu alerta. La diferencia es tu retardo de extremo a extremo. Rastréalo durante un día en lugar de una sola muestra, porque la latencia del RPC es irregular.

Solución de problemas: modos de fallo comunes

La mayoría de los problemas caen en unas pocas categorías reconocibles. Los eventos faltantes suelen indicar un problema con el filtro de topics o el rango de bloques. Las cantidades incorrectas suelen indicar un desajuste de ABI o de decimales. Las alertas duplicadas suelen indicar que tu cursor no se persiste entre reinicios. Las alertas tardías suelen indicar que el polling es demasiado lento o que tu cola se está saturando.

Si eth_getLogs devuelve un error de rango, reduce el intervalo de bloques. Si devuelve resultados vacíos para un rango que sabes que contiene actividad, confirma el hash del topic y que estás consultando la cadena correcta. Si los resultados son inconsistentes entre ejecuciones, comprueba si estás accediendo a un endpoint con balanceo de carga donde distintos backends están en alturas diferentes; un nodo dedicado elimina esa variable, como se describe en la descripción general de nodos dedicados.

  • Logs vacíos: topic incorrecto, cadena incorrecta o rango demasiado estrecho.
  • Valores incorrectos: desajuste de ABI o decimales del token no aplicados.
  • Duplicados: cursor no persistido; reprocesamiento al reiniciar.
  • Alertas tardías: intervalo de polling demasiado largo o saturación de la cola.
  • Alturas inconsistentes: backends con balanceo de carga desincronizados.

Compensaciones de infraestructura: RPC público, compartido y dedicado

Los endpoints públicos sirven para explorar pero no son adecuados para alertas. Limitan la tasa de forma agresiva, puede que no soporten consultas de logs amplias y no ofrecen garantías de latencia. Los endpoints de proveedores compartidos mejoran la fiabilidad y los límites de tasa, pero siguen compartiendo capacidad con otros inquilinos. Los nodos dedicados te dan throughput predecible y una cabeza de cadena consistente, lo cual importa cuando la promesa de tu producto es tiempo real.

La compensación es coste y sobrecarga operativa. Un producto de monitorización de ballenas que alerta sobre swaps en varias cadenas necesita acceso consistente en cada cadena, y el coste escala con el número de cadenas y el volumen de consultas. Para una metodología sobre cómo elegir entre estos niveles, consulta la guía de hosting de nodos blockchain. Para consideraciones específicas de endpoints por cadena, el directorio de redes enumera lo disponible.

Una regla práctica: si tu objetivo de latencia de alerta es inferior a unos pocos segundos, presupuesta acceso dedicado o de nivel alto en las cadenas donde alertas, y usa acceso compartido para backfill y consultas de investigación.

Limitaciones y qué no pueden decirte los datos de ballenas

La monitorización de ballenas observa transacciones, no intenciones. Una transferencia grande puede ser una venta, un movimiento de colateral, un reajuste interno de tesorería o un salto entre puentes. Las etiquetas de atribución son heurísticas y pueden estar desactualizadas. El clustering de direcciones puede fusionar entidades distintas o dividir una entidad en muchas direcciones.

La actividad multicadena agrava el problema. Una posición abierta en una cadena y cubierta en otra parece dos eventos no relacionados a menos que los unas por entidad. Cualquier producto que presente los movimientos de ballenas como una señal limpia está comprimiendo mucha incertidumbre en una alerta simple.

Trata las alertas de ballenas como una entrada entre varias. Combínalas con liquidez del venue, tasas de financiación y tus propios límites de riesgo en lugar de actuar sobre una única notificación.

Próximos pasos: construir y operar tu pipeline

Empieza con una cadena y un venue. Consigue que la ingesta, la decodificación y la atribución sean correctas en un conjunto pequeño de direcciones, verifica contra un explorador de bloques y luego expande. Persiste tu cursor para que los reinicios no dupliquen alertas. Añade seguimiento de latencia antes de añadir más cadenas.

Cuando estés listo para pasar a producción, elige los endpoints deliberadamente. La descripción general del servicio de API explica cómo se estructura el acceso gestionado, y el RPC Assistant puede ayudarte a elegir un endpoint concreto para tu cadena y carga de trabajo. Si estás comparando enfoques para un despliegue multicadena, la guía de RPC multicadena cubre los patrones operativos.

Por último, documenta tu registro de etiquetas y revísalo periódicamente. La calidad de un rastreador de ballenas está limitada por la calidad de su atribución, y eso es un compromiso de mantenimiento, no una configuración única.

Nunca te preocupes por la infraestructura nuevamente

OnFinality elimina la carga pesada de DevOps para que puedas construir de forma más inteligente y rápida.

Comenzar