1
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)

我的问题

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

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

4

2 回答 2

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

  2. 是的,使用带有 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;
于 2021-10-22T21:01:54.453 回答
0

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

于 2021-10-20T06:49:27.297 回答