Solidity
這樣的功能是可重入的嗎?
從我們公司人員過去工作的審計中以虛擬碼(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
像這樣的功能是可重入的嗎?
它脆弱嗎?
你在做
- 檢查
- 效果(事件除外)
- 互動
- 失敗時撤消更改
乍一看,我認為不是,但是…
您沒有在這裡檢查下溢,因此 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
希望能幫助到你。