Ana içeriğe geç

WebSocket'leri Kullanmak

alchemywebsocket'lersorgulamajavascript
Acemi
Elan Halpern
Alchemy belgeleri(opens in a new tab)
1 Aralık 2020
5 dakikalık okuma minute read

Bu, Ethereum blok zincirine talepte bulunmak için WebSocket'leri ve Alchemy'yi kullanmak için giriş seviyesinde bir kılavuzdur.

(opens in a new tab)WebSocket'ler ile HTTP Karşılaştırması

HTTP'den farklı olarak WebSocket'ler ile belirli bilgiler istediğinizde sürekli olarak istekte bulunmanız gerekmez. WebSocket'ler (doğru yapılırsa), sizin için bir ağ bağlantısı sağlar 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ın doğru bir şekilde düzeltilmesi ve elle yeniden bağlantının düzgün yapılması zor olabilir. WebSocket'lerin bir diğer dezavantajı, yanıtta HTTP durum kodlarını değil, yalnızca hata mesajını almanızdır.

Alchemy Web3(opens in a new tab), yapılandırma gerektirmeden WebSocket arızaları ve yeniden denemeler için otomatik olarak işleme ekler.

Deneyin

WebSocket'leri test etmenin en kolay yolu, wscat(opens in a new tab) gibi WebSocket istekleri yapmak için bir komut satırı aracı yüklemektir. Şunlar gibi istekleri wscat kullanarak gönderebilirsiniz:

Not: Bir Alchemy hesabınız varsa demo'yu kendi API anahtarınızla değiştirebilirsiniz. Ücretsiz bir Alchemy hesabı için buradan üye olun!(opens in a new tab)

1wscat -c wss://eth-mainnet.ws.alchemyapi.io/ws/demo
2
3> {"jsonrpc": "2.0", "id": 0, "method": "eth_gasPrice"}
4
5< {"jsonrpc": "2.0", "result": "0xb2d05e00", "id": 0}
6

WebSocket'ler nasıl kullanılır

Başlamak için uygulamanızın WebSocket URL'sini kullanarak bir WebSocket açın. Uygulamanızın WebSocket URL'sini gösterge panelinizde(opens in a new tab) uygulama sayfasını açıp "View Key"e (Anahtarı Görüntüle) tıklayarak bulabilirsiniz. Uygulamanızın WebSocket URL'sinin, HTTP istekleri URL'sinden farklı olduğunu, ancak her ikisinin de "View Key"e tıklanarak bulunabileceğini unutmayın.

Alchemy gösterge panelinizde WebSocket URL'nizi nerede bulabilirsiniz

Alchemy API Referansında(opens in a new tab) listelenen API'lerden herhangi biri WebSocket aracılığıyla kullanılabilir. Bunu yapmak için, HTTP POST isteğinin gövdesi olarak gönderilecek yükün aynısını kullanın, bunun yerine bu yükü WebSocket aracılığıyla gönderin.

Web3 ile

Web3 gibi bir istemci kütüphanesi kullanırken WebSocket'lere geçiş yapmak basittir. Web3 istemcinizi başlatırken HTTP URL'si yerine WebSocket URL'sini iletin. Örneğin:

1const web3 = new Web3("wss://eth-mainnet.ws.alchemyapi.io/ws/your-api-key")
2
3web3.eth.getBlockNumber().then(console.log) // -> 7946893
Kopyala

Abonelik API

Bir WebSocket aracılığıyla bağlanıldığınızda, iki ek yöntem kullanabilirsiniz: eth_subscribe ve eth_unsubscribe. Bu yöntemler, belirli olayları dinlemenizi ve anında haberdar olmanızı sağlar.

eth_subscribe

Belirtilen olaylar için yeni bir abonelik oluşturur. eth_subscribe hakkında daha fazla bilgi edinin(opens in a new tab).

Parametreler

  1. Abonelik türleri
  2. Opsiyonel parametreler

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

Dönüşler

Abonelik ID'si: Bu ID, alınan tüm etkinliklere eklenecektir ve ayrıca eth_unsubscribe kullanılarak aboneliği iptal etmek için de kullanılabilir.

Abonelik etkinlikleri

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

  • jsonrpc: Her zaman "2.0"
  • method: Her zaman "eth_subscription"
  • params: Şu alanları içeren bir nesne:
    • subscription: Bu aboneliği oluşturan eth_subscription çağrısı tarafından döndürülen abonelik ID'si.
    • result: İçeriği abonelik türüne göre değişen bir nesne.

Abonelik türleri

  1. alchemy_newFullPendingTransactions

Bekleme durumuna eklenen tüm işlemler için işlem bilgilerini döndürür. Bu abonelik türü, standart Web3 çağrısınaweb3.eth.subscribe("pendingTransactions") benzer şekilde bekleyen işlemlere abone olur, ancak yalnızca işlem hash değerleri yerine tam işlem bilgilerini yayması bakımından farklılık gösterir.

Örnek:

