Solidity
address.transfer
是否轉發所有氣體(容易重新進入)?
從 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
是保存並且不允許重入攻擊。