На 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, Я добавляю одну фиктивную транзакцию для тестирования, которая теперь работает нормально.

Наконец, попробуйте запустить это в тестовой сети, чтобы увидеть реальные вещи. Надеюсь, это сработает.

Другие вопросы по тегам