Lompat ke konten utama

Menggunakan WebSockets

Alchemy
websockets
kueri
JavaScript
Pemula
Elan Halpern
1 Desember 2020
6 menit baca

Ini adalah panduan tingkat pemula untuk menggunakan WebSockets guna membuat permintaan ke rantai blok Ethereum. Contoh-contoh ini menggunakan metode JSON-RPC standar, sehingga berfungsi dengan node atau penyedia node mana pun yang menawarkan titik akhir WebSocket, termasuk Alchemy.

 (buka di tab baru)WebSockets vs HTTP

Berbeda dengan HTTP, dengan WebSockets, Anda tidak perlu terus-menerus membuat permintaan saat menginginkan informasi tertentu. WebSockets mempertahankan koneksi jaringan untuk Anda (jika dilakukan dengan benar) dan mendengarkan perubahan.

Seperti halnya koneksi jaringan apa pun, Anda tidak boleh berasumsi bahwa WebSocket akan tetap terbuka selamanya tanpa gangguan, tetapi menangani koneksi yang terputus dan penyambungan kembali secara manual dengan benar bisa menjadi tantangan tersendiri. Kekurangan lain dari WebSockets adalah Anda tidak mendapatkan kode status HTTP dalam respons, melainkan hanya pesan kesalahan.

Pustaka klien dapat menangani hal ini untuk Anda. Misalnya, transportasi WebSocket Viem (buka di tab baru) menyambung kembali saat kegagalan soket dan mengirimkan ping keep-alive secara default.

Cobalah

Anda memerlukan URL WebSocket untuk node Ethereum. Penyedia node akan memberikannya saat Anda membuat kunci Antarmuka Pemrograman Aplikasi (API), biasanya dalam bentuk wss://<provider-host>/<your-api-key>. Misalnya, URL Mainnet Ethereum Alchemy terlihat seperti wss://eth-mainnet.g.alchemy.com/v2/<your-api-key> (daftar untuk mendapatkan akun Alchemy gratis (buka di tab baru)). Lihat node sebagai layanan untuk penyedia lain, atau gunakan titik akhir WebSocket dari node Anda sendiri. Titik akhir publik seperti wss://ethereum-rpc.publicnode.com juga berfungsi untuk eksperimen cepat, tetapi dibatasi kecepatannya dan mungkin tidak mendukung setiap jenis langganan.

Cara termudah untuk menguji WebSockets adalah dengan menginstal alat baris perintah untuk membuat permintaan WebSocket seperti wscat (buka di tab baru). Menggunakan wscat, Anda dapat mengirim permintaan sebagai berikut:

npx wscat -c wss://<provider-host>/<your-api-key>

> {"jsonrpc": "2.0", "id": 0, "method": "eth_gasPrice"}

< {"jsonrpc": "2.0", "result": "0x41f9de2", "id": 0}

Baris yang dimulai dengan > adalah apa yang Anda ketik, dan baris yang dimulai dengan < adalah apa yang dikirim kembali oleh node.

Cara menggunakan WebSockets

