首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用WebSocket在客户端使用NodeJS进行缩放

使用WebSocket在客户端使用NodeJS进行缩放
EN

Stack Overflow用户
提问于 2021-12-31 12:21:54
回答 1查看 126关注 0票数 0

我编写了下面的脚本,它使用智能契约创建多个WebSocket连接来侦听事件。它很好,但我觉得这不是一个优化的解决方案,这可能是一个更好的方法。

代码语言:javascript
复制
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 -循环中,我从一对数组中多次实例化每个对的主函数。我认为这种解决方法是蛮力的,而且还有更好的解决办法。

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

EN

回答 1

Stack Overflow用户

发布于 2021-12-31 13:43:34

只是为了澄清条款:您正在打开到WSS节点提供商的websocket连接,而不是与智能契约的连接。但是是的,您的JS片段订阅了这个连接(到节点提供程序)中的多个通道(每个契约一个)。

您可以使用web3.eth.subscribe("logs")函数(文档)通过一个WSS通道从多个合同收集事件日志,并将契约地址列表作为param传递给它。示例:

代码语言:javascript
复制
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()函数(文档)来获取解码的值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70542286

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档