Esta guía explica cómo usar el WebSocket RPC de Monad para la transmisión de datos en tiempo real. Cubre endpoints WSS, métodos de suscripción eth_subscribe, payloads de notificación y proporciona un ejemplo ejecutable en Node.js con lógica de reconexión. También incluye consejos para solucionar problemas comunes como caídas de conexión y suscripciones de alto volumen.
Respuesta Directa: Cómo Obtener Datos en Tiempo Real de Monad vía WebSocket
Para obtener datos en tiempo real de Monad, te conectas a un endpoint RPC WebSocket (wss://) y usas el método estándar de Ethereum JSON-RPC eth_subscribe para suscribirte a eventos como nuevos bloques, logs y transacciones pendientes. Monad es una L1 compatible con EVM con ejecución paralela y tiempos de bloque de menos de un segundo, por lo que su interfaz WebSocket sigue la especificación de Ethereum pero con mayor frecuencia de eventos. Esta guía te lleva a través de la superficie de endpoints, métodos de suscripción, formatos de notificación y cómo construir un cliente resiliente que maneje reconexiones y notificaciones duplicadas.
La documentación oficial de Monad proporciona una sección dedicada sobre Eventos de Ejecución y Configuración de WebSocket y una página de Fuentes de Datos en Tiempo Real, que son las referencias principales para esta guía. Para endpoints y límites específicos del proveedor, consulta siempre la documentación de tu proveedor; notaremos dónde el comportamiento está documentado por Monad versus dónde varía según el proveedor.
- Monad soporta métodos estándar de
eth_subscribe:newHeads,logs,newPendingTransactionsysyncing. - Los endpoints públicos pueden tener límites de conexión y tiempos de espera de inactividad; usa un proveedor con soporte WebSocket dedicado para producción.
- Los tiempos de bloque de menos de un segundo de Monad significan que las notificaciones llegan más rápido que en Ethereum, así que diseña tu cliente para manejar alto rendimiento.
Superficie de Endpoints WebSocket RPC de Monad
Monad expone endpoints RPC WebSocket en URLs wss://, similar a Ethereum. El endpoint exacto depende de tu proveedor de nodos. Por ejemplo, un endpoint público podría ser wss://rpc.monad.xyz (consulta los docs de Monad para el endpoint público actual), mientras que proveedores como Chainstack, QuickNode o Dwellir ofrecen sus propias URLs WSS. Usa siempre el esquema wss:// para conexiones cifradas; ws:// rara vez es soportado en endpoints públicos.
La documentación de Monad lista los métodos JSON-RPC soportados y nota diferencias con Ethereum, como etiquetas de bloque y límites. Para WebSocket, los métodos clave son eth_subscribe y eth_unsubscribe. Los tipos de suscripción son los mismos que en Ethereum: newHeads, logs, newPendingTransactions y syncing. Monad también proporciona una suscripción personalizada executionEvents para el seguimiento de estado en tiempo real, como se describe en la página de Eventos de Ejecución y Configuración de WebSocket.
Al elegir un endpoint, considera que los endpoints públicos a menudo tienen límites de tasa y pueden cerrar conexiones inactivas. Para producción, usa un proveedor que ofrezca conexiones WebSocket dedicadas con límites más altos. Las páginas de servicio de API y precios de RPC de OnFinality proporcionan detalles sobre endpoints gestionados.
- Usa siempre
wss://para conexiones WebSocket seguras. - Consulta la documentación de tu proveedor para la URL WSS exacta y cualquier límite de conexión.
- El endpoint público de Monad puede ser adecuado para pruebas pero no para producción de alto volumen.
Entendiendo eth_subscribe y los Payloads de Notificación
El método eth_subscribe envía una solicitud de suscripción y recibe un ID de suscripción. Las notificaciones se envían como respuestas JSON-RPC con el método eth_subscription. El payload para newHeads incluye el objeto de cabecera de bloque, que contiene campos como number, hash, parentHash, timestamp y transactionsRoot. Para logs, el payload incluye el objeto de log con address, topics, data, blockNumber, transactionHash y logIndex.
Los tiempos de bloque de menos de un segundo de Monad significan que las notificaciones newHeads llegan mucho más frecuentemente que en Ethereum (que tiene bloques de ~12 segundos). Esto puede ser un desafío para clientes que procesan cada bloque, así que considera filtrar o agrupar. Para logs, puedes especificar un filtro de address y topics para reducir el volumen de notificaciones.
Aquí hay un ejemplo de un payload de notificación newHeads:
{
"jsonrpc": "2.0",
"method": "eth_subscription",
"params": {
"subscription": "0x1234567890abcdef",
"result": {
"number": "0x1b4",
"hash": "0x...",
"parentHash": "0x...",
"timestamp": "0x...",
"transactionsRoot": "0x..."
}
}
}
Para logs, el payload incluye la entrada de log. Puedes suscribirte a logs para una dirección de contrato específica y topics para filtrar eventos relevantes.
newHeadsenvía una cabecera de bloque para cada nuevo bloque.logsenvía logs que coinciden con los criterios del filtro.newPendingTransactionsenvía hashes de transacciones para transacciones pendientes.syncingenvía cambios de estado de sincronización.
Ejemplo Ejecutable: Suscripción y Reconexión con ethers.js
A continuación se muestra un script completo y autónomo de Node.js usando ethers.js para conectarse a un endpoint WebSocket de Monad, suscribirse a nuevos bloques y logs, y manejar reconexiones con resuscripción. El script usa un bucle de reconexión simple que se resuscribe a los mismos filtros después de una caída de conexión. También demuestra el manejo idempotente de notificaciones duplicadas mediante el seguimiento del último número de bloque visto.
Para ejecutar esto, instala ethers.js (npm install ethers) y establece la variable de entorno MONAD_WSS_URL a tu endpoint. El script registra cada notificación y demuestra cómo manejar notificaciones duplicadas rastreando el último número de bloque visto.
Salida esperada: El script registrará los IDs de suscripción, luego imprimirá notificaciones de nuevos bloques con número y hash, y notificaciones de logs a medida que lleguen. Las notificaciones duplicadas (por ejemplo, después de una reconexión) se filtran mediante la verificación de lastBlockNumber. Para probar, ejecuta el script y observa la consola. Deberías ver una notificación de nuevo bloque cada pocos segundos (el tiempo de bloque de Monad es de menos de un segundo, así que espera notificaciones rápidas). Si la conexión se cae, el script se reconecta y se resuscribe automáticamente.
- El script usa
provider.sendpara llamar aeth_subscribedirectamente, lo que funciona con ethers.js v6. - La lógica de reconexión es simple: en 'disconnected', reconectar después de un retraso y resuscribirse.
- Las notificaciones duplicadas se manejan rastreando el último número de bloque para newHeads.
const { WebSocketProvider } = require('ethers');
const WSS_URL = process.env.MONAD_WSS_URL || 'wss://rpc.monad.xyz';
async function main() {
let provider;
let lastBlockNumber = 0;
async function connect() {
console.log('Connecting to', WSS_URL);
provider = new WebSocketProvider(WSS_URL);
provider.on('error', (err) => {
console.error('WebSocket error:', err);
});
provider.on('disconnected', () => {
console.log('Disconnected. Reconnecting in 5s...');
setTimeout(connect, 5000);
});
// Subscribe to new heads
const headSub = await provider.send('eth_subscribe', ['newHeads']);
console.log('Subscribed to newHeads with id:', headSub);
// Subscribe to logs (example: all logs, adjust filter as needed)
const logSub = await provider.send('eth_subscribe', ['logs', {}]);
console.log('Subscribed to logs with id:', logSub);
// Handle notifications
provider.on('message', (message) => {
const parsed = JSON.parse(message);
if (parsed.method === 'eth_subscription') {
const { subscription, result } = parsed.params;
if (subscription === headSub) {
const blockNum = parseInt(result.number, 16);
if (blockNum > lastBlockNumber) {
lastBlockNumber = blockNum;
console.log('New head:', result.number, result.hash);
} else {
console.log('Duplicate head notification ignored:', result.number);
}
} else if (subscription === logSub) {
console.log('New log:', result.address, result.topics);
}
}
});
}
await connect();
}
main().catch(console.error);Fallos Comunes y Lista de Verificación de Solución de Problemas
Las conexiones WebSocket a Monad pueden fallar por varias razones. Aquí hay problemas comunes y cómo solucionarlos:
Exceso de suscripciones: Algunos proveedores limitan el número de suscripciones activas por conexión. Si excedes el límite, puedes obtener un error. Reduce el número de suscripciones o usa múltiples conexiones.
Límites de conexión por IP: Los endpoints públicos a menudo limitan las conexiones por IP. Si alcanzas el límite, serás desconectado. Usa un proveedor con límites más altos o rota IPs.
Retraso en la cabeza del bloque: Si tu cliente procesa notificaciones lentamente, puede quedarse atrás de la cabeza de la cadena. Esto es más probable en Monad debido a los rápidos tiempos de bloque. Optimiza tu procesamiento o usa una máquina más potente.
Tiempos de espera de inactividad: Muchos proveedores cierran conexiones inactivas después de un período. Envía un ping o mensaje de keepalive periódicamente para mantener la conexión viva.
Tormentas de reconexión: Si el endpoint está temporalmente caído, tu cliente puede reconectarse demasiado agresivamente. Usa backoff exponencial con jitter.
Notificaciones duplicadas: Después de una reconexión, puedes recibir notificaciones para bloques que ya procesaste. Usa procesamiento idempotente (por ejemplo, rastrea el último bloque procesado).
- Consulta la documentación de tu proveedor para límites de suscripción y conexión.
- Implementa un heartbeat (por ejemplo, enviar un ping cada 30 segundos) para prevenir tiempos de espera de inactividad.
- Usa backoff exponencial para intentos de reconexión.
- Diseña tu procesamiento de eventos para que sea idempotente para manejar duplicados.
Compensaciones y Limitaciones del WebSocket RPC de Monad
Los rápidos tiempos de bloque de Monad son una espada de doble filo: proporcionan datos de baja latencia pero también aumentan el volumen de notificaciones. Esto puede sobrecargar a los clientes y redes. Considera las siguientes compensaciones:
Rendimiento vs. costo: Las suscripciones de alta frecuencia consumen más ancho de banda y pueden incurrir en costos más altos en proveedores gestionados. Usa filtros para reducir el volumen de datos.
Finalidad vs. cabeza: Monad usa consenso MonadBFT con tiempos de bloque de menos de un segundo, pero la finalidad puede retrasarse respecto a la cabeza. Si necesitas datos finalizados, suscríbete a newHeads y verifica la finalidad usando etiquetas de bloque como finalized.
Ejecución paralela: La ejecución paralela de Monad significa que las transacciones se incluyen en bloques de manera diferente a Ethereum. Esto no afecta directamente las suscripciones WebSocket, pero puede afectar cómo interpretas logs y recibos de transacción.
Límites específicos del proveedor: Cada proveedor tiene sus propios límites de tasa, límites de conexión y precios. Siempre revisa la documentación de tu proveedor. La guía de OnFinality sobre límites de tasa y 429s de Monad RPC cubre problemas comunes de límites de tasa.
Los endpoints públicos no son para producción: Los endpoints públicos a menudo tienen límites de tasa y pueden ser poco confiables. Para producción, usa un proveedor dedicado o ejecuta tu propio nodo.
- Usa filtros de logs para reducir el volumen de notificaciones.
- Considera suscribirte a bloques
finalizedpara aplicaciones críticas. - Monitorea tu ancho de banda y ajusta la frecuencia de suscripción.
- Para producción, usa un proveedor gestionado como el servicio de API de OnFinality.
Próximos Pasos y Lecturas Adicionales
Ahora que entiendes el WebSocket RPC de Monad, puedes construir aplicaciones en tiempo real con confianza. Aquí hay algunos próximos pasos:
Explora la documentación oficial de Monad sobre Eventos de Ejecución y Configuración de WebSocket para tipos de suscripción avanzados como executionEvents.
Revisa los endpoints RPC de Monad de OnFinality para una lista de endpoints disponibles y sus características.
Aprende sobre tiempos de espera y reintentos de Monad RPC para manejar problemas de red con gracia.
Entiende los límites de tasa y 429s de Monad RPC para evitar alcanzar límites.
Consulta el centro de aprendizaje de OnFinality para más guías sobre Monad y otras redes.
Si estás construyendo en Monad, considera usar el servicio de API de OnFinality para acceso RPC confiable y escalable.
- Prueba tu cliente WebSocket con un endpoint público primero, luego muévete a un proveedor.
- Implementa manejo robusto de errores y lógica de reconexión.
- Monitorea la salud de tu suscripción con métricas.