参考
- 在可能的情况下,将ether发送给外部地址时使用transfer()函数,transfer()转账时只发送2300gas。payable(msg.sender).transfer(1 ether);
- 确保状态变量改变发生在ether被发送(或者任何外部调用)之前,即Solidity官方推荐的检查-生效-交互模式(checks-effects-interactions);
function withdraw(uint _amount) public {
if(balances[msg.sender] >= _amount) {
balances[msg.sender] -= _amount;
msg.sender.transfer(_amount);
}
}
- 使用互斥锁:添加一个在代码执行过程中锁定合约的状态变量,防止重入调用。
bool reEntrancyMutex = false;
function withdraw(uint _amount) public {
require(!reEntrancyMutex);
reEntrancyMutex = true;
if(balances[msg.sender] >= _amount) {
if(msg.sender.call.value(_amount)()) {
_amount;
}
balances[msg.sender] -= _amount;
reEntrancyMutex = false;
}
}