这是一个掷硬币的游戏,你需要连续的猜对结果。完成这一关,你需要通过你的超能力来连续猜对十次。
根据Foundry 官方文档配置好运行环境后,于本项目下执行下列命令:
$ cd WTF-CTF
$ forge test -C src/Ethernaut/Coin_Flip -vvvvv
该合约中所使用的随机数算法依靠块高,而且FACTOR也为public变量。这种随机数方法对于其他合约就变成了伪随机。
我们可以在自己的合约中逆向模拟CoinFlip合约验证过程,以保证成功验证。
// 逆向计算需要输入的bool值
function flip() internal view returns (bool) {
uint256 blockValue = uint256(blockhash(block.number - 1));
uint256 coinFlip = blockValue / FACTOR;
bool side = coinFlip == 1 ? true : false;
return side;
}
想要获得密码学上的随机数,你可以使用 Chainlink VRF, 它使用预言机, LINK token, 和一个链上合约来检验这是不是真的是一个随机数.