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 trebuie să faci în mod continuu solicitări atunci când dorești informații specifice. 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 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. Folosind „wscat”, poți trimite cereri după cum urmează:
Notă: Dacă ai un cont Alchemy poți înlocui demo
cu propria cheie API. Înscrie-te pentru un cont Alchemy gratuit aici!
1$ wscat -c wss://eth-mainnet.ws.alchemyapi.io/ws/demo23> {"jsonrpc": "2.0", "id": 0, "method": "eth_gasPrice"}45< {"jsonrpc": "2.0", "resultat": "0xb2d05e00", "id": 0}67
Cum se utilizează WebSockets
Pentru început, deschide un WebSocket folosind adresa URL WebSocket a aplicației tale. Poți găsi adresa URL a aplicației tale WebSocket deschizând pagina aplicației în tabloul de bord și făcând clic pe „View Key” (Vizualizare cheie). Reține că URL-ul aplicației pentru WebSockets este diferit de URL-ul său pentru cererile HTTP, dar ambele pot fi găsite dacă facem clic pe „View Key”(Vizualizare cheie).
Oricare dintre API-urile enumerate în Alchemy API de referință 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) // -> 79468934Copiere
Abonament API
Când ești conectat printr-un WebSocket, poț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. Află mai multe despre eth_subscribe
.
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, vei 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 }2627Afișează totCopiere
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. În special, aceasta înseamnă că poți vedea mai multe anteturi emise cu aceeași înălțime, iar când se întâmplă acest lucru, ultimul antet trebuie 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}2829Afișează totCopiere
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:
adddress
(opțional): un string reprezentând o adresă sau o matrice de astfel de stringuri.- 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}2122Afișează totCopiere
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"]}'567
Rezultat
1{2 "jsonrpc": "2.0",3 "id": 1,4 "result": true5}6Copiere
nregistrează-te la Alchemy gratis, consultă documentația noastră și pentru cele mai recente știri, urmărește-ne pe Twitter.