Fallback
Reference
目标
- 成为合约Owner
- 转走全部合约Ether
分析
合约一共有3个写函数(更新当前合约参数的函数):
- contribute()
- withdraw()
- receive()
contribute()
function contribute() public payable {
// 要求交易金额小于 0.001 ether
require(msg.value < 0.001 ether);
// 增加贡献值
contributions[msg.sender] += msg.value;
// 贡献值最大的sender,成为新的Owner
if (contributions[msg.sender] > contributions[owner]) {
owner = msg.sender;
}
}
- 这是个
payable
函数,支持接收ether
,任何地址都可以调用函数,提供贡献值
withdraw()
function withdraw() public onlyOwner {
payable(owner).transfer(address(this).balance);
}
Owner
账户提款合约的全部Ether
receive()
receive() external payable {
require(msg.value > 0 && contributions[msg.sender] > 0);
owner = msg.sender;
}
receive()
函数作为接收Ether
的回调函数,当合约接收Ether是会被调用- 只要转账金额不为0 并且 之前有过贡献值的话,
owner
的地址就会更新为当前交易的Sender
fallback()
函数作为解析calldata
的兜底函数,如果当前合约不存在任何的函数选择器Funcselector
,处理逻辑就会落到fallback
函数,因此可以实现代理合约的逻辑
实现步骤
- 部署合约
- 调用
contribute()
函数,转入0.0005 ETH
,初始化contributions[msg.sender]
值 - 不通过合约函数,直接对合约转账任意金额,触发
receiver
函数,更新合约Owner
- 调用
withdraw
,转移全部资产