Ana içeriğe geç

WebSocket'leri Kullanmak

alchemy
websocket'ler
sorgulama
javascript
Acemi
Elan Halpern
1 Aralık 2020
5 dakikalık okuma

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)WebSockets ve 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), herhangi bir yapılandırma gerektirmeden WebSocket arızaları ve yeniden denemeler için otomatik olarak işleme ekler.

Deneyin

WebSockets'i 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. Buradan ücretsiz bir Alchemy hesabı için kaydolun! (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

WebSockets 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) uygulamanın sayfasını açıp "Anahtarı Görüntüle"ye 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

Abonelik API'si

Bir WebSocket aracılığıyla bağlandığı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.

Geri Dönüşler

Abonelik ID'si: Bu ID, alınan tüm olaylara eklenecektir ve 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: Şu alanları içeren bir nesne:
    • subscription: Bu aboneliği oluşturan eth_subscribe ç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ı web3.eth.subscribe("pendingTransactions") ile benzer şekilde bekleyen işlemlere abone olur, ancak yalnızca işlem karmalarını değil, 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
  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
  1. logs

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

Bir zincir yeniden düzenlemesi gerçekleştiğinde, eski zincirdeki blokların parçası olan günlükler, removed özelliği true olarak ayarlanmış bir şekilde yeniden yayınlanı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çlerinden oluşan bir dizi.
      • Her konu belirteci null, bir konuyu temsil eden bir dize veya dizelerden oluşan bir dizi olabilir.
      • Dizide null olmayan her konum, yayılan günlükleri 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]: İ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:

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

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ülmüş olan Abonelik ID'si.

Dönüşler

Bir abonelik başarıyla iptal edildiyse true, verilen ID'ye sahip 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}

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

Sayfanın son güncellenmesi: 1 Ekim 2025

Bu rehber yararlı oldu mu?