Solidity

address.transfer 是否轉發所有氣體(容易重新進入)?

  • May 8, 2017

從 Solidity文件中,我不明白最近引入的是address.transfer將所有 gas 轉發到目標合約還是只提供最小的 gas 津貼。即:它會促進重入攻擊嗎?

我設置了一個最小的測試範例,您可以在https://gist.github.com/anonymous/07d4714c27dbf1af0e5cb16c9f833353上找到它

pragma solidity ^0.4.11;

contract Test {
   Receiver myR;

   function setReceiver (address a) {
       myR = Receiver(a);
   }

   function callR() {
       myR.call(this.balance);
   }

   function sendCash() payable {
   }

}

contract Receiver {
   uint public numCalled;

   function () payable {
       numCalled++;
   }
}

在通過設置Receiver合約地址並呼叫in增加之後,效果很好。替換by時出現異常。使用 Remix 調試器單步執行此操作表明僅獲得了 2300 氣體的氣體津貼,這不足以設置儲存變數或遞歸呼叫。Test``setReceiver``callR``numCalled``Receiver``myR.call``myR.transfer``myR.transfer

因此,我得出結論,這transfer是保存並且不允許重入攻擊。

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