Vai al contenuto principale

Uso dei WebSocket

alchemywebsocketqueryjavascript
Principiante
Elan Halpern
documentazione Alchemy(opens in a new tab)
1 dicembre 2020
6 minuti letti minute read

Questa è una guida entry level su come utilizzare Websocket e Alchemy per fare richieste alla blockchain Ethereum.

(opens in a new tab)WebSocket e HTTP

A differenza di HTTP, con i WebSocket non serve fare continuamente richieste quando si desiderano informazioni specifiche. I WebSocket mantengono una connessione con la rete (se configurati correttamente) e monitorano le modifiche.

Come avviene con ogni connessione di rete, non presupporre che un WebSocket rimanga aperto per sempre senza interruzioni; gestire correttamente a mano la caduta di connessione e la riconnessione può essere complicato. Un altro lato negativo dei WebSocket è che non si ottengono codici di stato HTTP come risposta ma solo il messaggio di errore.

Alchemy Web3(opens in a new tab) aggiunge automaticamente la gestione degli errori di WebSocket e i nuovi tentativi senza necessità di configurazione alcuna.

Facciamo una prova

Il modo più facile per testare i WebSocket è installare uno strumento da riga di comando per eseguire richieste WebSocket come wscat(opens in a new tab). Usando wscat, è possibile inviare richieste come di seguito:

Nota: se hai un conto di Alchemy, puoi sostituire demo con la tua chiave API. Registrati qui per avere un conto gratuito di Alchemy!(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

Come usare i WebSocket

Per iniziare, apri un WebSocket usando l'URL WebSocket della tua app. Puoi trovare l'URL WebSocket della tua app aprendo la pagina dell'app nel dashboard(opens in a new tab) e facendo clic su "View Key". Tieni presente che l'URL della tua app per WebSocket è diverso dall'URL per le richieste HTTP, ma entrambi sono visualizzabili facendo clic su "View Key".

Dove trovare l'URL WebSocket nella dashboard di Alchemy

Tutte le API elencate in Alchemy API Reference(opens in a new tab) possono essere utilizzate tramite WebSocket. A questo scopo, usa lo stesso payload che verrebbe inviato come corpo di una richiesta HTTP POST, ma invialo tramite il WebSocket.

Con Web3

Passare ai WebSocket usando una libreria client come Web3 è semplice. Basta passare l'URL WebSocket anziché quello HTTP quando crei un'istanza del client Web3. Per esempio:

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

API per l'iscrizione

Se ti connetti tramite WebSocket, puoi usare altri due metodi: eth_subscribe e eth_unsubscribe. Ti consentiranno di attendere determinati eventi e di ricevere notifiche immediate.

eth_subscribe

Crea una nuova iscrizione agli eventi specificati. Scopri di più sueth_subscribe(opens in a new tab).

Parametri

  1. Tipi di iscrizioni
  2. Parametri opzionali

Il primo argomento specifica il tipo di evento da attendere. Il secondo argomento contiene opzioni aggiuntive che dipendono dal primo argomento. I diversi tipi di descrizione, le loro opzioni e i payload degli eventi sono descritti di seguito.

Restituisce

L'ID dell'iscrizione: questo ID sarà allegato a ogni evento ricevuto e può anche essere usato per annullare l'iscrizione usando eth_unsubscribe.

Eventi di iscrizione

Mentre l'iscrizione è attiva, ricevi eventi che sono oggetti con i seguenti campi:

  • jsonrpc: sempre "2.0"
  • method: sempre "eth_subscription"
  • params: un oggetto con i campi seguenti:
    • subscription: l'ID di iscrizione restituito dalla chiamata a eth_subscribe che ha creato questa iscrizione.
    • result: oggetto i cui contenuti variano in base al tipo di iscrizione.

Tipi di iscrizione

  1. alchemy_newFullPendingTransactions

Restituisce le informazione della transazione per tutte le transazioni aggiunte allo stato in sospeso. Questo tipo esegue l'iscrizione alle transazioni in sospeso, analogamente alla chiamata Web3 standard di web3.eth.subscribe("pendingTransactions"), ma è diverso perché emette informazioni complete sulla transazione anziché 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
Mostra tutto
Copia
  1. newHeads

Emette un evento ogni volta che una nuova intestazione viene aggiunta alla catena, anche durante una riorganizzazione della catena.

Quando si verifica la riorganizzazione della catena, questa iscrizione emetterà un evento contenente tutte le nuove intestazioni della nuova catena. In particolare, significa che potresti vedere più intestazioni emesse con la stessa altezza e quando ciò si verifica l'ultima dovrebbe essere considerata 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
Mostra tutto
Copia
  1. logs

Emette registri che fanno parte di blocchi appena aggiunti, corrispondenti ai criteri specificati per il filtro.

Quando avviene la riorganizzazione della catena, i registri che fanno parte dei blocchi sulla vecchia catena saranno emessi di nuovo con la proprietà removed impostata su true. Inoltre, vengono emessi i registri che fanno parte dei blocchi sulla nuova catena. Significa che sarà possibile trovare registri della stessa transazione diverse volte nel caso di una riorganizzazione.

Parametri

  1. Un oggetto con i seguenti campi:
    • address (facoltativo): una stringa rappresentante un indirizzo o un array di stringhe analoghe.
      • Saranno emessi solo i registri creati da uno di questi indirizzi.
    • topics: array di specificatori di argomento.
      • Ogni specificatore di argomento è null, una stringa rappresentante un argomento o un array di stringhe.
      • Ogni posizione nell'array che non è null limita i registri emessi a quelli aventi uno degli argomenti indicati in quella posizione.

Alcuni esempi di specifiche di argomento:

  • []: ogni argomento è consentito.
  • [A]: A in prima posizione (e tutto il resto segue).
  • [null, B]: tutto nella prima posizione e B nella seconda (e tutto il resto segue).
  • [A, B]: A in prima posizione e B in seconda (e tutto il resto segue).
  • [[A, B], [A, B]]: (A o B) in prima posizione e (A o B) in seconda posizione (e tutto il resto segue).

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
Mostra tutto
Copia

eth_unsubscribe

Annulla un'iscrizione esistente in modo che non siano inviati altri eventi.

Parametri

  1. ID di iscrizione, come precedentemente restituito da una chiamata eth_subscribe.

Restituisce

true se un'iscrizione è stata annullata o false se non esiste alcuna iscrizione con l'ID dato.

Esempio:

Richiesta

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

Risultato

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

Registrati con Alchemy(opens in a new tab) gratuitamente, dai un'occhiata alla nostra documentazione(opens in a new tab) e, per le notizie più recenti, seguici su Twitter(opens in a new tab).

Ultima modifica: @pettinarip(opens in a new tab), 8 dicembre 2023

Questo tutorial è stato utile?