Ir al contenido principal

Uso de WebSockets

Alchemy
websockets
consultar
JavaScript
Principiante
Elan Halpern
1 de diciembre de 2020
6 minuto leído

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

opens in a new tabWebSockets vs. HTTP

A diferencia de HTTP, con WebSockets no necesita hacer solicitudes continuamente cuando quiere información específica. Los WebSockets mantienen una red de conexión para usted (si se hace correctamente) y escuchan para hacer cambios.

Como con cualquier conexión de red, no debe asumir que un WebSocket permanecerá abierto para siempre sin interrupción, pero el manejo correcto de las conexiones caídas y la reconexión a mano puede ser complicado. Otra desventaja de los WebSockets es que no se obtienen códigos de estado HTTP en la respuesta, sino solo el mensaje de error.

Alchemy Web3opens in a new tab agrega automáticamente el manejo de errores y reintentos de WebSocket sin necesidad de configuración.

Pruébelo

La forma más sencilla de probar WebSockets es instalar una herramienta de línea de comandos para realizar solicitudes WebSocket como wscatopens in a new tab. Usando Wsact, puede enviar solicitudes así:

Nota: si tiene una cuenta de Alchemy puede reemplazar demo por su propia clave de API. ¡Regístrese para obtener una cuenta gratuita de Alchemy aquí!opens in a new tab

1wscat -c wss://eth-mainnet.ws.alchemyapi.io/ws/demo
2
3> {"jsonrpc": "2.0", "id": 0, "method": "eth_gasPrice"}
4
5< {"jsonrpc": "2.0", "result": "0xb2d05e00", "id": 0}
6

Cómo usar WebSockets

Para comenzar, abra un WebSocket usando la URL de WebSocket para su aplicación. Puede encontrar la URL de WebSocket de su aplicación abriendo la página de la app en su panel de controlopens in a new tab y haciendo clic en "View Key". Tenga en cuenta que la URL de su aplicación para WebSockets es diferente de su URL para solicitudes HTTP, pero ambas se pueden ver haciendo clic en "View Key".

Dónde encontrar la URL de su WebSocket en el panel de Alchemy

Cualquiera de las APIs listadas en la Referencia de API de Alchemyopens in a new tab puede utilizarse vía WebSocket. Para ello, utilice la misma carga útil que se enviaría como el cuerpo de una solicitud HTTP POST, pero en su lugar envíe esa carga a través del WebSocket.

Con Web3

Hacer la transición a WebSockts mientras se usa una biblioteca de clientes como Web3 es simple. Simplemente pase la URL de WebSocket en lugar de la URL HTTP cuando instancie su cliente Web3. Por ejemplo:

1const web3 = new Web3("wss://eth-mainnet.ws.alchemyapi.io/ws/your-api-key")
2
3web3.eth.getBlockNumber().then(console.log) // -> 7946893

API de suscripción

Cuando está conectado mediante un WebSocket, puede usar dos métodos adicionales: eth_subscribe y eth_unsubscribe. Estos métodos le permitirán escuchar eventos particulares y ser notificado inmediatamente.

eth_subscribe

Crea una nueva subscripción para eventos específicos. Más información sobre eth_subscribeopens in a new tab.

Parámetros

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

El primer argumento específica el tipo de evento para el que se escuchará. El segundo argumento contiene opciones adicionales que dependen del primer argumento. Los diferentes tipos de descripciones, sus opciones y sus cargas útiles de eventos se describen a continuación.

Devuelve

El ID de la suscripción: Este ID se adjuntará a cualquiera de los eventos recibidos y también puede utilizarse para cancelar la suscripción con eth_unsubscribe.

Eventos de suscripción

Mientras la suscripción esté activa, recibirá 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 retornado 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 transacción para todas las transacciones que se agregan al estado pendiente. Este tipo de suscripción se suscribe a transacciones pendientes, similar al llamado estándar en Web3 web3.eth.subscribe("pendingTransactions"), pero se diferencia en que emite toda la información de la transacción en vez de solo los hashes de las transacciones.

Ejemplo:

1> {"jsonrpc": "2.0", "id": 1, "method": "eth_subscribe", "params": ["alchemy_newFullPendingTransactions"]}
2
3< {"id":1,"result":"0x9a52eeddc2b289f985c0e23a7d8427c8","jsonrpc":"2.0"}
4< {
5 "jsonrpc":"2.0",
6 "method":"eth_subscription",
7 "params":{
8 "result":{
9 "blockHash":null,
10 "blockNumber":null,
11 "from":"0xa36452fc31f6f482ad823cd1cf5515177d57667f",
12 "gas":"0x1adb0",
13 "gasPrice":"0x7735c4d40",
14 "hash":"0x50bff0736c713458c92dd1848d12f3354149be1363123dae35e94e0f2a9d56bf",
15"input":"0xa9059cbb0000000000000000000000000d0707963952f2fba59dd06f2b425ace40b492fe0000000000000000000000000000000000000000000015b1111266cfca100000",
16 "nonce":"0x0",
17 "to":"0xea38eaa3c86c8f9b751533ba2e562deb9acded40",
18 "transactionIndex":null,
19 "value":"0x0",
20 "v":"0x26",
21 "r":"0x195c2c1ed126088e12d290aa93541677d3e3b1d10f137e11f86b1b9227f01e3b",
22 "s":"0x60fc4edbf1527832a2a36dbc1e63ed6193a6eee654472fbebbf88ef1750b5344"},
23 "subscription":"0x9a52eeddc2b289f985c0e23a7d8427c8"
24 }
25 }
26
Mostrar todo
  1. newHeads

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

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

