Solidity
如果需求的順序不正確,是否可以繞過需求聲明?
請以下面的假設程式碼為例
mapping (address => uint256) public accountBalance; function deposit(uint256 amount) public { accountBalance[msg.sender] = accountBalance[msg.sender].add(amount); require(daiToken.transferFrom(msg.sender, address(this), amount)); }
我被告知此程式碼容易受到重入攻擊,應改為如下編寫:
mapping (address => uint256) public accountBalance; function deposit(uint256 amount) public { require(daiToken.transferFrom(msg.sender, address(this), amount)); accountBalance[msg.sender] = accountBalance[msg.sender].add(amount); }
如果 transferFrom 函式周圍有一個 require 語句,怎麼可能導致本地合約的狀態更新?
最親切的問候
如果 daiToken 在您呼叫 transferFrom 後是惡意合約,那麼它可以在第一次執行完成之前呼叫您的存款函式,因此可能會多次記入金額。
但老實說,ERC20 並不能保證即使你呼叫 transferFrom 成功,代幣的轉移也會正常。您必須相信它會正確執行。
您可以在這裡試用可重入範常式式碼:https ://github.com/KevinSmall/SolidityContractVulnerabilities#reentrancy