Игрался с рандомом, написал вот такой код:
pragma solidity ^0.4.13;
contract Random {
uint max_ticket_number;
uint shift_block;
uint winner_number;
function Random() public {
max_ticket_number = 100;
shift_block = 1;
}
function setMaxTicketNumber(uint new_max_ticket_number) public {
max_ticket_number = new_max_ticket_number;
}
function getWinnerNumber() public {
uint base_random = uint(block.blockhash(block.number - shift_block));
//shift_block++;
winner_number = base_random%max_ticket_number;
}
function printWinnerNumber() public constant returns (uint) {
return winner_number;
}
function getShift() public constant returns (uint) {
return shift_block;
}
function getBlockNumber() public constant returns (uint) {
return block.number;
}
function getBlockhash() public constant returns (uint) {
return uint(block.blockhash(block.number - shift_block));
}
}
Экспериментально выяснил, что когда вызываю функцию изменяющую контракт, то есть объявленную без constant то в блокчейне Remix возникает новый блок.
Такие функции Remix отображает красными квадратиками.
function getWinnerNumber() вычисляет победителя, но почему то не хочет Remix отобразить результат из нее.
Сделал поэтому printWinnerNumber() она чисто отображает результат.
Жмем последовательно, видим, что по хешу блока выдаются разные случайные значения в заданном диапазоне.
Нет ли у потенциального атакующего возможности узнать хеш блока который мы используем при вычислении победителя до отправки транзакции "покупающей билет"?
Этот вопрос надо осознать.
Если наш контракт будет вызван после того как транзакция которая запустит механизм вычисления победителя включена в блок, то по идее мы и будем использовать хеш блока в который она включена, и соответственно в момент отправки транзакции этот блок еще не существовал.
Это если блоки в эфире делаются строго последовательно, а я что то не уверен в этом.. как то же выполнение этих смарт контрактов распаралеливается, а то бы скорости не было вообще.
Надо изучить тут теорию работы эфира значит глубже.