惊人发现block.timestamp悖论??还是我学艺不精??

如果有这样一个合约:

contract MyContract { uint public storedBlockTime;

function SaveBlockTime() external {
    storedBlockTime = block.timestamp;
}

function GetBlockTime() external view returns(uint _lastBlockTime) {
    _lastBlockTime = storedBlockTime;
}

}

我们假设外面调用合约的时候,路人甲先调用SaveBlockTime(),过会儿路人乙再调用GetBlockTime()。路人甲调用SaveBlockTime()时获得的block.timestamp,实际上是当时出块的那个矿工的电脑上的时间。所以稍后路人乙将得到是那一块的出块矿工当时电脑上的时间。

我的问题是,假设,过了一阵有一个路人丙,搭了一个以太坊节点,从Genesis开始下载所有区块并一路回放所有交易,更新World State。当路人丙回放到上面路人甲的这个交易的时候,在执行storedBlockTime = block.timestamp这句时,获得的block.timestamp,是不是该交易所在区块的区块头里的区块时间戳。

由此引申出另一个疑问: 如果我的合约中某个状态变量依赖于block.timestamp,如uint256 time = block.timestamp,那么在计算这个状态变量时应该还没有出块,那么哪来的block.timestamp?如果已经出块,那么我的合约此时还没执行完毕。是先有鸡还是现有蛋啊??????

我已凌乱,help help help

请先 登录 后评论

最佳答案 2022-05-11 09:11

是不是该交易所在区块的区块头里的区块时间戳

那么在计算这个状态变量时应该还没有出块,那么哪来的block.timestamp?如果已经出块,那么我的合约此时还没执行完毕。是先有鸡还是现有蛋啊??????

我的理解是,矿工打包你的交易,打包的过程中(block.timestamp)就是你说的‘矿工的电脑上的时间’去完整你整个业务逻辑,再后者的问题是,不存在出块,你的合约还没执行完毕,是执行完毕了,才出块。等于说记录完毕你的信息,把你的消息给确认了,才叫出块,否则是处于pending状态

请先 登录 后评论

其它 0 个回答

  • 1 关注
  • 1 收藏,2434 浏览
  • kugool 提出于 2022-05-10 21:12