Ir al contenido principal

Uso de WebSockets

AlchemywebsocketsconsultaJavaScript
Principiante
Elan Halpern
Documentos de Alquimia(opens in a new tab)
1 de diciembre de 2020
6 minuto leído minute read

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 tab)WebSockets 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 Web3(opens in a new tab) automáticamente agrega manejo para fallas y reintentos de WebSocket sin necesidad de configuración.

Pruébelo

La forma más fácil de probar WebSockets es instalar una herramienta de línea de comando para hacer soliciudes WebSocket como wscat(opens in a new tab). Usando Wsact, puede enviar solicitudes así:

Nota: Si tiene una cuenta de Alchemy, puede reemplazar demo con 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 aplicación en su panel de control(opens 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 puede encontrar la URL de WebSocket en su panel de control de Alchemy

Puede usar cualquiera de las API listadas en la Referencia de API de Alchemy(opens in a new tab) a través de 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

Traspasar a WebSockts mientras se usa una biblioteca cliente como Web3 es simple. Simplemente pase la URL de WebSocket en lugar de la URL HTTP cuando instancie a 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
Copiar

Subscripción API

Cuando se conecta a través de un WebSocket, puede utilizar 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 acerca de eth_subscribe(opens in a new tab).

Parámetros

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

El primer argumento específica el tipo de evento el cuál se escucha. El segundo argumento contiene opciones adicionales las cuales dependen del primer argumento. Las diferentes de tipos de descripciones, sus opciones y sus cargas útiles se describen a continuación.

Regresa

El ID de subscripción: Este ID se adjuntará a cualquier evento, y también será usado para cancelar la subscripción usando eth_unsubscribe.

Eventos de suscripción

Mientras la subscripción este activa, recibirá eventos los cuales son objetos en los siguientes campos:

  • jsonrpc: Always "2.0"
  • method: Always "eth_subscription"
  • parámetro: Un objeto con los siguientes campos:
    • subscription: El ID de suscripción devuelto por la llamada eth_subscription que creó esta suscripción.
    • result: Un objeto el cuál varia dependiendo del tipo de subscripción.

Tipos de subceipciones

  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, similares a la llamada web 3 estándar web3.eth. ubscribe("pendingTransactions"), pero difiere en que emite información completa de la transacción en lugar de solo el hash de la transacción.

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
Copiar
  1. nuevas Cabezas

Emite un evento en cualquier momento en que se añade un nuevo encabezado a la cadena, incluyendo durante una reorganización en cadena.

Cuando se produce una reorganización en cadena, esta suscripción emitirá un evento que contiene todas las nuevas cabeceras de la nueva cadena. En particular, esto significa que puede ver múltiples cabeceras emitidas con la misma altura, y cuando esto suceda, la cabecera posterior debe ser tomada como la correcta 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
Copiar
  1. registros

Emite registros los cuales son parte de bloques recién agregados que coinciden con los filtros de criterio.

Cuando se produce una reorganización en cadena, los registros que son parte de los bloques de la cadena antigua se emitirán de nuevo con la propiedad eliminada establecida en verdadero. Además, se emiten registros que son parte de los bloques de 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:
    • dirección (opcional): una cadena que representa una dirección o una formación de dichas cadenas.
      • Sólo se emitirán registros creados a partir de una de estas direcciones.
    • topics: una formación de especificadores de temas.
      • Cada especificador de tema es null, una cadena que representa un tema, o una formación de cadenas.
      • Cada posición en la formación que no es null restringe los registros emitidos a solo aquellos que tienen uno de los temas dados en esa posición.

Algunos ejemplos de especificaciones de temas:

  • []: Cualquier tema permitido.
  • [A]: A en una 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 segunda posición (y cualquier cosa después).
  • [[A, B], [A, B]]: (A o B) en primer posición y (A o B) en 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
Copiar

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 devuelve previamente desde una llamada a eth_subscribe.

Regresa

verdadero si una suscripción fue cancelada con éxito, o falso si no existe ninguna suscripción con el ID dado.

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}
Copiar

Regístrese con Alchemy(opens in a new tab) gratis, vea nuestra documentación(opens in a new tab), y para las últimas noticias, síganos en Twitter(opens in a new tab).

Última edición: @Diana1941(opens in a new tab), 21 de febrero de 2024

¿Le ha resultado útil este tutorial?