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

问题描述 投票:1回答:1

我在remix.ethereum.org上遇到了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问题?

谢谢你的帮助。

blockchain ethereum solidity remix tron
1个回答
1
投票

我试图运行此代码来解决问题,它正在为我工​​作一些变化。您可以在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。我添加了一个用于测试的虚拟事务函数,现在工作正常。

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

screenshot

© www.soinside.com 2019 - 2024. All rights reserved.