我从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
。
假设我不知道区块号是什么,
或者记录文件是什么。
我只有一个时间戳,
我想从中找到对应的块号。
我怎样才能做到这一点(以编程方式)?
首先,获取您需要的日期和时间的 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×tamp=gte:${TIMESTAMP}" | jq
我们重复与上面相同的命令,但这次使用
jq
路径从完整响应对象中提取块号。
BLOCKNUM=$( curl -s "https://testnet.mirrornode.hedera.com/api/v1/blocks?limit=1&order=asc×tamp=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"
您还可以查看 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'