The-Dao
了解一份合約的功能
我正在嘗試了解以下契約樣本:
// Refund contract for trust DAO #16 contract DAO { function balanceOf(address addr) returns (uint); function transferFrom(address from, address to, uint balance) returns (bool); uint public totalSupply; } contract WithdrawDAO { DAO constant public mainDAO = DAO(0x200450f06520bdd6c527622a273333384d870efb); address public trustee = 0x7c81d252d9d1295058cd3620835f37e0eedd8840; function withdraw(){ uint balance = mainDAO.balanceOf(msg.sender); if (!mainDAO.transferFrom(msg.sender, this, balance) || !msg.sender.send(balance)) throw; } function trusteeWithdraw() { trustee.send((this.balance + mainDAO.balanceOf(this)) - mainDAO.totalSupply()); } }
我對這個
withdraw
功能有點困惑。如果第一次傳輸transferFrom
由於某種原因總是失敗怎麼辦?它會以某種方式鎖定資金,因此永遠不會發生第二次資金轉移嗎?非常感謝!
首先,在 Solidity
x || y
中是以惰性方式評估的,所以如果x
為真,y
則根本不評估。這意味著,萬一transferFrom
失敗,send
將不會被呼叫。此外,
throw
“恢復”交易,即回滾對交易所做的所有更改,包括任何乙太幣或代幣轉移。因此,如果transferFrom
失敗,交易將被還原,並且它所做的任何更改都不會保留在區塊鏈中。但是,交易(未成功)執行的事實將被保留,交易發布者將為此支付費用,該費用將由礦工收取,作為(未成功)執行交易的獎勵。這是公平的,因為礦工無論如何都在這筆交易上花費了資源。