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

Blockchain 在remix.ethereum.org上,blockhash函数总是将所有变量归零,blockchain,ethereum,solidity,remix,tron,Blockchain,Ethereum,Solidity,Remix,Tron,我对remix.ethereum.org上的blockhash函数有问题。 尽管多次尝试使用不同的代码,blockhash函数始终会导致问题,其结果是所有变量返回的值均为零 在以下情况下,\u previousBlockNumber变量始终返回零。 如果blockhash函数行被注释掉,则不会发生错误,并且至少\u previousBlockNumber变量会正确返回 我试过几种不同版本的编译器 pragma solidity ^0.5.5; contract Test { constr

我对remix.ethereum.org上的blockhash函数有问题。 尽管多次尝试使用不同的代码,blockhash函数始终会导致问题,其结果是所有变量返回的值均为零

在以下情况下,\u previousBlockNumber变量始终返回零。 如果blockhash函数行被注释掉,则不会发生错误,并且至少\u 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);
    }   
}
这是一个bug问题


谢谢您的帮助。

我尝试运行此代码来修复此问题,它对我有一些更改。您可以在Rinkebey Testnet上找到相同的合同,地址为
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;
    }
}
最初,您两次声明了
\u previousBlockHash
,第二次是在
blockhash
函数的行上。我修好了,工作很好

其次,在当前合同代码中,您没有更改合同的任何状态,也没有执行任何事务,
rand()
只是一个调用,不会添加任何其他块。因此它将始终保持
0
。我为测试添加了一个虚拟事务函数,该函数现在运行良好

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


您好,请尝试使您的功能不是“查看”,您可以看到,如果执行了分配,则事务会恢复。因此,由于您正在执行“本地”读取,因此收到0。也许,这是Javascript虚拟机的一个问题。您是否尝试运行本地网络并将remix连接到正在运行的实例,我认为在这种情况下应该可以正常工作您好,非常感谢您的帮助。但结果对我来说仍然是零。我制作了这个链接的屏幕副本,尝试使用一些实际的测试网络,比如rinkebey或ropsten,你需要在浏览器中安装metamask,在remix中使用注入的web3而不是Javascript虚拟机。据我所知,在本地机器中,它是零块。在实际测试网络中尝试。我已经编辑了我的答案,并提供了更多解释,请查看@leorzz谢谢您的帮助。现在我明白了如何回避这个问题。