The-Dao

了解一份合約的功能

  • April 1, 2019

我正在嘗試了解以下契約樣本:

// 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由於某種原因總是失敗怎麼辦?它會以某種方式鎖定資金,因此永遠不會發生第二次資金轉移嗎?非常感謝!

首先,在 Solidityx || y中是以惰性方式評估的,所以如果x為真,y則根本不評估。這意味著,萬一transferFrom失敗,send將不會被呼叫。

此外,throw“恢復”交易,即回滾對交易所做的所有更改,包括任何乙太幣或代幣轉移。因此,如果transferFrom失敗,交易將被還原,並且它所做的任何更改都不會保留在區塊鏈中。

但是,交易(未成功)執行的事實將被保留,交易發布者將為此支付費用,該費用將由礦工收取,作為(未成功)執行交易的獎勵。這是公平的,因為礦工無論如何都在這筆交易上花費了資源。

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