使用 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的主要内容,如果未能解决你的问题,请参考以下文章