如何在 Hedera 上以编程方式获取区块号?

问题描述 投票:0回答:2

我从HIP-415:区块简介了解到, Hedera 现在有区块, 它们基于交易的时间戳 被分组到“记录文件”中 这是它们如何被摄取到 Hedera 镜像节点的人工产物 (来自 Hedera 共识节点)。 基本上所有交易都在同一个记录文件中 也被认为在同一个块中, 这些块大约每 2 秒生成一次。

有没有办法可以将日期(时间戳)转换为区块号? 我的目标是能够调用

eth_getBlockByNumber
, 我需要计算出该 RPC 请求的第一个参数 基于时间戳。

curl -s -X POST \
    -H 'Content-Type: application/json' \
    -d '{"jsonrpc":"2.0","id":"2","method":"eth_getBlockByNumber","params":[MY_BLOCK_NUM, false]}' \
    http://localhost:7546

(需要计算出上面^命令中的

MY_BLOCK_NUM
。)

例如,这里是区块4507206, 对应记录文件

2023-05-10T08_27_52.012122604Z.rcd.gz
, 并包含之间的所有交易 今天 UTC 时间为
08:27:52.0121
08:27:53.7004
。 假设我知道区块号是什么, 或者记录文件是什么。 我只有一个时间戳, 我想从中找到对应的块号。 我怎样才能做到这一点(以编程方式)?

rpc hedera-hashgraph hedera
2个回答
1
投票

首先,获取您需要的日期和时间的 Unix 时间戳。如果您想指定 UTC 格式的日期/时间(否则默认为计算机上的时区),请使用

-u
标志。

TIMESTAMP=$(date -u -j -f "%F %T" "2023-05-10 08:27:52" "+%s")

(结果示例:

1683707272

接下来,向Hedera镜像节点API发出API请求:

  • /api/v1/blocks
    - 使用块列表进行响应
  • timestamp=gte:${TIMESTAMP}
    - 使用它来指定上一步中的时间戳。
    gte
    是一个过滤器,表示您只想要时间戳大于或等于您指定的块。
  • limit=1
    order=asc
    - 这些与上面的结合以进一步排序和过滤查询,以便它仅返回指定时间戳之后出现的first块。
curl -s "https://testnet.mirrornode.hedera.com/api/v1/blocks?limit=1&order=asc&timestamp=gte:${TIMESTAMP}" | jq

我们重复与上面相同的命令,但这次使用

jq
路径从完整响应对象中提取块号。

BLOCKNUM=$( curl -s "https://testnet.mirrornode.hedera.com/api/v1/blocks?limit=1&order=asc&timestamp=gte:${TIMESTAMP}" | jq ".blocks[].number" )

(结果示例:

4507206

就这样,你现在有了你的区块号!

但是让我们更进一步来演示这个区块号可以在 Hedera 镜像节点 API 之外使用(这是自定义的,并且特定于 Hedera)。

让我们在 JSON-RPC 中使用这个值,并从那里获取块!

使用

printf
将该块号转换为十六进制。

BLOCKNUMHEX=$( printf "0x%x\n" ${BLOCKNUM} )​

(结果示例:

0x44c646

hedera-json-rpc-relay
的实例发出 JSON-RPC 请求。如果您在本地运行,则默认情况下端点会在
http://localhost:7546
处公开。如果您没有运行该程序,还有其他选项

curl -s -X POST -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":"2","method":"eth_getBlockByNumber","params":["'"${BLOCKNUMHEX}"'", false]}' http://localhost:7546 | jq ".result"

0
投票

您还可以查看 findblock.xyz - 这是一个免费的 API,可以为您搜索许多 EVM 链,包括 hedera(如果我没记错的话,链 ID 295)

要查找上述时间戳之前的最后一个区块,您可以执行以下操作:

curl -X 'GET' \
  'https://api.findblock.xyz/v1/chain/295/block/before/1683707272' \
  -H 'accept: application/json'

搜索将是排他的(我的意思是,如果存在具有确切时间戳的块,它将被忽略,并且将返回其父块。要使搜索具有包容性,只需添加

?inclusive

curl -X 'GET' \
  'https://api.findblock.xyz/v1/chain/295/block/before/1683707272?inclusive=true' \
  -H 'accept: application/json'
© www.soinside.com 2019 - 2024. All rights reserved.