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