WebSocket'leri Kullanmak
Bu, Ethereum Blokzincirine istekler yapmak için WebSocket'leri ve Alchemy'yi kullanmaya yönelik giriş seviyesinde bir rehberdir.
(opens in a new tab)WebSocket'ler ve HTTP
HTTP'nin aksine, WebSocket'ler ile 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 ele almak 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), hiçbir yapılandırma gerektirmeden WebSocket hataları 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. wscat kullanarak istekleri aşağıdaki gibi gönderebilirsiniz:
Not: Bir Alchemy hesabınız varsa demo kısmını kendi API anahtarınızla değiştirebilirsiniz. Buradan ücretsiz bir Alchemy hesabına kaydolun! (opens in a new tab)
wscat -c wss://eth-mainnet.ws.alchemyapi.io/ws/demo
> {"jsonrpc": "2.0", "id": 0, "method": "eth_gasPrice"}
< {"jsonrpc": "2.0", "result": "0xb2d05e00", "id": 0}
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, kontrol panelinizde (opens in a new tab) uygulamanın sayfasını açıp "View Key" (Anahtarı Görüntüle) seçeneğine tıklayarak bulabilirsiniz. Uygulamanızın WebSocket'ler için olan URL'sinin HTTP istekleri için olan URL'sinden farklı olduğunu, ancak her ikisinin de "View Key" seçeneğine tıklanarak bulunabileceğini unutmayın.
Alchemy API Referansı (opens in a new tab) içinde listelenen API'lerin herhangi biri WebSocket aracılığıyla kullanılabilir. Bunu yapmak için, bir HTTP POST isteğinin gövdesi olarak gönderilecek olan aynı yükü kullanın, ancak bu yükü bunun yerine WebSocket üzerinden 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 iletmeniz yeterlidir. Örneğin:
const web3 = new Web3("wss://eth-mainnet.ws.alchemyapi.io/ws/your-api-key")
web3.eth.getBlockNumber().then(console.log) // -> 7946893
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 (opens in a new tab).
Parametreler
- Abonelik türleri
- İ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şturaneth_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
alchemy_newFullPendingTransactions
Bekleyen duruma 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")'a benzer şekilde bekleyen işlemlere abone olur, ancak yalnızca işlem karmaları (hash) yerine tam işlem bilgilerini yayması bakımından farklılık gösterir.
Örnek:
> {"jsonrpc": "2.0", "id": 1, "method": "eth_subscribe", "params": ["alchemy_newFullPendingTransactions"]}
< {"id":1,"result":"0x9a52eeddc2b289f985c0e23a7d8427c8","jsonrpc":"2.0"}
< {
"jsonrpc":"2.0",
"method":"eth_subscription",
"params":{
"result":{
"blockHash":null,
"blockNumber":null,
"from":"0xa36452fc31f6f482ad823cd1cf5515177d57667f",
"gas":"0x1adb0",
"gasPrice":"0x7735c4d40",
"hash":"0x50bff0736c713458c92dd1848d12f3354149be1363123dae35e94e0f2a9d56bf",
"input":"0xa9059cbb0000000000000000000000000d0707963952f2fba59dd06f2b425ace40b492fe0000000000000000000000000000000000000000000015b1111266cfca100000",
"nonce":"0x0",
"to":"0xea38eaa3c86c8f9b751533ba2e562deb9acded40",
"transactionIndex":null,
"value":"0x0",
"v":"0x26",
"r":"0x195c2c1ed126088e12d290aa93541677d3e3b1d10f137e11f86b1b9227f01e3b",
"s":"0x60fc4edbf1527832a2a36dbc1e63ed6193a6eee654472fbebbf88ef1750b5344"},
"subscription":"0x9a52eeddc2b289f985c0e23a7d8427c8"
}
}
newHeads
Bir Zincir yeniden düzenleme süreci de dahil olmak üzere, Zincire yeni bir başlık eklendiğinde her zaman bir olay yayar.
Bir Zincir yeniden düzenleme gerçekleştiğinde, bu abonelik yeni Zincir için tüm yeni başlıkları içeren bir olay yayacaktır. Özellikle bu, aynı yükseklikte yayılan birden fazla başlık görebileceğiniz anlamına gelir ve bu gerçekleştiğinde, yeniden düzenleme sonrasında daha sonraki başlık doğru olan olarak kabul edilmelidir.
Örnek:
> {"jsonrpc": "2.0", "id": 1, "method": "eth_subscribe", "params": ["newHeads"]}
< {"jsonrpc":"2.0","id":2,"result":"0x9ce59a13059e417087c02d3236a0b1cc"}
< {
"jsonrpc": "2.0",
"method": "eth_subscription",
"params": {
"result": {
"extraData": "0xd983010305844765746887676f312e342e328777696e646f7773",
"gasLimit": "0x47e7c4",
"gasUsed": "0x38658",
"logsBloom":
"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"nonce": "0x084149998194cc5f",
"number": "0x1348c9",
"parentHash": "0x7736fab79e05dc611604d22470dadad26f56fe494421b5b333de816ce1f25701",
"receiptRoot": "0x2fab35823ad00c7bb388595cb46652fe7886e00660a01e867824d3dceb1c8d36",
"sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
"stateRoot": "0xb3346685172db67de536d8765c43c31009d0eb3bd9c501c9be3229203f15f378",
"timestamp": "0x56ffeff8",
"transactionsRoot": "0x0167ffa60e3ebc0b080cdb95f7c0087dd6c0e61413140e39d94d3468d7c9689f"
},
"subscription": "0x9ce59a13059e417087c02d3236a0b1cc"
}
}
logs
Belirtilen filtre kriterleriyle eşleşen yeni eklenen blokların parçası olan günlükleri (log) yayar.
Bir Zincir yeniden düzenleme gerçekleştiğinde, eski Zincirdeki blokların parçası olan günlükler, removed özelliği true olarak ayarlanmış şekilde tekrar yayılacaktır. Ayrıca, yeni Zincirdeki blokların parçası olan günlükler yayılı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
- 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ılacaktır.
topics: konu belirleyicilerinden oluşan bir dizi.- Her konu belirleyicisi ya
null, bir konuyu temsil eden bir dize ya da dizelerden oluşan bir dizidir. - Dizide
nullolmayan her konum, yayılan günlükleri yalnızca o konumda verilen konulardan birine sahip olanlarla sınırlar.
- Her konu belirleyicisi ya
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:
> {"jsonrpc": "2.0", "id": 1, "method": "eth_subscribe", "params": ["logs", {"address": "0x8320fe7702b96808f7bbc0d4a888ed1468216cfd", "topics": ["0xd78a0cb8bb633d06981248b816e7bd33c2a35a6089241d099fa519e361cab902"]}]}
< {"jsonrpc":"2.0","id":2,"result":"0x4a8a4c0517381924f9838102c5a4dcb7"}
< {
"jsonrpc": "2.0",
"method": "eth_subscription",
"params": {
"subscription": "0x4a8a4c0517381924f9838102c5a4dcb7",
"result": {
"address": "0x8320fe7702b96808f7bbc0d4a888ed1468216cfd",
"blockHash": "0x61cdb2a09ab99abf791d474f20c2ea89bf8de2923a2d42bb49944c8c993cbf04",
"blockNumber": "0x29e87",
"data": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003",
"logIndex":"0x0",
"topics":["0xd78a0cb8bb633d06981248b816e7bd33c2a35a6089241d099fa519e361cab902"],
"transactionHash": "0xe044554a0a55067caafd07f8020ab9f2af60bdfe337e395ecd84b4877a3d1ab4",
"transactionIndex": "0x0"
}
}
}
eth_unsubscribe
Daha fazla olay gönderilmemesi için mevcut bir aboneliği iptal eder.
Parametreler
- Daha önce bir
eth_subscribeçağrısından döndürülen Abonelik kimliği.
Döndürülenler
Bir abonelik başarıyla iptal edildiyse true, veya verilen kimliğe sahip bir abonelik yoksa false.
Örnek:
İstek
curl https://eth-mainnet.alchemyapi.io/v2/your-api-key
-X POST
-H "Content-Type: application/json"
-d '{"id": 1, "method": "eth_unsubscribe", "params": ["0x9cef478923ff08bf67fde6c64013158d"]}'
Sonuç
{
"jsonrpc": "2.0",
"id": 1,
"result": true
}
Ücretsiz olarak Alchemy'ye 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) üzerinden takip edin.