1> {"jsonrpc": "2.0", "id": 1, "method": "eth_subscribe", "params": ["alchemy_newFullPendingTransactions"]}
2
3< {"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 }
26
Tümünü göster
Kopyala
  1. newHeads

Zincirin yeniden düzenlenmesi de dahil olmak üzere, zincire her yeni başlık eklendiğinde bir olay yayar.

Zincirin yeniden düzenlenmesi gerçekleştiğinde, bu abonelik yeni zincir için tüm yeni başlıkları içeren bir olay yayacaktır. Bu, özellikle aynı yükseklikte birden fazla başlık görebileceğiniz anlamına gelir ve bu olduğunda sonraki başlık, yeniden düzenlemeden sonra doğru olan olarak alınmalıdır.

Örnek:

1> {"jsonrpc": "2.0", "id": 1, "method": "eth_subscribe", "params": ["newHeads"]}
2
3< {"jsonrpc":"2.0","id":2,"result":"0x9ce59a13059e417087c02d3236a0b1cc"}
4< {
5 "jsonrpc": "2.0",
6 "method": "eth_subscription",
7 "params": {
8 "result": {
9 "extraData": "0xd983010305844765746887676f312e342e328777696e646f7773",
10 "gasLimit": "0x47e7c4",
11 "gasUsed": "0x38658",
12 "logsBloom":
13"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
14 "nonce": "0x084149998194cc5f",
15 "number": "0x1348c9",
16 "parentHash": "0x7736fab79e05dc611604d22470dadad26f56fe494421b5b333de816ce1f25701",
17 "receiptRoot": "0x2fab35823ad00c7bb388595cb46652fe7886e00660a01e867824d3dceb1c8d36",
18 "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
19 "stateRoot": "0xb3346685172db67de536d8765c43c31009d0eb3bd9c501c9be3229203f15f378",
20 "timestamp": "0x56ffeff8",
21 "transactionsRoot": "0x0167ffa60e3ebc0b080cdb95f7c0087dd6c0e61413140e39d94d3468d7c9689f"
22 },
23 "subscription": "0x9ce59a13059e417087c02d3236a0b1cc"
24 }
25}
26
Tümünü göster
Kopyala
  1. logs

Belirtilen filtre kriterleriyle eşleşen yeni eklenen blokların parçası olan kayıtları yayar.

Zincirin yeniden düzenlenmesi gerçekleştiğinde, eski zincirdeki blokların parçası olan günlükler, removed özelliği true olarak ayarlanmış olarak yeniden yayınlanacaktır. Ayrıca, yeni zincirdeki blokların parçası olan kayıtlar yayınlanır, yani yeniden düzenleme durumunda aynı işlem için kayıtları birden çok kez görmek mümkündür.

Parametreler

  1. Aşağıdaki alanlara sahip bir nesne:
    • address (isteğe bağlı): bir adresi temsil eden bir dize veya bu tür dizelerin bir dizisi.
      • Yalnızca bu adreslerden birinden oluşturulan kayıtlar yayınlanacaktır.
    • topics: konu belirteçlerinin bir listesi.
      • Her konu belirteci null, bir konuyu temsil eden bir dize veya dizelerden oluşan bir dizi olabilir.
      • Dizideki null olmayan her pozisyon, yayılan kayıtları yalnızca o konumda verilen konulardan birine sahip olanlarla sınırlar.

Konu belirteçlerine ilişkin bazı örnekler:

  • []: Herhangi bir konuya izin verilir.
  • [A]: A ilk pozisyonda (veya sonraki herhangi biri).
  • [null, B]: Birinci pozisyondaki herhangi bir şey ve ikinci pozisyondaki B (ve sonraki herhangi bir şey).
  • [A, B]: A birinci pozisyonda ve B ikinci pozisyonda (ve sonrasında herhangi bir şey).
  • [[A, B], [A, B]]: (A veya B) birinci pozisyonda ve (A veya B) ikinci pozisyonda (ve sonrasında herhangi bir şey).

Örnek:

1> {"jsonrpc": "2.0", "id": 1, "method": "eth_subscribe", "params": ["logs", {"address": "0x8320fe7702b96808f7bbc0d4a888ed1468216cfd", "topics": ["0xd78a0cb8bb633d06981248b816e7bd33c2a35a6089241d099fa519e361cab902"]}]}
2
3< {"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}
21
Tümünü göster
Kopyala

eth_unsubscribe

Başka bir olayın 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 ID'si.

Dönüşler

Bir abonelik başarıyla iptal edildiyse true veya verilen ID'de hiçbir abonelik yoksa false.

Örnek:

İstek

1curl https://eth-mainnet.alchemyapi.io/v2/your-api-key
2-X POST
3-H "Content-Type: application/json"
4-d '{"id": 1, "method": "eth_unsubscribe", "params": ["0x9cef478923ff08bf67fde6c64013158d"]}'
5
6

Sonuç

1{
2 "jsonrpc": "2.0",
3 "id": 1,
4 "result": true
5}
Kopyala

Alchemy'ye ücretsiz kaydolun(opens in a new tab), belgelerimize(opens in a new tab) göz atın ve en son haberler için bizi Twitter(opens in a new tab)'da takip edin.

Son düzenleme: @kaanmetu(opens in a new tab), 19 Ocak 2024

Bu rehber yararlı oldu mu?