Utilizarea WebSockets
Acesta este un ghid de bază pentru a folosi WebSockets și Alchemy pentru a face cereri către blockchain-ul Ethereum.
WebSockets vs. HTTP
Spre deosebire de HTTP, cu WebSockets nu este nevoie să faceți încontinuu cereri când doriți informații precise. WebSockets menține o conexiune de rețea pentru tine (dacă este făcută corect) și ascultă dacă apar modificări.
Ca și în cazul oricărei conexiuni la rețea, nu ar trebui să presupunem că un WebSocket va rămâne deschis pentru totdeauna fără întrerupere, dar manipularea corectă a conexiunilor pierdute și reconectarea manuală de o manieră corectă poate fi o provocare. Un alt dezavantaj al WebSocket-urilor este că nu obții codurile de stare HTTP ca răspuns, ci numai mesajul de eroare.
Alchemy Web3(opens in a new tab) adaugă automat manipularea pentru eșecuri WebSocket și reîncercări fără nici o configurație necesară.
Încearcă-l
Cel mai simplu mod de a testa WebSockets este de a instala un instrument de linie de comandă pentru a face cereri WebSocket, cum ar fi wscat(opens in a new tab). Folosind wscat, puteți trimite cereri după cum urmează:
Observație: dacă aveți un cont Alchemy, puteți înlocui demo
cu propria dvs. cheie API. Înscrieți-vă pentru un cont gratuit Alchemy aici!(opens in a new tab)
wscat -c wss://eth-mainnet.ws.alchemyapi.io/ws/demo> {"jsonrpc": "2.0", "id": 0, "method": "eth_gasPrice"}< {"jsonrpc": "2.0", "result": "0xb2d05e00", "id": 0}
Cum se utilizează WebSockets
Pentru a începe, deschideți un WebSocket utilizând URL-ul WebSocket pentru aplicația dvs. Puteți găsi URL-ul WebSocket al aplicației dvs. deschizând pagina aplicației în tabloul dvs. de bord(opens in a new tab) și făcând clic pe „View Key” („Vizualizare cheie”). Rețineți că URL-ul aplicației dvs. pentru WebSockets este diferit de URL-ul pentru cererile HTTP, dar ambele pot fi găsite făcând clic pe „View Key” („Vizualizare cheie”).
Oricare dintre API-urile enumerate în Alchemy API de referință(opens in a new tab) poate fi folosit prin intermediul WebSocket. Pentru aceasta, folosește aceleași elemente care ar fi trimise prin metoda de cereri POST suportată de HTTP, dar trimite-le prin WebSocket.
Cu Web3
Tranziția la WebSockets în timpul utilizării unei biblioteci client ca Web3 este simplă. Pur și simplu transmiți URL-ul WebSocket în loc de HTTP atunci când creezi o instanță a clientul tău Web3. De exemplu:
1const web3 = new Web3("wss://eth-mainnet.ws.alchemyapi.io/ws/your-api-key")23web3.eth.getBlockNumber().then(console.log) // -> 7946893Copiați
Abonament API
Când vă conectați printr-un WebSocket, puteți utiliza două metode suplimentare: eth_subscribe
și eth_unsubscribe
. Aceste metode îți vor permite să asculți anumite evenimente și să fii notificat imediat.
eth_subscribe
Creează un nou abonament pentru evenimente specificate. Aflați mai multe despre eth_subscribe
(opens in a new tab).
Parametri
- Tipuri de abonamente
- Parametri opționali
Primul argument specifică tipul de eveniment pentru care să asculte. Al doilea argument conține opțiuni suplimentare care depind de primul argument. Diferitele tipuri de descriere, opțiunile lor și conținutul de evenimente pe care le includ sunt descrise mai jos.
Returnări
ID-ul abonamentului: acest ID va fi atașat la orice evenimente primite și poate fi utilizat și pentru anularea abonamentului folosind eth_unsubscribe
.
Evenimente de abonament
Cât timp abonamentul este activ, veți primi evenimente care sunt obiecte cu următoarele câmpuri:
jsonrpc
: Totdeauna „2.0”method
: Totdeauna „eth_subscription”params
: Un obiect cu următoarele câmpuri:subscription
: ID-ul abonamentului returnat de apeluleth_subscription
care a creat acest abonament.result
: un obiect al cărui conținut variază în funcție de tipul abonamentului.
Tipuri de abonamente
alchemy_newFullPendingTransactions
Returnează informațiile tranzacției pentru toate tranzacțiile care sunt adăugate la starea în așteptare. Acest tip de abonament te abonează la tranzacțiile în așteptare, similar cu apelurile web3 standard web3.eth.subscribe("pendingTransactions")
, dar diferă de ele prin faptul că emite informații complete de tranzacție, nu doar hash-urile tranzacțiilor.
Exemplu:
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 }26Afișează totCopiați
newHeads
Emite un eveniment de fiecare dată când un nou antet se adăugă lanțului, inclusiv în timpul reorganizării lanțului.
Când are loc o reorganizare a lanțului, acest abonament va emite un eveniment care conține toate anteturile noi pentru lanțul nou. Și anume, aceasta înseamnă că veți putea vedea mai multe anteturi emise cu aceeași înălțime, iar când se întâmplă acest lucru, ultimul antet trebuie să fie considerat cel corect după o reorganizare.
Exemplu:
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 "difficulty": "0x15d9223a23aa",10 "extraData": "0xd983010305844765746887676f312e342e328777696e646f7773",11 "gasLimit": "0x47e7c4",12 "gasUsed": "0x38658",13 "logsBloom":14"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",15 "miner": "0xf8b483dba2c3b7176a3da549ad41a48bb3121069",16 "nonce": "0x084149998194cc5f",17 "number": "0x1348c9",18 "parentHash": "0x7736fab79e05dc611604d22470dadad26f56fe494421b5b333de816ce1f25701",19 "receiptRoot": "0x2fab35823ad00c7bb388595cb46652fe7886e00660a01e867824d3dceb1c8d36",20 "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",21 "stateRoot": "0xb3346685172db67de536d8765c43c31009d0eb3bd9c501c9be3229203f15f378",22 "timestamp": "0x56ffeff8",23 "transactionsRoot": "0x0167ffa60e3ebc0b080cdb95f7c0087dd6c0e61413140e39d94d3468d7c9689f"24 },25 "subscription": "0x9ce59a13059e417087c02d3236a0b1cc"26 }27}28Afișează totCopiați
logs
Emite jurnale care fac parte din blocuri nou adăugate care corespund criteriilor de filtrare specificate.
Atunci când are loc o reorganizare a lanțului, jurnalele care fac parte din blocurile de pe lanțul vechi vor fi emise din nou cu proprietatea removed
setată la true
. În plus, sunt emise jurnale care fac parte din blocurile de pe noul lanț, ceea ce înseamnă că este posibil să se vadă jurnale pentru aceeași tranzacție de mai multe ori în cazul unei reorganizări.
Parametri
- Un obiect cu următoarele câmpuri:
address
(optional): either a string representing an address or an array of such strings.- Vor fi emise doar jurnale create de la una dintre aceste adrese.
topics
: o matrice de specificatori de subiect.- Fiecare specificator de subiect este
null
, un string reprezentând un subiect sau o matrice de stringuri. - Fiecare poziție din matrice care nu este
null
restricționează jurnalele emise numai celor care au unul dintre subiectele date în acea poziție.
- Fiecare specificator de subiect este
Câteva exemple de specificații referitoare la subiecte:
[]
: Orice subiecte permise.[A]
: A în prima poziție (și orice după).[null, B]
: Orice în prima poziție și B în a doua poziție (și orice după).[A, B]
: A în prima poziție și B în a doua poziție (și orice după).[[A, B], [A, B]]
: (A sau B) în prima poziție și (A sau B) în a doua poziție (și orice după).
Exemplu:
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}21Afișează totCopiați
eth_unsubscribe
Anulează un abonament existent, astfel încât să nu mai fie trimise alte evenimente.
Parametri
- ID-ul abonamentului, așa cum a fost returnat anterior de la un apel
eth_subscribe
.
Returnări
true
dacă un abonament a fost anulat cu succes sau false
dacă nu a existat niciun abonament cu ID-ul dat.
Exemplu:
Cerere
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"]}'56
Rezultat
1{2 "jsonrpc": "2.0",3 "id": 1,4 "result": true5}Copiați
nregistrează-te la Alchemy(opens in a new tab) gratis, consultă documentația noastră(opens in a new tab) și pentru cele mai recente știri, urmărește-ne pe Twitter(opens in a new tab).
Ultima modificare: @pettinarip(opens in a new tab), 8 decembrie 2023