我在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问题?
谢谢你的帮助。
我试图运行此代码来解决问题,它正在为我工作一些变化。您可以在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
。我添加了一个用于测试的虚拟事务函数,现在工作正常。
最后,尝试在实时测试网络上运行此功能以查看实际情况。希望它会奏效。