Utilizzare i WebSocket
Questa è una guida di base per utilizzare i WebSocket e Alchemy per effettuare richieste alla blockchain di Ethereum.
(opens in a new tab)WebSocket contro HTTP
A differenza dell'HTTP, con i WebSocket non è necessario effettuare continuamente richieste quando si desiderano informazioni specifiche. I WebSocket mantengono una connessione di rete per te (se eseguiti correttamente) e restano in ascolto dei cambiamenti.
Come per qualsiasi connessione di rete, non si dovrebbe presumere che un WebSocket rimanga aperto per sempre senza interruzioni, ma gestire correttamente le connessioni interrotte e la riconnessione manuale può essere difficile da eseguire nel modo giusto. Un altro svantaggio dei WebSocket è che non si ottengono i codici di stato HTTP nella risposta, ma solo il messaggio di errore.
Alchemy Web3 (opens in a new tab) aggiunge automaticamente la gestione dei guasti e dei tentativi dei WebSocket senza alcuna configurazione necessaria.
Provalo
Il modo più semplice per testare i WebSocket è installare uno strumento a riga di comando per effettuare richieste WebSocket come wscat (opens in a new tab). Usando wscat, puoi inviare richieste come segue:
Nota: se hai un account Alchemy puoi sostituire demo con la tua chiave API. Registrati qui per un account Alchemy gratuito! (opens in a new tab)
1wscat -c wss://eth-mainnet.ws.alchemyapi.io/ws/demo2
3> {"jsonrpc": "2.0", "id": 0, "method": "eth_gasPrice"}4
5< {"jsonrpc": "2.0", "result": "0xb2d05e00", "id": 0}6
Come usare i WebSocket
Per iniziare, apri un WebSocket utilizzando l'URL WebSocket per la tua app. Puoi trovare l'URL WebSocket della tua app aprendo la pagina dell'app nella tua dashboard (opens in a new tab) e cliccando su "View Key" (Visualizza chiave). Nota che l'URL della tua app per i WebSocket è diverso dal suo URL per le richieste HTTP, ma entrambi possono essere trovati cliccando su "View Key".
Qualsiasi API elencata nel Riferimento API di Alchemy (opens in a new tab) può essere utilizzata tramite WebSocket. Per farlo, usa lo stesso payload che verrebbe inviato come corpo di una richiesta HTTP POST, ma invialo invece attraverso il WebSocket.
Con Web3
Passare ai WebSocket mentre si utilizza una libreria client come Web3 è semplice. Basta passare l'URL WebSocket invece di quello HTTP quando si istanzia il proprio client Web3. Ad esempio:
1const web3 = new Web3("wss://eth-mainnet.ws.alchemyapi.io/ws/your-api-key")2
3web3.eth.getBlockNumber().then(console.log) // -> 7946893API di iscrizione
Quando si è connessi tramite un WebSocket, è possibile utilizzare due metodi aggiuntivi: eth_subscribe ed eth_unsubscribe. Questi metodi ti permetteranno di ascoltare eventi particolari e di essere avvisato immediatamente.
eth_subscribe
Crea una nuova iscrizione per gli eventi specificati. Scopri di più su eth_subscribe (opens in a new tab).
Parametri
- Tipi di iscrizione
- Parametri opzionali
Il primo argomento specifica il tipo di evento da ascoltare. Il secondo argomento contiene opzioni aggiuntive che dipendono dal primo argomento. I diversi tipi di descrizione, le loro opzioni e i payload dei loro eventi sono descritti di seguito.
Restituisce
L'ID dell'iscrizione: questo ID sarà allegato a qualsiasi evento ricevuto e può anche essere utilizzato per annullare l'iscrizione utilizzando eth_unsubscribe.
Eventi di iscrizione
Mentre l'iscrizione è attiva, riceverai eventi che sono oggetti con i seguenti campi:
jsonrpc: Sempre "2.0"method: Sempre "eth_subscription"params: Un oggetto con i seguenti campi:subscription: L'ID dell'iscrizione restituito dalla chiamataeth_subscribeche ha creato questa iscrizione.result: Un oggetto il cui contenuto varia a seconda del tipo di iscrizione.
Tipi di iscrizione
alchemy_newFullPendingTransactions
Restituisce le informazioni della transazione per tutte le transazioni che vengono aggiunte allo stato in sospeso. Questo tipo di iscrizione si iscrive alle transazioni in sospeso, in modo simile alla chiamata standard di Web3 web3.eth.subscribe("pendingTransactions"), ma differisce in quanto emette informazioni complete sulla transazione piuttosto che solo gli hash della transazione.
Esempio:
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
newHeads
Emette un evento ogni volta che una nuova intestazione viene aggiunta alla catena, anche durante una riorganizzazione della catena.
Quando si verifica una riorganizzazione della catena, questa iscrizione emetterà un evento contenente tutte le nuove intestazioni per la nuova catena. In particolare, questo significa che potresti vedere più intestazioni emesse con la stessa altezza, e quando ciò accade l'intestazione successiva dovrebbe essere considerata come quella corretta dopo una riorganizzazione.
Esempio:
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
logs
Emette log che fanno parte di blocchi appena aggiunti che corrispondono ai criteri di filtro specificati.
Quando si verifica una riorganizzazione della catena, i log che fanno parte dei blocchi sulla vecchia catena verranno emessi di nuovo con la proprietà removed impostata su true. Inoltre, vengono emessi i log che fanno parte dei blocchi sulla nuova catena, il che significa che è possibile vedere i log per la stessa transazione più volte in caso di riorganizzazione.
Parametri
- Un oggetto con i seguenti campi:
address(opzionale): una stringa che rappresenta un indirizzo o un array di tali stringhe.- Verranno emessi solo i log creati da uno di questi indirizzi.
topics: un array di specificatori di argomenti.- Ogni specificatore di argomento è
null, una stringa che rappresenta un argomento o un array di stringhe. - Ogni posizione nell'array che non è
nulllimita i log emessi solo a quelli che hanno uno degli argomenti dati in quella posizione.
- Ogni specificatore di argomento è
Alcuni esempi di specifiche degli argomenti:
[]: Qualsiasi argomento consentito.[A]: A in prima posizione (e qualsiasi cosa dopo).[null, B]: Qualsiasi cosa in prima posizione e B in seconda posizione (e qualsiasi cosa dopo).[A, B]: A in prima posizione e B in seconda posizione (e qualsiasi cosa dopo).[[A, B], [A, B]]: (A o B) in prima posizione e (A o B) in seconda posizione (e qualsiasi cosa dopo).
Esempio:
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
eth_unsubscribe
Annulla un'iscrizione esistente in modo che non vengano inviati ulteriori eventi.
Parametri
- ID dell'iscrizione, come precedentemente restituito da una chiamata
eth_subscribe.
Restituisce
true se un'iscrizione è stata annullata con successo, o false se non esisteva alcuna iscrizione con l'ID fornito.
Esempio:
Richiesta
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"]}'5
6
Risultato
1{2 "jsonrpc": "2.0",3 "id": 1,4 "result": true5}Registrati su Alchemy (opens in a new tab) gratuitamente, dai un'occhiata alla nostra documentazione (opens in a new tab) e, per le ultime notizie, seguici su Twitter (opens in a new tab).
Ultimo aggiornamento della pagina: 3 marzo 2026
