Uso de WebSockets
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/demo23> {"jsonrpc": "2.0", "id": 0, "method": "eth_gasPrice"}45< {"jsonrpc": "2.0", "result": "0xb2d05e00", "id": 0}6Có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".
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")23web3.eth.getBlockNumber().then(console.log) // -> 7946893API 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
- Tipos de suscripción
- 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 llamadaeth_subscribeque creó esta suscripción.result: Un objeto cuyo contenido varía según el tipo de suscripción.
Tipos de suscripción
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"]}23< {"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 }26Mostrar todonewHeads
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"]}23< {"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}26Mostrar todologs
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
- 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
nullrestringe los logs emitidos solo a aquellos que tengan uno de los temas indicados en esa posición.
- Cada especificador de tema puede ser
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"]}]}23< {"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}21Mostrar todoeth_unsubscribe
Cancela una suscripción existente para que no se envíen más eventos.
Parámetros
- 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-key2-X POST3-H "Content-Type: application/json"4-d '{"id": 1, "method": "eth_unsubscribe", "params": ["0x9cef478923ff08bf67fde6c64013158d"]}'56Resultado
1{2 "jsonrpc": "2.0",3 "id": 1,4 "result": true5}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
