Solidity

警告:不推薦使用“throw”,取而代之的是“revert()”、“require()”和“assert()”。扔;

  • November 21, 2018

我的問題是,如果不推薦使用“THROW”,那麼我必須在下面的可靠性程式碼中添加什麼?

// This function creates Tokens  
    function createTokens() payable {
       if(isMinting == true){
           require(msg.value > 0);
           uint256  tokens = msg.value.div(100000000000000).mul(RATE);
           balances[msg.sender] = balances[msg.sender].add(tokens);
           _totalSupply = _totalSupply.add(tokens);
           owner.transfer(msg.value);
       }
       else{
           throw;
       }
   }

所以程式碼應該是這樣的:

// This function creates Tokens  
function createTokens() payable {
require(isMinting == true && msg.value > 0);
uint256  tokens = msg.value.div(100000000000000).mul(RATE);
balances[msg.sender] = balances[msg.sender].add(tokens);
_totalSupply = _totalSupply.add(tokens);
owner.transfer(msg.value);
   }
   else{
       throw;
   }
}

或者我必須刪除

else{ throw;

最後更新:

function createTokens() payable public {
   if(isMinting == true){
      require(isMinting, "Not allowed");
      require(msg.value > 0, "No funds");
       uint256  tokens = msg.value.div(100000000000000).mul(RATE);
       balances[msg.sender] = balances[msg.sender].add(tokens);
       _totalSupply = _totalSupply.add(tokens);
       owner.transfer(msg.value);
   }
   else{
       revert();
   }

謝謝 AK

如果您正在尋找 的替代品throw,您可以revert以類似的方式使用。該revert函式可用於標記錯誤並恢復目前呼叫。如solidity docs中所述:

筆記

曾經有一個名為 throw 的關鍵字與 revert() 具有相同的語義,該關鍵字在 0.4.13 版中已被棄用,並在 0.5.0 版中被刪除。

從程式碼的角度來看,您可以使用require如下:

function createTokens() payable {
       require(isMinting == true && msg.value > 0);
       uint256  tokens = msg.value.div(100000000000000).mul(RATE);
       balances[msg.sender] = balances[msg.sender].add(tokens);
       _totalSupply = _totalSupply.add(tokens);
       owner.transfer(msg.value);
 }

因此,如果isMinting不等於true,它將直接從那裡拋出,而不會對狀態進行任何更改。

更多資訊:https ://solidity.readthedocs.io/en/v0.5.0/control-structures.html#error-handling-assert-require-revert-and-exceptions

對於您的情況和大多數情況,您應該使用require(isMinting, "Unallowed");. require(false)條件恢復目前呼叫,即撤消儲存更改並且 msg.value 不會轉移到合約。

throw行為相當於assert(false, "Reason"),它們將導致交易失敗並浪費所有剩餘的氣體,這將恢復所有呼叫堆棧。

使用此範例了解有關失敗事務的更多資訊https://gist.github.com/3esmit/8954425d2ed0322505245803d6c045e4

function createTokens() payable { require(isMinting, "Not allowed"); require(msg.value > 0, "No funds"); uint256 tokens = msg.value.div(100000000000000).mul(RATE); balances[msg.sender] = balances[msg.sender].add(tokens); _totalSupply = _totalSupply.add(tokens); owner.transfer(msg.value); }

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