#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. Спасибо за вашу помощь. Теперь я понимаю, как обойти эту проблему.