Solidity

這樣的功能是可重入的嗎?

  • December 18, 2019

從我們公司人員過去工作的審計中以虛擬碼(Solidity like …)得到這個,簡而言之,它似乎是先撤後加。也許不是一個好主意,特別是因為根據 34050 氣體判斷它使用“呼叫”而不是轉移?

function withdraw(uint256 amount) payable: 
 require amount <= balanceOf[msg.sender]
 balanceOf[msg.sender] -= amount
 call msg.sender with:
    value amount wei
      gas gas_remaining - 34050 wei
 if ext_call.success:
     log Withdrawal(
           address src=_wdamount,
           uint256 amt=caller)
     return 1
 require balanceOf[msg.sender] + amount >= balanceOf[msg.sender]
 balanceOf[msg.sender] += amount
 return 0

像這樣的功能是可重入的嗎?

它脆弱嗎?

你在做

  1. 檢查
  2. 效果(事件除外)
  3. 互動
  4. 失敗時撤消更改

乍一看,我認為不是,但是…

您沒有在這裡檢查下溢,因此 msg.sender 可以透支他們的帳戶並成功。

balanceOf[msg.sender] -= amount;

這可能是麻煩的開始。

考慮(以您的風格):

function withdraw(uint256 amount) payable: 
 require amount <= balanceOf[msg.sender]
 balanceOf[msg.sender].sub(amount)  // with safeMath
 log Withdrawal(
   address src=_wdamount,
   uint256 amt=caller)
 require
    call msg.sender with:
      value amount wei
      gas gas_remaining - 34050 wei
 return 1

希望能幫助到你。

引用自:https://ethereum.stackexchange.com/questions/78366