Laut der Solidity-Dokumentation :
Eine Ausnahme im Anforderungsstil wird in den folgenden Situationen generiert:
...
Wenn Sie eine Funktion über einen Nachrichtenaufruf aufrufen, diese jedoch nicht ordnungsgemäß beendet wird ( dh sie hat kein Gas mehr , hat keine passende Funktion oder löst selbst eine Ausnahme aus).
...
Intern führt Solidity einen Rückgängigmachen-Vorgang (Anweisung 0xfd) für eine Ausnahme im Require-Stil und eine ungültige Operation (Anweisung 0xfe) aus, um eine Ausnahme im Assert-Stil auszulösen.
Bei dieser Transaktion wird jedoch ein 0xfe
Opcode ausgeführt (siehe Schritt 1394), der für Ausnahmen vom Assert-Stil verwendet wird.
Ist die Dokumentation falsch oder folgt der Compiler nicht der Dokumentation?
Wenn Sie sich den Quellcode der FunktiondrawTokens
function withdrawToken(address token, uint amount) {
if (token==0) throw;
if (tokens[token][msg.sender] < amount) throw;
tokens[token][msg.sender] = safeSub(tokens[token][msg.sender], amount);
if (!Token(token).transfer(msg.sender, amount)) throw;
Withdraw(token, msg.sender, amount, tokens[token][msg.sender]);
}
Es hat explizit einen Wurf, und der Wurf generiert 0xfe.
Der Vertrag wurde mit Version v0.4.9 kompiliert und require und assert sind erst ab v0.4.10 verfügbar .
medwedew1088
Ismael
medwedew1088
Ismael
medwedew1088