WebSockets பயன்படுத்துதல்
இது எத்திரியம் தொகுதிச்சங்கிலிக்குக் கோரிக்கைகளைச் செய்ய WebSockets-ஐப் பயன்படுத்துவதற்கான ஒரு தொடக்க நிலை வழிகாட்டியாகும். எடுத்துக்காட்டுகள் நிலையான ஜேசன்-ஆர்பிசி முறைகளைப் பயன்படுத்துகின்றன, எனவே அவை Alchemy உட்பட WebSocket இறுதிப்புள்ளியை (endpoint) வழங்கும் எந்தவொரு கணு அல்லது கணு வழங்குநருடனும் வேலை செய்யும்.
(புதிய தாவலில் திறக்கும்)WebSockets மற்றும் HTTP
HTTP-ஐப் போலல்லாமல், WebSockets மூலம், உங்களுக்குக் குறிப்பிட்ட தகவல் தேவைப்படும்போது நீங்கள் தொடர்ந்து கோரிக்கைகளைச் செய்ய வேண்டியதில்லை. WebSockets உங்களுக்காக ஒரு பிணைய இணைப்பைப் பராமரிக்கின்றன (சரியாகச் செய்யப்பட்டால்) மற்றும் மாற்றங்களைக் கவனிக்கின்றன.
எந்தவொரு பிணைய இணைப்பைப் போலவே, ஒரு WebSocket தடையின்றி எப்போதும் திறந்திருக்கும் என்று நீங்கள் கருதக்கூடாது, ஆனால் துண்டிக்கப்பட்ட இணைப்புகளைச் சரியாகக் கையாள்வது மற்றும் கைமுறையாக மீண்டும் இணைப்பது சவாலானதாக இருக்கலாம். WebSockets-இன் மற்றொரு குறைபாடு என்னவென்றால், பதிலில் HTTP நிலைக் குறியீடுகளைப் (status codes) பெற முடியாது, பிழைச் செய்தியை மட்டுமே பெற முடியும்.
கிளையண்ட் நிரலகங்கள் உங்களுக்காக இதைக் கையாள முடியும். எடுத்துக்காட்டாக, viem-இன் WebSocket transport (புதிய தாவலில் திறக்கும்) சாக்கெட் தோல்வியடையும் போது மீண்டும் இணைக்கிறது மற்றும் இயல்புநிலையாக keep-alive பிங்குகளை அனுப்புகிறது.
இதை முயன்று பாருங்கள்
உங்களுக்கு ஒரு எத்திரியம் கணுவிற்கான WebSocket URL தேவை. நீங்கள் ஒரு பயன்பாட்டு நிரலாக்க இடைமுகத் (API) திறவுகோலை உருவாக்கும்போது கணு வழங்குநர்கள் உங்களுக்கு ஒன்றை வழங்குகிறார்கள், இது பொதுவாக wss://<provider-host>/<your-api-key> என்ற வடிவத்தில் இருக்கும். எடுத்துக்காட்டாக, ஒரு Alchemy எத்தேரியம் முதன்மை வலைப்பின்னல் URL wss://eth-mainnet.g.alchemy.com/v2/<your-api-key> என்பது போல் இருக்கும் (இலவச Alchemy கணக்கிற்குப் பதிவு செய்யவும் (புதிய தாவலில் திறக்கும்)). பிற வழங்குநர்களுக்கு சேவையாகக் கணுக்கள் என்பதைப் பார்க்கவும் அல்லது உங்கள் சொந்த கணுவின் WebSocket இறுதிப்புள்ளியைப் பயன்படுத்தவும். wss://ethereum-rpc.publicnode.com போன்ற பொது இறுதிப்புள்ளிகளும் விரைவான சோதனைகளுக்கு வேலை செய்யும், ஆனால் அவை வரம்பிடப்பட்டவை (rate-limited) மற்றும் ஒவ்வொரு சந்தா வகையையும் ஆதரிக்காமல் போகலாம்.
WebSockets-ஐச் சோதிப்பதற்கான எளிதான வழி, wscat (புதிய தாவலில் திறக்கும்) போன்ற WebSocket கோரிக்கைகளைச் செய்வதற்கான கட்டளை வரி கருவியை (command line tool) நிறுவுவதாகும். wscat-ஐப் பயன்படுத்தி, நீங்கள் பின்வருமாறு கோரிக்கைகளை அனுப்பலாம்:
npx wscat -c wss://<provider-host>/<your-api-key>
> {"jsonrpc": "2.0", "id": 0, "method": "eth_gasPrice"}
< {"jsonrpc": "2.0", "result": "0x41f9de2", "id": 0}
> என்று தொடங்கும் வரிகள் நீங்கள் தட்டச்சு செய்பவை, மற்றும் < என்று தொடங்கும் வரிகள் கணு திருப்பி அனுப்புபவை.
WebSockets-ஐ எவ்வாறு பயன்படுத்துவது
தொடங்க, உங்கள் வழங்குநரின் WebSocket URL-ஐப் பயன்படுத்தி ஒரு WebSocket-ஐத் திறக்கவும். Alchemy மூலம், டாஷ்போர்டில் (புதிய தாவலில் திறக்கும்) உங்கள் பயன்பாட்டைத் திறந்து அதன் பயன்பாட்டு நிரலாக்க இடைமுகத் (API) திறவுகோலைப் பார்ப்பதன் மூலம் அதைக் கண்டறியலாம். பெரும்பாலான வழங்குநர்கள் இரண்டிற்கும் ஒரே API திறவுகோலைப் பயன்படுத்தினாலும், WebSockets-க்கான URL (wss://) HTTP கோரிக்கைகளுக்கான URL-லிருந்து (https://) வேறுபட்டது என்பதை நினைவில் கொள்ளவும்.
உங்கள் வழங்குநர் ஆதரிக்கும் எந்தவொரு ஜேசன்-ஆர்பிசி முறைகளையும் WebSocket வழியாகப் பயன்படுத்தலாம். அவ்வாறு செய்ய, HTTP POST கோரிக்கையின் உடலாக (body) அனுப்பப்படும் அதே பேலோடைப் (payload) பயன்படுத்தவும், ஆனால் அதற்குப் பதிலாக அந்த பேலோடை WebSocket மூலம் அனுப்பவும்.
Web3 உடன்
viem (புதிய தாவலில் திறக்கும்) போன்ற கிளையண்ட் நிரலகத்தைப் பயன்படுத்தும் போது WebSockets-க்கு மாறுவது எளிது. http transport-க்குப் பதிலாக உங்கள் WebSocket URL உடன் webSocket transport-ஐப் பயன்படுத்தவும். எடுத்துக்காட்டாக, npm install viem-க்குப் பிறகு, இதை index.mjs ஆகச் சேமித்து node index.mjs-ஐ இயக்கவும்:
import { createPublicClient, webSocket } from "viem"
import { mainnet } from "viem/chains"
const client = createPublicClient({
chain: mainnet,
transport: webSocket("wss://<provider-host>/<your-api-key>"),
})
console.log(await client.getBlockNumber()) // -> 26243602n
// அதே WebSocket வழியாக புதிய தொகுதிகளுக்கு குழுசேரவும்
const unwatch = client.watchBlocks({
onBlock: (block) => {
console.log(block.number, block.hash)
unwatch()
process.exit(0)
},
})
சந்தா API
WebSocket மூலம் இணைக்கப்படும் போது, நீங்கள் இரண்டு கூடுதல் முறைகளைப் பயன்படுத்தலாம்: eth_subscribe மற்றும் eth_unsubscribe. இந்த முறைகள் குறிப்பிட்ட நிகழ்வுகளைக் கவனிக்கவும் உடனடியாக அறிவிக்கப்படவும் உங்களை அனுமதிக்கும்.
eth_subscribe
குறிப்பிட்ட நிகழ்வுகளுக்குப் புதிய சந்தாவை உருவாக்குகிறது. eth_subscribe பற்றி மேலும் அறிக (புதிய தாவலில் திறக்கும்).
அளவுருக்கள் (Parameters)
- சந்தா வகைகள்
- விருப்ப அளவுருக்கள்
முதல் வாதம் (argument) எந்த வகையான நிகழ்வைக் கவனிக்க வேண்டும் என்பதைக் குறிப்பிடுகிறது. இரண்டாவது வாதம் முதல் வாதத்தைப் பொறுத்து கூடுதல் விருப்பங்களைக் கொண்டுள்ளது. வெவ்வேறு விளக்க வகைகள், அவற்றின் விருப்பங்கள் மற்றும் அவற்றின் நிகழ்வு பேலோடுகள் கீழே விவரிக்கப்பட்டுள்ளன.
திருப்பியளிப்பவை (Returns)
சந்தா ID: இந்த ID பெறப்பட்ட எந்தவொரு நிகழ்வுகளுடனும் இணைக்கப்படும், மேலும் eth_unsubscribe-ஐப் பயன்படுத்தி சந்தாவை ரத்து செய்யவும் இதைப் பயன்படுத்தலாம்.
சந்தா நிகழ்வுகள்
சந்தா செயலில் இருக்கும்போது, பின்வரும் புலங்களைக் கொண்ட பொருள்களாக (objects) இருக்கும் நிகழ்வுகளைப் பெறுவீர்கள்:
jsonrpc: எப்போதும் "2.0"method: எப்போதும் "eth_subscription"params: பின்வரும் புலங்களைக் கொண்ட ஒரு பொருள்:subscription: இந்தச் சந்தாவை உருவாக்கியeth_subscribeஅழைப்பால் திருப்பியளிக்கப்பட்ட சந்தா ID.result: சந்தாவின் வகையைப் பொறுத்து உள்ளடக்கங்கள் மாறுபடும் ஒரு பொருள்.
சந்தா வகைகள்
newHeads
சங்கிலி மறுசீரமைப்பு உட்பட, சங்கிலியில் புதிய தலைப்பு (header) சேர்க்கப்படும் எந்த நேரத்திலும் ஒரு நிகழ்வை வெளியிடுகிறது.
ஒரு சங்கிலி மறுசீரமைப்பு நிகழும்போது, இந்தச் சந்தா புதிய சங்கிலிக்கான அனைத்து புதிய தலைப்புகளையும் கொண்ட ஒரு நிகழ்வை வெளியிடும். குறிப்பாக, ஒரே உயரத்தில் (height) பல தலைப்புகள் வெளியிடப்படுவதை நீங்கள் காணலாம், மேலும் இது நிகழும்போது, மறுசீரமைப்புக்குப் பிறகு பிந்தைய தலைப்பைச் சரியானதாக எடுத்துக்கொள்ள வேண்டும்.
எடுத்துக்காட்டு:
> {"jsonrpc": "2.0", "id": 1, "method": "eth_subscribe", "params": ["newHeads"]}
< {"jsonrpc":"2.0","result":"0xe0d4abf5caf333fbf94c5f02182e6469","id":1}
< {
"jsonrpc": "2.0",
"method": "eth_subscription",
"params": {
"result": {
"baseFeePerGas": "0x41f9de2",
"blobGasUsed": "0xc0000",
"difficulty": "0x0",
"excessBlobGas": "0xa88af38",
"extraData": "0xe29ca82051756173617220287175617361722e77696e2920e29ca8",
"gasLimit": "0x3938700",
"gasUsed": "0x1a17224",
"hash": "0xedc43a71b7ff13880bdbe7b748a225b91a11a91e79173fe28011363c10acaea5",
"logsBloom": "0x4beaef4e7dbb1bfdb3df673fab6cdf1cf9fc0e7f743d672c761551767b7dad953d79cf86e56e6195ae1b57dff20a0fd46e57c545af166ff49394df3839e269a6ff877b6baf9d899fd9666c58b7dfa7add4febf78b466e7f71af2dcbad53fdcfa3f7277d2fbfffcff953f9ef37b3af8fffb296a3adb94dc463ff0d6d5173f1beda0fd662d77eaedb34ff99f3eeed38a77e7d0cd63e917d4efbdfcb7d0d19437f98ff60773d0effbfbdfdbef9ebbf6a2c35efedd677a795d3ccd777e127eeb657f6a8dffaf64f3b8d998b516c78e661ef77fded57fb66d687fab17739b3ef5aa2765777d8cce0ef59a9ceebeceabbb7f76ed7fc65df7e8bccf7938eb3fb7de57f7",
"miner": "0x396343362be2a4da1ce0c1c210945346fb82aa49",
"mixHash": "0xa72c9201f502df607d0d7551ccc171ce37a5146747f04c6c495b0aebecb045c7",
"nonce": "0x0000000000000000",
"number": "0x1907212",
"parentBeaconBlockRoot": "0x34f3f289459913dd80ec9c20aa535866cd2bd310ac26e47570601e263d593735",
"parentHash": "0xe62c150ffbbd04e95343f945b70fa53756aba6c0bf96c0440d1ae354fa007a7c",
"receiptsRoot": "0x94951d882544da76e30b145b26a39b126e8acfba9db929351b84b2f4c847e3ed",
"requestsHash": "0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
"size": "0x1f4bc",
"stateRoot": "0x12771ea73858277034cf6604aee0abbf889c15091ab8ef9be81bf7258458a036",
"timestamp": "0x6ad92b47",
"transactionsRoot": "0xbd58ebe5c8c5519e458266a7db3ad049a7bffa106dc9a14f2fe6edb3f8ad5d70",
"withdrawalsRoot": "0x56a083b6140663c9e98c30167ee90a1ffb157505ba89cb584583b71cba100d2a"
},
"subscription": "0xe0d4abf5caf333fbf94c5f02182e6469"
}
}
logs
குறிப்பிடப்பட்ட வடிகட்டி (filter) அளவுகோல்களுடன் பொருந்தக்கூடிய புதிதாகச் சேர்க்கப்பட்ட தொகுதிகளின் (blocks) பகுதியாக இருக்கும் பதிவுகளை (logs) வெளியிடுகிறது.
ஒரு சங்கிலி மறுசீரமைப்பு நிகழும்போது, பழைய சங்கிலியில் உள்ள தொகுதிகளின் பகுதியாக இருக்கும் பதிவுகள் removed பண்பு true என அமைக்கப்பட்டு மீண்டும் வெளியிடப்படும். மேலும், புதிய சங்கிலியில் உள்ள தொகுதிகளின் பகுதியாக இருக்கும் பதிவுகள் வெளியிடப்படுகின்றன, அதாவது மறுசீரமைப்பு ஏற்பட்டால் ஒரே பரிவர்த்தனைக்கான பதிவுகளைப் பல முறை பார்க்க முடியும்.
அளவுருக்கள்
- பின்வரும் புலங்களைக் கொண்ட ஒரு பொருள்:
address(விருப்பத்திற்குரியது): ஒரு முகவரியைக் குறிக்கும் சரம் (string) அல்லது அத்தகைய சரங்களின் அணிவரிசை (array).- இந்த முகவரிகளில் ஒன்றிலிருந்து உருவாக்கப்பட்ட பதிவுகள் மட்டுமே வெளியிடப்படும்.
topics: தலைப்புக் குறிப்பான்களின் (topic specifiers) அணிவரிசை.- ஒவ்வொரு தலைப்புக் குறிப்பானும்
null, ஒரு தலைப்பைக் குறிக்கும் சரம் அல்லது சரங்களின் அணிவரிசையாக இருக்கும். nullஅல்லாத அணிவரிசையில் உள்ள ஒவ்வொரு நிலையும், அந்த நிலையில் கொடுக்கப்பட்ட தலைப்புகளில் ஒன்றைக் கொண்டவர்களுக்கு மட்டுமே வெளியிடப்பட்ட பதிவுகளைக் கட்டுப்படுத்துகிறது.
- ஒவ்வொரு தலைப்புக் குறிப்பானும்
தலைப்புக் குறிப்பீடுகளின் சில எடுத்துக்காட்டுகள்:
[]: எந்தத் தலைப்புகளும் அனுமதிக்கப்படும்.[A]: முதல் நிலையில் A (மற்றும் அதற்குப் பிறகு எதுவும்).[null, B]: முதல் நிலையில் எதுவும் மற்றும் இரண்டாவது நிலையில் B (மற்றும் அதற்குப் பிறகு எதுவும்).[A, B]: முதல் நிலையில் A மற்றும் இரண்டாவது நிலையில் B (மற்றும் அதற்குப் பிறகு எதுவும்).[[A, B], [A, B]]: முதல் நிலையில் (A அல்லது B) மற்றும் இரண்டாவது நிலையில் (A அல்லது B) (மற்றும் அதற்குப் பிறகு எதுவும்).
எடுத்துக்காட்டு:
இந்த எடுத்துக்காட்டு எத்தேரியம் முதன்மை வலைப்பின்னலில் உள்ள WETH ஒப்பந்தத்திலிருந்து (புதிய தாவலில் திறக்கும்) Deposit நிகழ்வுகளைக் கவனிக்கிறது:
> {"jsonrpc": "2.0", "id": 1, "method": "eth_subscribe", "params": ["logs", {"address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", "topics": ["0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c"]}]}
< {"jsonrpc":"2.0","result":"0x69a0e61ae8e3d61a93479858e8f1b43a","id":1}
< {
"jsonrpc": "2.0",
"method": "eth_subscription",
"params": {
"result": {
"address": "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
"blockHash": "0x168e06e5733df993078bb635cb9925f80ff39d12a36bd301052c44d7bf6b6068",
"blockNumber": "0x190720e",
"blockTimestamp": "0x6ad92b17",
"data": "0x000000000000000000000000000000000000000000000000039ed0c3d7848a1c",
"logIndex": "0x11",
"removed": false,
"topics": [
"0xe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c",
"0x00000000000000000000000023617e59a5925b2a4bf75d73ff6711cd0b29de85"
],
"transactionHash": "0xc956e7012c2af8ff87db88e059336842ee872bfc93de1eac9760510d0bd801be",
"transactionIndex": "0xb"
},
"subscription": "0x69a0e61ae8e3d61a93479858e8f1b43a"
}
}
newPendingTransactions
கணுவின் நிலுவையில் உள்ள நிலையில் (அதன் மெம்பூல்) சேர்க்கப்படும் ஒவ்வொரு பரிவர்த்தனையின் ஹாஷையும் வெளியிடுகிறது.
எடுத்துக்காட்டு:
> {"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"}}
சில வழங்குநர்கள் தங்களது சொந்த சந்தா வகைகளையும் வழங்குகிறார்கள். எடுத்துக்காட்டாக, Alchemy-இன் alchemy_pendingTransactions (புதிய தாவலில் திறக்கும்) வெறும் ஹாஷ்களுக்குப் பதிலாக முழுப் பரிவர்த்தனைப் பொருள்களை வெளியிடுகிறது, மேலும் விருப்பத்திற்குரிய fromAddress, toAddress மற்றும் hashesOnly வடிகட்டிகளை ஏற்றுக்கொள்கிறது. இவை நிலையான ஜேசன்-ஆர்பிசி பயன்பாட்டு நிரலாக்க இடைமுகத்தின் (API) பகுதியல்ல, எனவே அவை அந்த வழங்குநருடன் மட்டுமே வேலை செய்யும்.
eth_unsubscribe
ஏற்கனவே உள்ள சந்தாவை ரத்து செய்கிறது, இதனால் மேற்கொண்டு எந்த நிகழ்வுகளும் அனுப்பப்படாது.
அளவுருக்கள்
- சந்தா ID, முன்பு
eth_subscribeஅழைப்பிலிருந்து திருப்பியளிக்கப்பட்டபடி.
திருப்பியளிப்பவை
ஒரு சந்தா வெற்றிகரமாக ரத்து செய்யப்பட்டால் true, அல்லது கொடுக்கப்பட்ட ID-யுடன் எந்தச் சந்தாவும் இல்லை என்றால் false.
ஒரு சந்தா அதை உருவாக்கிய WebSocket இணைப்பில் மட்டுமே இருக்கும், எனவே eth_unsubscribe அதே இணைப்பின் மூலம் அனுப்பப்பட வேண்டும். இதை ஒரு தனி HTTP கோரிக்கையாக அனுப்ப முடியாது. இணைப்பை மூடுவது அதன் அனைத்துச் சந்தாக்களையும் ரத்து செய்கிறது.
எடுத்துக்காட்டு:
> {"jsonrpc": "2.0", "id": 2, "method": "eth_unsubscribe", "params": ["0xe0d4abf5caf333fbf94c5f02182e6469"]}
< {"jsonrpc":"2.0","result":true,"id":2}
இலவசமாக Alchemy-இல் பதிவு செய்யுங்கள் (புதிய தாவலில் திறக்கும்), Alchemy-இன் ஆவணங்களைச் (புதிய தாவலில் திறக்கும்) சரிபார்க்கவும், மேலும் சமீபத்திய செய்திகளுக்கு, ட்விட்டரில் (புதிய தாவலில் திறக்கும்) Alchemy-ஐப் பின்தொடரவும்.