警告:不推薦使用“throw”,取而代之的是“revert()”、“require()”和“assert()”。扔;
我的問題是,如果不推薦使用“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
,它將直接從那裡拋出,而不會對狀態進行任何更改。
對於您的情況和大多數情況,您應該使用
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); }