我编写了下面的脚本,它使用智能契约创建多个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 -循环中,我从一对数组中多次实例化每个对的主函数。我认为这种解决方法是蛮力的,而且还有更好的解决办法。
如有任何建议/意见,将不胜感激。
发布于 2021-12-31 13:43:34
只是为了澄清条款:您正在打开到WSS节点提供商的websocket连接,而不是与智能契约的连接。但是是的,您的JS片段订阅了这个连接(到节点提供程序)中的多个通道(每个契约一个)。
您可以使用web3.eth.subscribe("logs")函数(文档)通过一个WSS通道从多个合同收集事件日志,并将契约地址列表作为param传递给它。示例:
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()函数(文档)来获取解码的值。
https://stackoverflow.com/questions/70542286
复制相似问题