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

At remix.ethereum.org, blockhash function always zeroes all variables

我在 remix.ethereum.org 的 blockhash 函数有问题。 尽管多次尝试使用不同的代码,blockhash 函数总是会导致问题,结果是所有变量都被 return 编辑为零值。

在下面的例子中,_previousBlockNumber 变量总是 return 归零。 如果 blockhash 函数行被注释掉,那么错误就不会发生,至少 _previousBlockNumber 变量 returns 是正确的。

我试过几个不同版本的编译器。

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

这是一个错误问题?

感谢您的帮助。

我尝试 运行 此代码来解决问题,它对我进行了一些更改。您可以在 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;
    }
}

最初,您声明了 _previousBlockHash 两次,第二次是在 blockhash 函数的行上。我修好了,工作正常。

其次,在当前的合约代码中,你没有改变合约的任何状态,也没有进行任何交易,rand()只是一个调用,不会添加任何其他块。所以它会一直保持 0。我添加了一个用于测试的虚拟交易功能,现在可以正常工作了。

最后,尝试 运行 在实时测试网络上查看实际情况。 希望有用。