You are viewing a single comment's thread from:

RE: Solidity开发指南

in #starnote3 days ago

参考

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