Cómo programar notificaciones de on-chain events

Cómo programar notificaciones de on-chain events

Publicado el 20/06/2024

Introducción

En el mundo de las aplicaciones blockchain, resulta fundamental reaccionar ante eventos que tienen lugar on-chain: transferencias de tokens, cambios de estado en contratos inteligentes, subidas de oráculo, entre otros. En este artículo exploraremos de forma detallada cómo monitorizar esos eventos y enviar notificaciones en tiempo real a diversos canales (email, Telegram, Discord, Slack, SMS).

1. Requisitos previos

  • Node.js >= v14
  • npm o yarn
  • Cuenta en un proveedor de nodos: Alchemy / Infura / Moralis
  • Clave API para notificaciones (Mailgun, Twilio, Discord webhooks, Telegram Bot API)
  • Contrato inteligente con ABI y dirección desplegada

2. Estrategias de monitorización

Existen dos aproximaciones principales:

  1. P2P Listening: conectar directamente a un nodo y escuchar eventos a través de librerías como ethers.js o web3.js.
  2. Webhooks de proveedor: usar servicios gestionados (ej. Alchemy Notify, Infura Webhooks) que envían notificaciones HTTP cuando ocurre un evento.

3. Comparativa de proveedores

Proveedor Webhooks Coste Latencia típica
Alchemy Sí (Notify) Gratis / Planes PRO ~1 s
Infura Sí Gratis / Planes PRO ~2 s
Moralis Sí Planes comerciales ~1 s

4. Implementación paso a paso con ethers.js

4.1. Inicializar proyecto

// Terminal
mkdir onchain-notifier  cd onchain-notifier
npm init -y
npm install ethers dotenv nodemailer axios
    

4.2. Configuración de variables de entorno (.env)

RPC_URL=https://eth-mainnet.alchemyapi.io/v2/tuAPIkey
PRIVATE_KEY=0xTU_LLAVE_PRIVADA
EMAIL_USER=usuario@dominio.com
EMAIL_PASS=tuPassword
    

4.3. Código para escuchar eventos

// notifier.js
require(dotenv).config()
const { ethers } = require(ethers)
const nodemailer = require(nodemailer)

const provider = new ethers.providers.JsonRpcProvider(process.env.RPC_URL)
const abi = [ event Transfer(address indexed from, address indexed to, uint256 value) ]
const contractAddress = 0x... // Dirección del contrato
const contract = new ethers.Contract(contractAddress, abi, provider)

const mailer = nodemailer.createTransport({
  service: gmail,
  auth: {
    user: process.env.EMAIL_USER,
    pass: process.env.EMAIL_PASS
  }
})

contract.on(Transfer, async (from, to, value, event) => {
  console.log(Transferencia de {ethers.utils.formatUnits(value, 18)} tokens de {from} a {to})
  // Enviar notificación por email
  await mailer.sendMail({
    from: OnChain Notifier ,
    to: destinatario@dominio.com,
    subject: Evento Transfer detectado,
    text: Se transfirieron {ethers.utils.formatUnits(value, 18)} tokens de {from} a {to}
  })
})
    

4.4. Ejecución

Para iniciar el listener, ejecuta:

node notifier.js
    

5. Notificaciones a otros canales

  • Telegram: usar la librería node-telegram-bot-api y enviar mensajes al chat del bot.
  • Discord: configurar un Webhook y lanzar peticiones POST con axios.
  • Slack: crear un Incoming Webhook e integrar con axios o @slack/web-api.
  • SMS: Twilio con su SDK oficial (npm install twilio).

6. Buenas prácticas y consideraciones

  • Manejo de errores: implementar reintentos exponenciales al conectar al proveedor.
  • Idempotencia: evitar notificar duplicados, guardar event.log.transactionHash en base de datos.
  • Seguridad: nunca exponer claves privadas usar servicios secretos de nube.
  • Escalabilidad: si muchas suscripciones concurrentes, considerar particionar listeners o usar colas (RabbitMQ, Kafka).
  • Coste de requests: monitorizar el uso de RPC para no exceder límites de plan.

7. Conclusión

Programar notificaciones de eventos on-chain te permite construir aplicaciones reactivas y enriquecidas. Tanto si eliges escuchar directamente un nodo con ethers.js o webhooks gestionados, el flujo general es el mismo: definir el evento, conectarte al proveedor, procesar la información y disparar alertas. Siguiendo las buenas prácticas y optimizando el coste, tendrás un sistema robusto y en tiempo real.

Referencias


Comentarios

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *