Solidity中如何获取最新已开采区块的编号与哈希值?
在Solidity合约中获取最新区块编号与哈希的方法
首先明确:Solidity合约可以直接获取最新已开采区块的编号和哈希,不需要通过外部调用维护数组。
一、正确使用内置变量的方法
你遇到的错误是代码语法问题,block.number是Solidity的内置全局变量,不能单独作为语句存在,需要将其用于赋值、返回或其他表达式操作中。
获取区块编号
直接使用block.number即可,示例代码:
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract BlockInfo { function getCurrentBlockNumber() public view returns (uint256) { return block.number; // 正确返回当前区块编号 } }
获取区块哈希
使用blockhash(uint blockNumber)函数,但有两个注意点:
- 该函数仅能获取最近256个区块的哈希,更早的区块会返回
0x0 - 无法直接获取当前区块的哈希(当前区块未完成挖矿确认),只能获取上一个及更早已确认区块的哈希
示例代码:
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract BlockInfo { function getLastBlockHash() public view returns (bytes32) { // 获取上一个已确认区块的哈希 return blockhash(block.number - 1); } }
二、错误原因解释
你写出block.number;这类代码会报错,是因为Solidity不允许单独的变量引用作为独立语句,必须将其包裹在有效的代码逻辑中,比如函数的返回语句里。
三、无需外部维护数组的原因
Solidity的block全局变量原生支持访问区块元数据,只有当你需要长期存储超过256个区块的历史哈希时,才需要考虑用数组或其他数据结构手动维护。
内容的提问来源于stack exchange,提问作者Amirul Zaki
相关产品推荐
相关产品推荐

