我将在以太坊、币安、Polygon和Clayton上运行一个合约。
对于在合约中发生的轮询事件是否存在最佳实践?
我想通过请求而不是订阅来获取事件。
如果我们使用EtherScan api,所有序列都是决定性保证的吗?
目标是定期发送请求,并将合同中发生的所有特定事件存储在db中。
谢谢你的帮助。
当您查询原始区块链数据时,每个事件日志都包含logIndex
,这是事件在块中的位置。
web3js示例:
const pastEventLogs = await web3.eth.getPastLogs({
fromBlock: 16168375,
toBlock: 16168375,
address: "0xdAC17F958D2ee523a2206206994597C13D831ec7", // USDT on Ethereum
topics: [
web3.utils.keccak256("Transfer(address,address,uint256)")
]
});
返回...
address: '0xdAC17F958D2ee523a2206206994597C13D831ec7',
blockHash: '0x026c2f62c8ad51b1e28c5fe6885c6025b2c4145aef08b65feb10b6e20dd2c0bc',
blockNumber: 16168375,
data: '0x0000000000000000000000000000000000000000000000000000000001618bd0',
logIndex: 732,
...
第三方api(例如Etherscan)的作者可以选择根据logIndex
排序他们的结果,但他们也可以选择不同的排序。