At remix.ethereum.org функция blockhash всегда обнуляет все переменные

#blockchain #ethereum #solidity #remix #tron

#блокчейн #ethereum #надежность #ремикс #tron

Вопрос:

У меня проблема с функцией 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. Привет, попробуйте сделать так, чтобы ваша функция не «просматривалась», вы можете видеть, что если назначение выполнено, транзакция возвращается. Итак, поскольку вы выполняете «локальное» чтение, вы получаете 0. Возможно, это проблема с виртуальной машиной Javascript. Вы пытались запустить локальную сеть и прикрепить remix к запущенному экземпляру, я думаю, что в этом случае это должно сработать

Ответ №1:

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

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

скриншот

Комментарии:

1. Здравствуйте, большое вам спасибо за помощь. Но результат для меня по-прежнему нулевой. Я сделал копию экрана этой ссылки imgur.com/apzHISt

2. попробуйте использовать какую-нибудь реальную тестовую сеть, такую как rinkebey или ropsten, вам нужно, чтобы metamask был установлен в браузере, а в remix используйте внедренный web3 вместо виртуальной машины Javascript. В моем понимании на локальном компьютере это нулевой блок. попробуйте в реальной тестовой сети.

3. Я отредактировал свой ответ с дополнительными объяснениями, пожалуйста, проверьте @leorzz

4. Спасибо за вашу помощь. Теперь я понимаю, как обойти эту проблему.