You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 15:15:32