King合约表示了一个很简单的游戏: 任何一个发送了高于目前价格的人将成为新的国王。上一个国王将会获得新的出价, 这样可以赚得一些以太币. 看起像是庞氏骗局.
这么有趣的游戏, 你的目标是攻破他.
当你提交实例给关卡时, 关卡会重新申明王位. 你需要阻止他重获王位来通过这一关.
根据Foundry 官方文档配置好运行环境后,于本项目下执行下列命令:
$ cd WTF-CTF
$ forge test -C src/Ethernaut/King -vvvvv
合约账户在收到转账后,会自动执行receive函数或fallback函数(区别)。
合约中使用 transfer函数进行合约转账,transfer函数执行失败时,会回滚交易。而call函数进行转账时失败了只会返回false(solidity三种发送ETH的方法)。
所以我们可以使用合约申请为king,然后在合约的receive函数中revert掉所有转账交易。这样就没有人可以替代我们成为新王。
receive() external payable {
revert();
}