簡體   English   中英

WebSocket 使用 NodeJS 在客戶端進行縮放

[英]WebSocket scaling on the client side with NodeJS

我編寫了下面的腳本,該腳本創建多個 WebSocket 連接與智能合約以監聽事件。 它工作正常,但我覺得這不是一個優化的解決方案,可能這可以以更好的方式完成。

 const main = async (PAIR_NAME, PAIR_ADDRESS_UNISWAP, PAIR_ADDRESS_SUSHISWAP) => { const PairContractHTTPUniswap = new Blockchain.web3http.eth.Contract( UniswapV2Pair.abi, PAIR_ADDRESS_UNISWAP ); const PairContractWSSUniswap = new Blockchain.web3ws.eth.Contract( UniswapV2Pair.abi, PAIR_ADDRESS_UNISWAP ); const PairContractHTTPSushiswap = new Blockchain.web3http.eth.Contract( UniswapV2Pair.abi, PAIR_ADDRESS_SUSHISWAP ); const PairContractWSSSushiswap = new Blockchain.web3ws.eth.Contract( UniswapV2Pair.abi, PAIR_ADDRESS_SUSHISWAP ); var Price_Uniswap = await getReserves(PairContractHTTPUniswap); var Price_Sushiswap = await getReserves(PairContractHTTPSushiswap); // subscribe to Sync event of Pair PairContractWSSUniswap.events.Sync({}).on("data", (data) => { Price_Uniswap = (Big(data.returnValues.reserve0)).div(Big(data.returnValues.reserve1)); priceDifference(Price_Uniswap, Price_Sushiswap, PAIR_NAME); }); PairContractWSSSushiswap.events.Sync({}).on("data", (data) => { Price_Sushiswap = (Big(data.returnValues.reserve0)).div(Big(data.returnValues.reserve1)); priceDifference(Price_Uniswap, Price_Sushiswap, PAIR_NAME); }); }; for (let i = 0; i < pairsArray.length; i++){ main(pairsArray[i].tokenPair, pairsArray[i].addressUniswap, pairsArray[i].addressSushiswap); }

最后,我在for循環中為一對數組中的每一對多次實例化主function。 我認為這種解決方法是蠻力的,有更好的方法來做到這一點。

任何建議/意見將不勝感激。

只是為了澄清條款:您正在打開 websocket 連接到 WSS 節點提供程序 - 而不是智能合約。 但是,是的,您的 JS 片段在這個連接(到節點提供者)中訂閱了多個通道(每個合同一個)。

您可以使用web3.eth.subscribe("logs") function ( docs ) 僅通過一個 WSS 通道從多個合約收集事件日志,並將合約地址列表作為參數傳遞給它。 例子:

const options = {
    // list of contract addresses that you want to subscribe to their event logs
    address: ["0x123", "0x456"]
};
web3.eth.subscribe("logs", options, (err, data) => {
    console.log(data);
});

但它有一個缺點 - 它不會為您解碼事件日志數據。 因此,您的代碼將需要根據事件簽名(在data.topics[0]中返回)找到預期的數據類型。 一旦您知道根據topics[0]事件簽名(此答案中的實際示例值)發出了哪個事件日志,您就可以使用decodeLog() function ( docs ) 來獲取解碼值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM