ETH矿工能否查看以太坊存储的所有数据?含合约未公开变量疑问
问题描述
以下是引发疑问的Solidity合约代码:
contract RandomNumber{ uint number; function get_random() public{ bytes32 ramdonNumber = keccak256(abi.encodePacked(block.timestamp,blockhash(block.number-1))); number = uint(ramdonNumber); } }
疑问:将随机数赋值给变量number后,若不将number设为public,也不提供其他公共读取函数,通过Etherscan无法查到它的具体数值,但矿工能否通过某种方式获取这些未公开的数据?
解答
矿工完全可以获取到这个未公开的变量值,核心原因如下:
- 矿工在打包交易、验证交易合法性的过程中,会在本地节点完整执行合约的所有逻辑。当
get_random()函数被调用时,矿工的节点会全程模拟执行代码,包括number的赋值操作,变量的最终值在执行过程中对矿工完全透明。 - 以太坊合约的所有状态数据(包括私有变量)都存储在链上的状态树中,矿工节点会维护完整的链上状态副本。他们可以直接通过合约地址和变量的存储槽位置,读取到
number的具体数值——私有变量只是对外部普通用户隐藏,对拥有完整节点数据的矿工来说毫无保密性可言。
额外补充:你这个合约实现的“随机数”本身存在严重安全问题。block.timestamp和blockhash(block.number-1)都是矿工可以提前预知或部分操控的参数,矿工甚至能在打包区块时调整这些参数,直接算出自己想要的“随机数”结果,完全失去随机性。
内容的提问来源于stack exchange,提问作者Gap
相关产品推荐
相关产品推荐

