在 remix.ethereum.org,blockhash 函数总是将所有变量归零

Posted

技术标签:

【中文标题】在 remix.ethereum.org,blockhash 函数总是将所有变量归零【英文标题】:At remix.ethereum.org, blockhash function always zeroes all variables 【发布时间】:2019-08-07 14:33:06 【问题描述】:

我遇到了 remix.ethereum.org 上的 blockhash 函数的问题。 尽管多次尝试使用不同的代码,blockhash 函数总是会导致问题,结果是所有变量都返回零值。

在以下情况下,_previousBlockNumber 变量始终返回零。 如果blockhash函数行被注释掉,那么错误就不会发生,并且至少_previousBlockNumber变量可以正确返回。

我尝试了几种不同版本的编译器。

pragma solidity ^0.5.5;
contract Test 
    constructor() public 
    
    function rand() public view returns(uint,bytes32) 
        uint _previousBlockNumber;
        bytes32 _previousBlockHash;
        _previousBlockNumber = uint(block.number - 1);
        bytes32 _previousBlockHash = bytes32(blockhash(_previousBlockNumber)); 
        return (_previousBlockNumber,_previousBlockHash);
       

这是一个错误问题?

感谢您的帮助。

【问题讨论】:

嗨,试着让你的函数不是“查看”,你可以看到如果执行了分配,事务确实会恢复。因此,由于您正在执行“本地”读取,因此您收到 0。也许,这是 javascript VM 的问题。您是否尝试运行本地网络并将混音附加到正在运行的实例,我认为在这种情况下它应该可以工作 【参考方案1】:

我尝试运行此代码来解决问题,它对我进行了一些更改。您可以在 Rinkebey 测试网上找到相同的合约,地址为 0x86ee6d633fd691e77dc79cbdb2a9fb108f79ecbd

pragma solidity ^0.5.5;
contract Test 
    uint256 i;
    constructor() public 
    
    function rand() public view returns(uint,bytes32) 
        uint _previousBlockNumber;
        bytes32 _previousBlockHash;
        _previousBlockNumber = uint(block.number - 1);
        _previousBlockHash = bytes32(blockhash(_previousBlockNumber)); 
        return (_previousBlockNumber,_previousBlockHash);
      

    function setI(uint256 k) public
        i = k;
    

最初,您两次声明_previousBlockHash,第二次在blockhash 函数的行上。我修复它并且工作正常。

其次,在当前的合约代码中,您没有更改合约的任何状态,也没有进行任何交易,rand() 只是一个调用,不会添加任何其他块。所以它将永远保持0。我添加了一个虚拟事务函数进行测试,现在工作正常。

最后,尝试在实时测试网络上运行它以查看实际情况。 希望它会起作用。

【讨论】:

您好,非常感谢您的帮助。但结果对我来说仍然为零。我制作了此链接的屏幕副本imgur.com/apzHISt 尝试使用一些实际的测试网络,比如 rinkebey 或 ropsten,你需要在浏览器中安装 metamask,并且在混音中使用注入的 web3 而不是 Javascript VM。在我对本地机器的理解中,它是零块。在实际测试网络中尝试。 我已经编辑了我的答案并提供了更多解释,请查看@leorzz 感谢您的帮助。现在我明白如何解决这个问题了。

以上是关于在 remix.ethereum.org,blockhash 函数总是将所有变量归零的主要内容,如果未能解决你的问题,请参考以下文章

mac remix导入本地项目

RemixIDE连接本地并导入OpenZeppelin合约库

remix的使用

Remix编译合约的ABI以及ByteCode位置

如何使用remix编写solidity智能合约并部署上链

使用remix的solidity在线编译环境部署一个faucet合约