为什么ethers.js获取的区块时间与etherscan.io显示的时间不一致?
问题1:时间存在差异的原因
你当前代码打印的是本地程序接收到区块通知的时间,而非区块本身写入以太坊链的时间,时间差来自几个环节的叠加延迟:
- 以太坊矿工挖出区块后,需要通过P2P网络广播到全网节点,存在网络传播延迟
- Infura节点同步到最新区块后,再通过接口推送给你的本地程序,又会产生一层节点处理+网络传输延迟
- 另外你提供的比对数据中第一个区块号存在笔误(本地输出13261128,Etherscan对应区块号为13261028,差了100个区块),也会加剧时间偏差的感知。
问题2:获取准确区块时间的方案
可以直接通过ethers.js的API获取区块内置的时间戳,这是矿工写入区块头的链上原生时间,和Etherscan显示的完全一致,修改后的代码示例如下:
import {providers} from "ethers"; const provider = new providers.InfuraProvider("homestead") async function main() { provider.on("block", async (blockNum)=> { // 获取区块完整信息,timestamp是区块内置的秒级时间戳 const block = await provider.getBlock(blockNum) const blockTime = new Date(block.timestamp * 1000) console.log(blockNum + ": " + blockTime) }) } main()
该方法拿到的时间就是区块的实际生成时间,不需要依赖本地时钟,也不会受网络传输延迟影响。
内容的提问来源于stack exchange,提问作者cruelcage
相关产品推荐
相关产品推荐

