Ana içeriğe atla

WebSocket'leri Kullanmak

Alchemy
websocket'ler
sorgulama
JavaScript
Başlangıç
Elan Halpern
1 Aralık 2020
6 dakikalık okuma

Bu, Ethereum blokzincirine istek yapmak için WebSocket'leri kullanmaya yönelik giriş seviyesinde bir rehberdir. Örnekler standart JSON-RPC yöntemlerini kullanır, bu nedenle Alchemy dahil olmak üzere bir WebSocket uç noktası sunan herhangi bir düğüm veya düğüm sağlayıcısıyla çalışırlar.

 (yeni sekmede açılır)WebSocket'ler ve HTTP

HTTP'nin aksine, WebSocket'lerde belirli bir bilgi istediğinizde sürekli olarak istek yapmanıza gerek yoktur. WebSocket'ler sizin için bir ağ bağlantısını sürdürür (doğru yapılırsa) ve değişiklikleri dinler.

Herhangi bir ağ bağlantısında olduğu gibi, bir WebSocket'in kesintisiz olarak sonsuza kadar açık kalacağını varsaymamalısınız, ancak kopan bağlantıları ve yeniden bağlanmayı manuel olarak doğru bir şekilde yönetmek zor olabilir. WebSocket'lerin bir diğer dezavantajı, yanıtta HTTP durum kodlarını değil, yalnızca hata mesajını almanızdır.

İstemci kütüphaneleri bunu sizin için halledebilir. Örneğin, Viem'in WebSocket aktarımı (yeni sekmede açılır) soket hatasında yeniden bağlanır ve varsayılan olarak bağlantıyı canlı tutma (keep-alive) ping'leri gönderir.

Deneyin

Bir Ethereum düğümü için bir WebSocket URL'sine ihtiyacınız vardır. Düğüm sağlayıcıları, bir uygulama programlama arayüzü (API) anahtarı oluşturduğunuzda size genellikle wss://<provider-host>/<your-api-key> biçiminde bir tane verir. Örneğin, bir Alchemy Ethereum Ana Ağı URL'si wss://eth-mainnet.g.alchemy.com/v2/<your-api-key> şeklindedir (ücretsiz bir Alchemy hesabı için kaydolun (yeni sekmede açılır)). Diğer sağlayıcılar için hizmet olarak düğümlere bakın veya kendi düğümünüzün WebSocket uç noktasını kullanın. wss://ethereum-rpc.publicnode.com gibi genel uç noktalar da hızlı denemeler için işe yarar, ancak bunlar hız sınırlamalıdır ve her abonelik türünü desteklemeyebilir.

WebSocket'leri test etmenin en kolay yolu, wscat (yeni sekmede açılır) gibi WebSocket istekleri yapmak için bir komut satırı aracı yüklemektir. wscat kullanarak aşağıdaki gibi istekler gönderebilirsiniz:

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

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

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

> ile başlayan satırlar sizin yazdıklarınızdır ve < ile başlayan satırlar düğümün geri gönderdikleridir.

WebSocket'ler nasıl kullanılır

