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,转移全部资产