背景
说来也巧,Ethernaut上一篇刚完结,突然点开看到又更新了GoodSamaritan,我干脆单独列出来把。
目标合约分析
总共有三个合约互相作用,分别为GoodSamaritan
(慈善家,对外暴露捐款接口)、Coin
(慈善家通过钱包创建的代币合约)以及Wallet
(由慈善家所有)。本关卡的目的是获取到钱包里所有的余额。
核心代码如下:
contract GoodSamaritan {
Wallet public wallet;
Coin public coin;
constructor() {
wallet = new Wallet();
coin = new Coin(address(wallet));
wallet.setCoin(coin);
}
function requestDonation() external returns(bool enoughBalance){
// donate 10 coins to requester
try wallet.donate10(msg.sender) {
return true;
} catch (bytes memory err) {
if (keccak256(abi.encodeWithSignature("NotE