2

我在 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);
    }   
}

是bug问题吗?

谢谢你的帮助。

4

1 回答 1

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。我添加了一个用于测试的虚拟事务功能,现在工作正常。

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

截屏

于 2019-03-19T07:19:17.703 回答