На remix.ethereum.org функция blockhash всегда обнуляет все переменные
У меня проблема с функцией blockhash на 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);
}
}
Это проблема с ошибкой?
Спасибо за любую помощь.
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
, Я добавляю одну фиктивную транзакцию для тестирования, которая теперь работает нормально.
Наконец, попробуйте запустить это в тестовой сети, чтобы увидеть реальные вещи. Надеюсь, это сработает.