Saltar al contenido principal

Uso de WebSockets

Alchemy
websockets
consultas
JavaScript
Principiante
Elan Halpern
1 de diciembre de 2020
6 minutos de lectura

Esta es una guía de nivel básico para usar WebSockets y Alchemy para hacer solicitudes a la cadena de bloques de Ethereum.

 (opens in a new tab)WebSockets vs. HTTP

A diferencia de HTTP, con WebSockets no necesitas hacer solicitudes continuamente cuando quieres información específica. Los WebSockets mantienen una conexión de red por ti (si se hace correctamente) y escuchan los cambios.

Al igual que con cualquier conexión de red, no debes asumir que un WebSocket permanecerá abierto para siempre sin interrupciones, pero manejar correctamente las conexiones caídas y la reconexión manual puede ser un desafío. Otra desventaja de los WebSockets es que no obtienes códigos de estado HTTP en la respuesta, sino solo el mensaje de error.

Alchemy Web3 (opens in a new tab) añade automáticamente el manejo de fallos y reintentos de WebSocket sin necesidad de configuración.

Pruébalo

La forma más fácil de probar los WebSockets es instalar una herramienta de línea de comandos para hacer solicitudes WebSocket, como wscat (opens in a new tab). Usando wscat, puedes enviar solicitudes de la siguiente manera:

Nota: si tienes una cuenta de Alchemy, puedes reemplazar demo con tu propia clave API. ¡Regístrate para obtener una cuenta gratuita de Alchemy aquí! (opens in a new tab)

wscat -c wss://eth-mainnet.ws.alchemyapi.io/ws/demo

>  {"jsonrpc":  "2.0", "id": 0, "method":  "eth_gasPrice"}

<  {"jsonrpc":  "2.0", "result":  "0xb2d05e00", "id": 0}

Cómo usar WebSockets

Para empezar, abre un WebSocket usando la URL de WebSocket para tu aplicación. Puedes encontrar la URL de WebSocket de tu aplicación abriendo la página de la aplicación en tu panel de control (opens in a new tab) y haciendo clic en "View Key" (Ver clave). Ten en cuenta que la URL de tu aplicación para WebSockets es diferente de su URL para solicitudes HTTP, pero ambas se pueden encontrar haciendo clic en "View Key".

Where to find your WebSocket URL in your Alchemy dashboard

Cualquiera de las API enumeradas en la Referencia de la API de Alchemy (opens in a new tab) se puede usar a través de WebSocket. Para hacerlo, usa la misma carga útil (payload) que se enviaría como el cuerpo de una solicitud HTTP POST, pero en su lugar envía esa carga útil a través del WebSocket.

Con Web3

La transición a WebSockets mientras se usa una biblioteca cliente como Web3 es sencilla. Simplemente pasa la URL de WebSocket en lugar de la HTTP al instanciar tu cliente Web3. Por ejemplo:

const web3 = new Web3("wss://eth-mainnet.ws.alchemyapi.io/ws/your-api-key")

web3.eth.getBlockNumber().then(console.log) // -> 7946893

API de suscripción

Cuando te conectas a través de un WebSocket, puedes usar dos métodos adicionales: eth_subscribe y eth_unsubscribe. Estos métodos te permitirán escuchar eventos particulares y recibir notificaciones de inmediato.

eth_subscribe

Crea una nueva suscripción para los eventos especificados. Más información sobre eth_subscribe (opens in a new tab).

Parámetros

  1. Tipos de suscripción
  2. Parámetros opcionales

El primer argumento especifica el tipo de evento a escuchar. El segundo argumento contiene opciones adicionales que dependen del primer argumento. Los diferentes tipos de descripción, sus opciones y las cargas útiles de sus eventos se describen a continuación.

Devuelve

El ID de suscripción: este ID se adjuntará a cualquier evento recibido y también se puede usar para cancelar la suscripción mediante eth_unsubscribe.

Eventos de suscripción

Mientras la suscripción esté activa, recibirás eventos que son objetos con los siguientes campos:

  • jsonrpc: Siempre "2.0"
  • method: Siempre "eth_subscription"
  • params: Un objeto con los siguientes campos:
    • subscription: El ID de suscripción devuelto por la llamada eth_subscribe que creó esta suscripción.
    • result: Un objeto cuyo contenido varía según el tipo de suscripción.

Tipos de suscripción

  1. alchemy_newFullPendingTransactions

Devuelve la información de la transacción para todas las transacciones que se añaden al estado pendiente. Este tipo de suscripción se suscribe a transacciones pendientes, de forma similar a la llamada estándar de Web3 web3.eth.subscribe("pendingTransactions"), pero difiere en que emite información completa de la transacción en lugar de solo los hashes de la transacción.

Ejemplo:

  1. newHeads

Emite un evento cada vez que se añade un nuevo encabezado a la cadena, incluso durante una reorganización de la cadena.

Cuando ocurre una reorganización de la cadena, esta suscripción emitirá un evento que contiene todos los nuevos encabezados para la nueva cadena. En particular, esto significa que puedes ver múltiples encabezados emitidos con la misma altura, y cuando esto sucede, el último encabezado debe tomarse como el correcto después de una reorganización.

Ejemplo:

  1. logs

Emite registros (logs) que forman parte de bloques recién añadidos que coinciden con los criterios de filtro especificados.

Cuando ocurre una reorganización de la cadena, los registros que forman parte de los bloques en la cadena antigua se emitirán nuevamente con la propiedad removed establecida en true. Además, se emiten los registros que forman parte de los bloques en la nueva cadena, lo que significa que es posible ver registros para la misma transacción varias veces en el caso de una reorganización.

Parámetros

  1. Un objeto con los siguientes campos:
    • address (opcional): ya sea una cadena de texto que representa una dirección o una matriz (array) de dichas cadenas.
      • Solo se emitirán los registros creados desde una de estas direcciones.
    • topics: una matriz de especificadores de temas (topics).
      • Cada especificador de tema es null, una cadena de texto que representa un tema o una matriz de cadenas.
      • Cada posición en la matriz que no es null restringe los registros emitidos solo a aquellos que tienen uno de los temas dados en esa posición.

Algunos ejemplos de especificaciones de temas:

  • []: Se permite cualquier tema.
  • [A]: A en la primera posición (y cualquier cosa después).
  • [null, B]: Cualquier cosa en la primera posición y B en la segunda posición (y cualquier cosa después).
  • [A, B]: A en la primera posición y B en la segunda posición (y cualquier cosa después).
  • [[A, B], [A, B]]: (A o B) en la primera posición y (A o B) en la segunda posición (y cualquier cosa después).

Ejemplo:

eth_unsubscribe

Cancela una suscripción existente para que no se envíen más eventos.

Parámetros

  1. ID de suscripción, como se devolvió previamente de una llamada a eth_subscribe.

Devuelve

true si una suscripción se canceló correctamente, o false si no existía ninguna suscripción con el ID dado.

Ejemplo:

Solicitud

curl https://eth-mainnet.alchemyapi.io/v2/your-api-key
-X POST
-H "Content-Type: application/json"
-d '{"id": 1, "method": "eth_unsubscribe", "params": ["0x9cef478923ff08bf67fde6c64013158d"]}'

Resultado

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": true
}

Regístrate en Alchemy (opens in a new tab) de forma gratuita, echa un vistazo a nuestra documentación (opens in a new tab) y, para conocer las últimas noticias, síguenos en Twitter (opens in a new tab).