Meine Frage ist, ob "THROW" veraltet ist, was muss ich dann stattdessen in den folgenden Solidity-Code einfügen?
// 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;
}
}
also sollte der code so aussehen:
// 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;
}
}
Oder ich muss die löschen
else{ throw;
letztes Update:
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();
}
danke AK
Wenn Sie nach einer Alternative zu suchen throw
, können Sie revert
auf ähnliche Weise verwenden. Die revert
Funktion kann verwendet werden, um einen Fehler zu kennzeichnen und den aktuellen Aufruf rückgängig zu machen. Wie in den Solidity-Dokumenten angegeben:
Notiz
Früher gab es ein Schlüsselwort namens throw mit derselben Semantik wie revert(), das in Version 0.4.13 veraltet und in Version 0.5.0 entfernt wurde.
Aus Code-Sicht können Sie require
Folgendes verwenden:
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);
}
Wenn isMinting
also nicht gleich ist true
, wird es direkt von dort ausgelöst, ohne Änderungen am Zustand vorzunehmen.
Weitere Informationen: https://solidity.readthedocs.io/en/v0.5.0/control-structures.html#error-handling-assert-require-revert-and-exceptions
Für Ihren Fall und die meisten Fälle sollten Sie verwenden require(isMinting, "Unallowed");
. require(false)
Bedingung setzt den aktuellen Aufruf zurück, dh Speicheränderungen werden rückgängig gemacht und msg.value wird nicht in den Vertrag übernommen.
throw
Verhalten ist äquivalent zu assert(false, "Reason")
, sie verursachen einen Transaktionsfehler und verschwenden auch das gesamte verbleibende Gas, wodurch der gesamte Aufrufstapel zurückgesetzt wird.
Erfahren Sie mehr über fehlgeschlagene Transaktionen anhand dieses Beispiels 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); }
upracha
Aniket
Aniket
else
, da dies in der Funktionalität liegtrequire
, die ausgelöst wird, wenn eine der übergebenen Bedingungen fehlschlägt, verwenden Sie denselben Code, den ich in der Antwort hinzugefügt habe.upracha
Aniket
Aniket
require(isMinting, "Not allowed");
Rest is fine entfernen, es funktioniert auf die gleiche WeiseAniket
upracha
Aniket