You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 06:06:03