На remix.ethereum.org функция blockhash всегда обнуляет все переменные - PullRequest
1 голос
/ 16 марта 2019

У меня проблема с функцией 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 Ответ

1 голос
/ 19 марта 2019

Я попытался запустить этот код, чтобы исправить проблему, и он работает для меня с некоторыми изменениями. Тот же контракт вы можете найти в 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...