Untuk memulai, buka WebSocket menggunakan URL WebSocket penyedia Anda. Dengan Alchemy, Anda dapat menemukannya dengan membuka aplikasi Anda di dasbor (buka di tab baru) dan melihat kunci API-nya. Perhatikan bahwa URL untuk WebSockets (wss://) berbeda dari URL untuk permintaan HTTP (https://), meskipun sebagian besar penyedia menggunakan kunci API yang sama untuk keduanya.

Metode JSON-RPC apa pun yang didukung penyedia Anda dapat digunakan melalui WebSocket. Untuk melakukannya, gunakan muatan yang sama yang akan dikirim sebagai isi permintaan HTTP POST, tetapi kirimkan muatan tersebut melalui WebSocket.

Dengan Web3

Beralih ke WebSockets saat menggunakan Pustaka klien seperti Viem (buka di tab baru) sangatlah mudah. Gunakan transportasi webSocket dengan URL WebSocket Anda alih-alih transportasi http. Misalnya, setelah npm install viem, simpan ini sebagai index.mjs dan jalankan node index.mjs:

API Langganan

Saat terhubung melalui WebSocket, Anda dapat menggunakan dua metode tambahan: eth_subscribe dan eth_unsubscribe. Metode ini akan memungkinkan Anda untuk mendengarkan peristiwa tertentu dan segera diberi tahu.

eth_subscribe

Membuat langganan baru untuk peristiwa yang ditentukan. Pelajari lebih lanjut tentang eth_subscribe (buka di tab baru).

Parameter

  1. Jenis langganan
  2. Parameter opsional

Argumen pertama menentukan jenis peristiwa yang akan didengarkan. Argumen kedua berisi opsi tambahan yang bergantung pada argumen pertama. Berbagai jenis deskripsi, opsinya, dan muatan peristiwanya dijelaskan di bawah ini.

Nilai Kembalian

ID langganan: ID ini akan dilampirkan pada setiap peristiwa yang diterima, dan juga dapat digunakan untuk membatalkan langganan menggunakan eth_unsubscribe.

Peristiwa langganan

Selama langganan aktif, Anda akan menerima peristiwa berupa objek dengan bidang-bidang berikut:

  • jsonrpc: Selalu "2.0"
  • method: Selalu "eth_subscription"
  • params: Sebuah objek dengan bidang-bidang berikut:
    • subscription: ID langganan yang dikembalikan oleh panggilan eth_subscribe yang membuat langganan ini.
    • result: Sebuah objek yang isinya bervariasi tergantung pada jenis langganan.

Jenis langganan

  1. newHeads

Memancarkan kejadian setiap kali header baru ditambahkan ke rantai, termasuk selama reorganisasi rantai (reorg).

Ketika reorg terjadi, langganan ini akan memancarkan kejadian yang berisi semua header baru untuk rantai baru. Secara khusus, ini berarti Anda mungkin melihat beberapa header dipancarkan dengan ketinggian yang sama, dan ketika ini terjadi, header yang lebih baru harus dianggap sebagai yang benar setelah reorg.

Contoh:

  1. logs

Memancarkan log yang merupakan bagian dari blok yang baru ditambahkan yang cocok dengan kriteria filter yang ditentukan.

Ketika reorg terjadi, log yang merupakan bagian dari blok pada rantai lama akan dipancarkan lagi dengan properti removed diatur ke true. Selanjutnya, log yang merupakan bagian dari blok pada rantai baru dipancarkan, yang berarti dimungkinkan untuk melihat log untuk transaksi yang sama beberapa kali dalam kasus reorg.

Parameter

  1. Sebuah objek dengan bidang-bidang berikut:
    • address (opsional): baik string yang mewakili alamat atau array dari string tersebut.
      • Hanya log yang dibuat dari salah satu alamat ini yang akan dipancarkan.
    • topics: array 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 pada mereka yang memiliki salah satu topik yang diberikan di posisi tersebut.

Beberapa contoh spesifikasi topik:

  • []: Topik apa 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:

Contoh ini mendengarkan kejadian Deposit dari kontrak WETH (buka di tab baru) di Mainnet Ethereum:

  1. newPendingTransactions

Memancarkan hash dari setiap transaksi yang ditambahkan ke state tertunda node (mempool-nya).

Contoh:

> {"jsonrpc": "2.0", "id": 1, "method": "eth_subscribe", "params": ["newPendingTransactions"]}

< {"jsonrpc":"2.0","result":"0x1c2365b029179adf1e84b9e327315249","id":1}
< {"jsonrpc":"2.0","method":"eth_subscription","params":{"result":"0x4a62d0ad7c8868fbbfa10604e68638e637c6fc6f64fd1fb4ca042dcd0158c992","subscription":"0x1c2365b029179adf1e84b9e327315249"}}

Beberapa penyedia juga menawarkan jenis langganan mereka sendiri. Misalnya, alchemy_pendingTransactions (buka di tab baru) milik Alchemy memancarkan objek transaksi penuh alih-alih hanya hash, dan menerima filter opsional fromAddress, toAddress, dan hashesOnly. Ini bukan bagian dari API JSON-RPC standar, sehingga hanya berfungsi dengan penyedia tersebut.

eth_unsubscribe

Membatalkan langganan yang ada sehingga tidak ada kejadian lebih lanjut yang dikirim.

Parameter

  1. ID Langganan, seperti yang dikembalikan sebelumnya dari panggilan eth_subscribe.

Nilai Kembalian

true jika langganan berhasil dibatalkan, atau false jika tidak ada langganan dengan ID yang diberikan.

Langganan hanya ada pada koneksi WebSocket yang membuatnya, jadi eth_unsubscribe harus dikirim melalui koneksi yang sama. Ini tidak dapat dikirim sebagai permintaan HTTP terpisah. Menutup koneksi juga membatalkan semua langganannya.

Contoh:

> {"jsonrpc": "2.0", "id": 2, "method": "eth_unsubscribe", "params": ["0xe0d4abf5caf333fbf94c5f02182e6469"]}

< {"jsonrpc":"2.0","result":true,"id":2}

Daftar dengan Alchemy (buka di tab baru) secara gratis, periksa dokumentasi Alchemy (buka di tab baru), dan untuk berita terbaru, ikuti Alchemy di Twitter (buka di tab baru).