Ejemplo:

1> {"jsonrpc": "2.0", "id": 1, "method": "eth_subscribe", "params": ["newHeads"]}
2
3< {"jsonrpc":"2.0","id":2,"result":"0x9ce59a13059e417087c02d3236a0b1cc"}
4< {
5 "jsonrpc": "2.0",
6 "method": "eth_subscription",
7 "params": {
8 "result": {
9 "extraData": "0xd983010305844765746887676f312e342e328777696e646f7773",
10 "gasLimit": "0x47e7c4",
11 "gasUsed": "0x38658",
12 "logsBloom":
13"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
14 "nonce": "0x084149998194cc5f",
15 "number": "0x1348c9",
16 "parentHash": "0x7736fab79e05dc611604d22470dadad26f56fe494421b5b333de816ce1f25701",
17 "receiptRoot": "0x2fab35823ad00c7bb388595cb46652fe7886e00660a01e867824d3dceb1c8d36",
18 "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
19 "stateRoot": "0xb3346685172db67de536d8765c43c31009d0eb3bd9c501c9be3229203f15f378",
20 "timestamp": "0x56ffeff8",
21 "transactionsRoot": "0x0167ffa60e3ebc0b080cdb95f7c0087dd6c0e61413140e39d94d3468d7c9689f"
22 },
23 "subscription": "0x9ce59a13059e417087c02d3236a0b1cc"
24 }
25}
26
Mostrar todo
  1. logs

Emite registros que son parte de bloques recién agregados que coinciden con criterios de filtros específicos.

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

Parámetros

  1. Un objeto con los siguientes campos:
    • address (opcional): una cadena que representa una dirección, o un arreglo de dichas cadenas.
      • Solo se emitirán registros creados a partir de una de estas direcciones.
    • topics: un arreglo de especificadores de temas (topics).
      • Cada especificador de tema puede ser null, una cadena que representa un tema, o un arreglo de cadenas.
      • Cada posición del arreglo que no sea null restringe los logs emitidos solo a aquellos que tengan uno de los temas indicados 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:

1> {"jsonrpc": "2.0", "id": 1, "method": "eth_subscribe", "params": ["logs", {"address": "0x8320fe7702b96808f7bbc0d4a888ed1468216cfd", "topics": ["0xd78a0cb8bb633d06981248b816e7bd33c2a35a6089241d099fa519e361cab902"]}]}
2
3< {"jsonrpc":"2.0","id":2,"result":"0x4a8a4c0517381924f9838102c5a4dcb7"}
4< {
5 "jsonrpc": "2.0",
6 "method": "eth_subscription",
7 "params": {
8 "subscription": "0x4a8a4c0517381924f9838102c5a4dcb7",
9 "result": {
10 "address": "0x8320fe7702b96808f7bbc0d4a888ed1468216cfd",
11 "blockHash": "0x61cdb2a09ab99abf791d474f20c2ea89bf8de2923a2d42bb49944c8c993cbf04",
12 "blockNumber": "0x29e87",
13 "data": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003",
14 "logIndex":"0x0",
15 "topics":["0xd78a0cb8bb633d06981248b816e7bd33c2a35a6089241d099fa519e361cab902"],
16 "transactionHash": "0xe044554a0a55067caafd07f8020ab9f2af60bdfe337e395ecd84b4877a3d1ab4",
17 "transactionIndex": "0x0"
18 }
19 }
20}
21
Mostrar todo

eth_unsubscribe

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

Parámetros

  1. ID de suscripción, tal como fue devuelto previamente desde una llamada a eth_subscribe.

Muestra

true si la suscripción se canceló correctamente, o false si no existía una suscripción con ese ID.

Ejemplo:

Solicitud

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

Resultado

1{
2 "jsonrpc": "2.0",
3 "id": 1,
4 "result": true
5}

Regístrese en Alchemyopens in a new tab de forma gratuita, consulte nuestra documentaciónopens in a new tab y para las últimas novedades, síganos en Twitteropens in a new tab.

Última actualización de la página: 1 de octubre de 2025

¿Le ha resultado útil este tutorial?