Logo
Section 1 / 3

取款模式

学习 Solidity 中的取款模式。

导入

取款模式

学习 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}

}

函数

限制访问模式