Solidity

如果需求的順序不正確,是否可以繞過需求聲明?

  • January 10, 2020

請以下面的假設程式碼為例

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

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