Opcode für kein Gas in einem Nachrichtenaufruf

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 0xfeOpcode 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?

Antworten (1)

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 .

Bedeutet das, dass Token(token).transfer() falsch zurückgibt, wenn kein Gas mehr vorhanden ist?
Sie haben Recht, wenn einem Anruf bei einem Subunternehmer das Benzin ausgeht, wird dies eine Ausnahme verursachen und an den Anrufer weitergegeben.
Also hat es in diesem Fall nichts mit der throw-Anweisung zu tun?
Ja, du hast wieder recht. Die Spur zeigt Tiefe = 2, was bedeutet, dass sie sich innerhalb der Übertragungsfunktion befindet. Es wird versucht, SSTORE mit 435 verbleibendem Gas auszuführen, aber es werden 5000 benötigt, was zu einer Gasmangel-Ausnahme führt. Transfer gibt nicht false zurück, da es sich um einen direkten Aufruf handelt, stattdessen wird die Ausnahme weitergegeben.
Ich denke, der Übeltäter ist die Compiler-Version. Anscheinend wurde in früheren Versionen 0xfe für kein Gas verwendet?