为啥从 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 不同的签名
ethers.js:provider.getGasPrice()
ethers.js swapExactETHForTokens 和 swapExactTokensForTokens on pancake swap