Solidity

Solidity:帶有加減運算的行的順序

  • October 16, 2017

在查看了許多不同的自定義代幣合約後,我注意到 transferFrom() 函式的標準如下:

 function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
   // some code...

   balances[_from] = balances[_from] -= _value;
   balances[_to] = balances[_to] += _value;
   allowed[_from][msg.sender] = allowed[_from][msg.sender] -= _value;

   // some code...
 }

如果以下幾行,此功能是否容易受到任何類型的攻擊:

balances[_from] = balances[_from] -= _value;
balances[_to] = balances[_to] += _value;

順序相反:

 balances[_to] = balances[_to] += _value;
 balances[_from] = balances[_from] -= _value;

還是沒有惡意使用者可以破解此程式碼的情況?

AFAIK,交換這兩條線不會導致任何漏洞。但問題是你為什麼要這樣做?理想情況下,我們首先從發送方減去餘額,然後將其添加到接收方。

只有在第一行執行而第二行不執行的情況下,這才可能造成損害。但我想這永遠不會發生。即使交易提供的gas在第一行之後完成,完整的交易也會被回滾。因此,您可以互換這些行。

我認為交換兩條線不會導致任何漏洞,但是如果您在更新“餘額”映射之前發送任何形式的值,那麼您可能容易受到重入攻擊。只需確保在發送任何類型的值之前實現這兩行,而不管順序如何(即使最好的做法是先減去然後再從邏輯上加法)

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