Başlamak için, sağlayıcınızın WebSocket URL'sini kullanarak bir WebSocket açın. Alchemy ile, uygulamanızı kontrol panelinde (yeni sekmede açılır) açıp uygulama programlama arayüzü (API) anahtarını görüntüleyerek bulabilirsiniz. Çoğu sağlayıcı her ikisi için de aynı API anahtarını kullansa da, WebSocket'ler için URL'nin (wss://) HTTP istekleri için URL'den (https://) farklı olduğunu unutmayın.

Sağlayıcınızın desteklediği JSON-RPC yöntemlerinden herhangi biri WebSocket üzerinden kullanılabilir. Bunu yapmak için, bir HTTP POST isteğinin gövdesi olarak gönderilecek olan aynı yükü kullanın, ancak bunun yerine bu yükü WebSocket üzerinden gönderin.

Web3 ile

Viem (yeni sekmede açılır) gibi bir istemci kütüphanesi kullanırken WebSocket'lere geçiş yapmak basittir. http aktarımı yerine WebSocket URL'nizle webSocket aktarımını kullanın. Örneğin, npm install viem komutundan sonra bunu index.mjs olarak kaydedin ve node index.mjs komutunu çalıştırın:

Abonelik API'si

Bir WebSocket üzerinden bağlandığınızda, iki ek yöntem kullanabilirsiniz: eth_subscribe ve eth_unsubscribe. Bu yöntemler, belirli olayları dinlemenize ve anında bildirim almanıza olanak tanır.

eth_subscribe

Belirtilen olaylar için yeni bir abonelik oluşturur. eth_subscribe hakkında daha fazla bilgi edinin (yeni sekmede açılır).

Parametreler

  1. Abonelik türleri
  2. İsteğe bağlı parametreler

İlk argüman, dinlenecek olayın türünü belirtir. İkinci argüman, ilk argümana bağlı olan ek seçenekler içerir. Farklı açıklama türleri, seçenekleri ve olay yükleri aşağıda açıklanmıştır.

Döndürülenler

Abonelik kimliği (ID): Bu kimlik, alınan tüm olaylara eklenecektir ve ayrıca eth_unsubscribe kullanılarak aboneliği iptal etmek için de kullanılabilir.

Abonelik olayları

Abonelik aktifken, aşağıdaki alanlara sahip nesneler olan olaylar alacaksınız:

  • jsonrpc: Her zaman "2.0"
  • method: Her zaman "eth_subscription"
  • params: Aşağıdaki alanlara sahip bir nesne:
    • subscription: Bu aboneliği oluşturan eth_subscribe çağrısı tarafından döndürülen abonelik kimliği.
    • result: İçeriği abonelik türüne bağlı olarak değişen bir nesne.

Abonelik türleri

  1. newHeads

Zincire yeni bir başlık eklendiğinde, bir zincir yeniden düzenlemesi (reorg) sırasında da dahil olmak üzere bir olay yayınlar.

Bir zincir yeniden düzenlemesi meydana geldiğinde, bu abonelik yeni zincir için tüm yeni başlıkları içeren bir olay yayınlayacaktır. Özellikle bu, aynı yüksekliğe sahip birden fazla başlığın yayınlandığını görebileceğiniz anlamına gelir ve bu gerçekleştiğinde, yeniden düzenlemeden sonraki başlık doğru olan olarak kabul edilmelidir.

Örnek:

  1. logs

Belirtilen filtre kriterleriyle eşleşen, yeni eklenen blokların parçası olan günlükleri (log) yayınlar.

Bir zincir yeniden düzenlemesi meydana geldiğinde, eski zincirdeki blokların parçası olan günlükler, removed özelliği true olarak ayarlanarak tekrar yayınlanacaktır. Ayrıca, yeni zincirdeki blokların parçası olan günlükler yayınlanır, bu da bir yeniden düzenleme durumunda aynı işlem için günlükleri birden çok kez görmenin mümkün olduğu anlamına gelir.

Parametreler

  1. Aşağıdaki alanlara sahip bir nesne:
    • address (isteğe bağlı): bir adresi temsil eden bir dize veya bu tür dizelerden oluşan bir dizi.
      • Yalnızca bu adreslerden birinden oluşturulan günlükler yayınlanacaktır.
    • topics: konu belirleyicilerinden oluşan bir dizi.
      • Her konu belirleyici ya null, bir konuyu temsil eden bir dize ya da dizelerden oluşan bir dizidir.
      • Dizide null olmayan her konum, yayınlanan günlükleri yalnızca o konumda verilen konulardan birine sahip olanlarla sınırlar.

Konu belirlemelerine bazı örnekler:

  • []: Herhangi bir konuya izin verilir.
  • [A]: İlk konumda A (ve sonrasında herhangi bir şey).
  • [null, B]: İlk konumda herhangi bir şey ve ikinci konumda B (ve sonrasında herhangi bir şey).
  • [A, B]: İlk konumda A ve ikinci konumda B (ve sonrasında herhangi bir şey).
  • [[A, B], [A, B]]: İlk konumda (A veya B) ve ikinci konumda (A veya B) (ve sonrasında herhangi bir şey).

Örnek:

Bu örnek, Ethereum Ana Ağı üzerindeki WETH sözleşmesinden (yeni sekmede açılır) gelen Deposit olaylarını dinler:

  1. newPendingTransactions

Düğümün beklemedeki durumuna (bellek havuzuna) eklenen her işlemin hash'ini yayınlar.

Örnek:

> {"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"}}

Bazı sağlayıcılar kendi abonelik türlerini de sunar. Örneğin, Alchemy'nin alchemy_pendingTransactions (yeni sekmede açılır) aboneliği yalnızca hash'ler yerine tam işlem nesneleri yayınlar ve isteğe bağlı fromAddress, toAddress ve hashesOnly filtrelerini kabul eder. Bunlar standart JSON-RPC uygulama programlama arayüzünün (API) bir parçası değildir, bu nedenle yalnızca o sağlayıcıyla çalışırlar.

eth_unsubscribe

Daha fazla olay gönderilmemesi için mevcut bir aboneliği iptal eder.

Parametreler

  1. Daha önce bir eth_subscribe çağrısından döndürülen Abonelik Kimliği (ID).

Döndürülenler

Bir abonelik başarıyla iptal edildiyse true, verilen kimliğe sahip bir abonelik yoksa false.

Bir abonelik yalnızca onu oluşturan WebSocket bağlantısında mevcuttur, bu nedenle eth_unsubscribe aynı bağlantı üzerinden gönderilmelidir. Ayrı bir HTTP isteği olarak gönderilemez. Bağlantının kapatılması, tüm aboneliklerini de iptal eder.

Örnek:

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

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

Ücretsiz olarak Alchemy'ye kaydolun (yeni sekmede açılır), Alchemy'nin belgelerine (yeni sekmede açılır) göz atın ve en son haberler için Alchemy'yi Twitter'da (yeni sekmede açılır) takip edin.