导入
取款模式
学习 Solidity 中的取款模式。
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17;
contract WithdrawalContract { address public wealthiest; uint public mostSent; mapping(address => uint) public pendingWithdrawals;
1// 发送的以太坊金额未超过当前最高金额。 2error NotEnoughEther(); 3 4constructor() payable { 5 wealthiest = msg.sender; 6 mostSent = msg.value; 7} 8 9function becomeWealthiest() public payable { 10 if (msg.value <= mostSent) revert NotEnoughEther(); 11 pendingWithdrawals[wealthiest] += msg.value; 12 wealthiest = msg.sender; 13 mostSent = msg.value; 14} 15 16function withdraw() public { 17 uint amount = pendingWithdrawals[msg.sender]; 18 // 在转账前将待退款金额清零,以防止重入攻击 19 pendingWithdrawals[msg.sender] = 0; 20 payable(msg.sender).transfer(amount); 21}
}
// SPDX-License-Identifier: MIT pragma solidity ^0.8.17;
contract SendContract { address payable public wealthiest; uint public mostSent;
1// 发送的以太坊金额未超过当前最高金额。 2error NotEnoughEther(); 3 4constructor() payable { 5 wealthiest = payable(msg.sender); 6 mostSent = msg.value; 7} 8 9function becomeWealthiest() public payable { 10 if (msg.value <= mostSent) revert NotEnoughEther(); 11 // 此行可能引发问题:若接收方拒绝接收 ETH,transfer 会回滚,导致任何人都无法成为最富有的参与者。 12 wealthiest.transfer(msg.value); 13 wealthiest = payable(msg.sender); 14 mostSent = msg.value; 15}
}