为啥从 ethers.js 获取块的时间戳不等于在 etherscan.io 中显示?

Posted

技术标签:

【中文标题】为啥从 ethers.js 获取块的时间戳不等于在 etherscan.io 中显示?【英文标题】:Why the timestamp of block get from ethers.js not equals to display in etherscan.io?为什么从 ethers.js 获取块的时间戳不等于在 etherscan.io 中显示? 【发布时间】:2021-11-13 21:59:45 【问题描述】:
import providers from "ethers";

const provider = new providers.InfuraProvider("homestead")

async function main() 
    provider.on("block", (blockNum)=> 
        console.log(blockNum+ ": " +new Date(Date.now()))
    )


main()

从上面的代码输出:

13261128: Mon Sep 20 2021 14:57:42 GMT+0800 
13261129: Mon Sep 20 2021 14:58:14 GMT+0800 
13261130: Mon Sep 20 2021 14:58:42 GMT+0800 
13261131: Mon Sep 20 2021 14:58:58 GMT+0800 

来自 etherscan.io:

Sep-20-2021 06:57:12 AM +UTC (https://etherscan.io/block/13261028)
Sep-20-2021 06:57:23 AM +UTC (https://etherscan.io/block/13261129)
Sep-20-2021 06:58:07 AM +UTC (https://etherscan.io/block/13261130)
Sep-20-2021 06:58:38 AM +UTC (https://etherscan.io/block/13261131)

我的问题

    我电脑的时钟是准确的,为什么这两种方式有区别?

    我可以从 ethers.js API 获得准确的出块时间,还是可以通过其他方式获得?

【问题讨论】:

【参考方案1】:

etherscan.io 以 UTC 格式返回时间。但是您的本地显示时间是 GMT +8。

【讨论】:

这并不能解释与示例的区别。即使考虑了时区,给定的示例时间仍然(略有)不同。【参考方案2】:

    区块的时间戳采用 UTC(因此是@Dmitriy Kashirin 提到的时区偏移量),并不代表矿工设置的区块被开采的确切时间。因此,允许轻微的偏移量,并且不应将时间戳用作敏感合约的随机性来源。 Read more here.

    是的,使用带有 RPC 提供程序的 ethers.js 可以相当简单地获得确切块的时间戳:

const RPC = "RPC_OF_THE_NETWORK";
const blockNumber = 1; // number of the block you want to get timestamp of
const provider = new ethers.providers.JsonRpcProvider(RPC)

const timestamp = (await provider.getBlock(blockNumber)).timestamp;

【讨论】:

以上是关于为啥从 ethers.js 获取块的时间戳不等于在 etherscan.io 中显示?的主要内容,如果未能解决你的问题,请参考以下文章

从 go-ethereum 实现 Ethereum personal_sign (EIP-191) 给出了与 ethers.js 不同的签名

Web3 签名验证失败 - ethers.js

ethers.js:provider.getGasPrice()

如何将 ethers.js 与元掩码连接起来?

ethers.js swapExactETHForTokens 和 swapExactTokensForTokens on pancake swap

如何以编程方式将 ethers.js 库与 Rinkeby 连接?