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
2. Estrategias de monitorización
Existen dos aproximaciones principales:
- P2P Listening: conectar directamente a un nodo y escuchar eventos a través de librerías como ethers.js o web3.js.
- 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.
Deja una respuesta