Menggunakan WebSockets
Ini adalah panduan level pemula tentang menggunakan WebSocket dan Alchemy untuk membuat permintaan di blockchain Ethereum.
WebSocket vs. HTTP
Tidak seperti HTTP, dengan WebSocket, Anda tidak perlu secara berulang membuat permintaan saat Anda menginginkan informasi spesifik. WebSocket mempertahankan koneksi jaringan untuk Anda (jika dilakukan dengan benar) dan mendengarkan perubahannya.
Seperti koneksi jaringan mana pun, Anda tidak boleh menganggap bahwa WebSocket akan tetap terbuka selamanya tanpa gangguan, tetapi menangani koneksi dan penyambungan kembali koneksi yang turun dengan benar secara manual bisa sulit untuk dilakukan. Kekurangan lainnya dari WebSocket adalah Anda tidak mendapatkan kode status HTTP dalam tanggapannya, tapi hanya pesan kesalahan.
Web3 Alchemy(opens in a new tab) secara otomatis menambah penanganan untuk kegagalan WebSocket dan mencoba kembali tanpa perlu adanya konfigurasi.
Cobalah
Cara termudah untuk menguji WebSocket adalah menginstal peralatan baris perintah untuk membuat permintaan WebSocket, seperti wscat(opens in a new tab). Dengan wscat, Anda bisa mengirim permintaan seperti berikut ini:
Catatan: jika Anda memiliki akun Alchemy, Anda bisa menggantikan demo
dengan kunci API Anda sendiri. Daftar akun Alchemy secara gratis di sini!(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}6
Cara menggunakan WebSocket
Untuk memulai, buka WebSocket menggunakan URL WebSocket untuk aplikasi Anda. Anda bisa menemukan URL WebSocket aplikasi Anda dengan membuka halaman aplikasi di dasbor Anda(opens in a new tab) dan mengklik "View Key". Perhatikan bahwa URL aplikasi Anda untuk WebSocket berbeda dari URL untuk permintaan HTTP, tapi keduanya bisa ditemukan dengan mengklik "View Key".
Setiap API yang terdaftar di Referensi API Alchemy(opens in a new tab) bisa digunakan melalui WebSocket. Untuk melakukannya, gunakan payload yang sama yang akan dikirimkan sebagai isi permintaan HTTP POST, tapi sebaliknya kirimkan payload itu melalui WebSocket.
Dengan Web3
Beralih ke WebSocket sementara menggunakan pustaka klien seperti Web3 itu mudah. Cukup hanya dengan meneruskan URL WebSocket sebagai ganti HTTP saat membuat instance klien Web3 Anda. Sebagai contoh:
1const web3 = new Web3("wss://eth-mainnet.ws.alchemyapi.io/ws/your-api-key")23web3.eth.getBlockNumber().then(console.log) // -> 7946893Salin
API Langganan
Saat terhubung lewat WebSocket, Anda bisa menggunakan dua metode tambahan: eth_subscribe
dan eth_unsubscribe
. Metode ini akan memungkinkan Anda mendengar aksi tertentu dan mendapat pemberitahuan dengan segera.
eth_subscribe
Membuat langganan baru untuk aksi yang ditentukan. Pelajari selengkapnya tentang eth_subscribe
(opens in a new tab).
Parameter
- Jenis langganan
- Parameter opsional
Argumen pertama menentukan jenis aksi yang didengarkan. Argumen kedua berisi opsi tambahan yang tergantung pada argumen pertama. Jenis deskripsi, opsi, dan payload aksi yang berbeda dideskripsikan di bawah.
Mengembalikan
ID langganan: ID ini akan dilampirkan pada setiap aksi yang diterima, dan bisa juga digunakan untuk membatalkan langganan menggunakan eth_unsubscribe
.
Aksi langganan
Saat langganan aktif, Anda akan menerima aksi yang adalah objek dengan field berikut:
jsonrpc
: Selalu "2.0"method
: Selalu "eth_subscription"params
: Objek dengan field berikut:subscription
: ID langganan yang dikembalikan oleh pemanggilaneth_subscription
yang membuat langganan ini.result
: Objek yang isinya bervariasi bergantung pada jenis langganan.
Jenis langganan
alchemy_newFullPendingTransactions
Mengembalikan informasi transaksi untuk semua transaksi yang ditambahkan ke state tunggu. Jenis langganan ini berlangganan ke transaksi tunggu, yang sama dengan pemanggilan Web3 standar web3.eth.subscribe("pendingTransactions")
, tapi bedanya jenis langganan ini memancarkan informasi transaksi lengkap dan bukan hanya hash transaksi.
Contoh:
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 }26Tampilkan semuaSalin
newHeads
Memancarkan aksi setiap kali header baru ditambahkan ke rantai, termasuk saat reorganisasi rantai.
Saat reorganisasi rantai terjadi, langganan ini akan memancarkan aksi yang berisi semua header baru dari rantai barunya. Secara khusus, ini berarti Anda mungkin melihat beragam header yang dipancarkan dengan tinggi yang sama, dan saat ini terjadi, header berikutnya harus dianggap sebagai yang benar setelah reorganisasi selesai.
Contoh:
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}28Tampilkan semuaSalin
log
Memancarkan log yang merupakan bagian dari blok yang baru ditambahkan yang sesuai dengan kriteria penyaringan tertentu.
Saat reorganisasi rantai terjadi, log yang merupakan bagian dari blok di rantai lama akan dipancarkan lagi dengan properti removed
diatur ke true
. Selanjutnya, log yang merupakan bagian dari blok di rantai baru dipancarkan, berarti ada kemungkinan melihat log transaksi yang sama berulang kali jika terjadi reorganisasi.
Parameter
- Objek dengan field berikut:
address
(optional): either a string representing an address or an array of such strings.- Hanya log yang dibuat dari salah satu alamat ini akan dipancarkan.
topics
: array dari penentu topik.- Setiap penentu topik adalah
null
, string yang mewakili topik, atau array string. - Setiap posisi dalam array yang bukan
null
membatasi log yang dipancarkan hanya ke yang memiliki salah satu dari topik tertentu di posisi itu.
- Setiap penentu topik adalah
Beberapa contoh spesifikasi topik:
[]
: Topik mana pun diizinkan.[A]
: A di posisi pertama (dan apa pun setelahnya).[null, B]
: Apa pun di posisi pertama dan B di posisi kedua (dan apa pun setelahnya).[A, B]
: A di posisi pertama dan B di posisi kedua (dan apa pun setelahnya).[[A, B], [A, B]]
: (A atau B) di posisi pertama dan (A atau B) di posisi kedua (dan apa pun setelahnya).
Contoh:
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}21Tampilkan semuaSalin
eth_unsubscribe
Membatalkan langganan yang ada, sehingga tidak ada aksi berikutnya yang dikirimkan.
Parameter
- ID langganan, seperti yang dikembalikan sebelumnya dari pemanggilan
eth_subscribe
.
Mengembalikan
true
jika langganan berhasil dibatalkan, atau false
jika tidak ada langganan dengan ID tertentu.
Contoh:
Permintaan
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
Hasil
1{2 "jsonrpc": "2.0",3 "id": 1,4 "result": true5}Salin
Daftar Alchemy(opens in a new tab) secara gratis, lihat dokumentasi kami(opens in a new tab), dan untuk berita terkini, ikuti kami di Twitter(opens in a new tab).
Terakhir diedit: @pettinarip(opens in a new tab), 8 Desember 2023