使用 NodeJS 在客户端缩放 WebSocket

Posted

技术标签:

【中文标题】使用 NodeJS 在客户端缩放 WebSocket【英文标题】:WebSocket scaling on the client side with NodeJS 【发布时间】:2021-12-31 12:21:54 【问题描述】:

我编写了下面的脚本,它使用智能合约创建多个 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 循环中为一对数组中的每一对多次实例化 main 函数。我认为这种解决方法是蛮力的,还有更好的方法。

任何建议/意见将不胜感激。

【问题讨论】:

【参考方案1】:

只是为了澄清条款:您正在打开与 WSS 节点提供程序的 websocket 连接,而不是智能合约。但是,是的,您的 JS sn-p 在这个连接(到节点提供者)中订阅了多个频道(每个合同一个)。

您可以使用web3.eth.subscribe("logs") 函数 (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] 事件签名(this answer 中的实际示例值)发出了哪个事件日志,您就可以使用decodeLog() 函数(docs)来获取解码值。

【讨论】:

首先,非常感谢您提供有趣的解决方案,很抱歉这么晚才回复。我实现了这种订阅方式,但我确实需要对地址数组中特定地址的结果进行计算。比如,地址数组可能包含 Uniswap 和 Sushiswap 的 dai/Weth 地址,然后是 Uniswap 和 Sushiswap 的 Sushi/Weth 地址。 addressarray = [dai/Weth-Uniswap,dai/Weth-Sushiswap,Sushi/Weth-Uniswap,Sushi/Weth-Sushiswap]。现在,我需要对每对对应的地址进行计算,即。索引 0、1 和 2、3。有什么建议吗?

以上是关于使用 NodeJS 在客户端缩放 WebSocket的主要内容,如果未能解决你的问题,请参考以下文章

java http可以websocket不行

websocke

websocke前世今生

websocke 在线测试地址

websocke 在线测试地址

nodejs使用jimp实现图片处理