Alle Fälle, in denen Solidity zu einem ungültigen Sprungziel kompiliert wird

Solidity generiert EVM-Bytecode, der zu einem ungültigen Sprungziel führt, wenn:

  • throwwird genutzt
  • ... ?
  • ... ?

Kann die obige Liste mit Beispielen vervollständigt werden?

Um das erste Element zu erklären, wird der throwSolidity-Quellcode zu EVM-Bytecode kompiliert, der zu einem ungültigen Sprungziel führt. (Natürlich wird davon ausgegangen, dass throwsich das nicht in totem Code befindet, der wegoptimiert werden könnte.) Was sind all die anderen Szenarien, die in die Liste gehören?

Antworten (2)

Sprünge zu ungültigen Sprungzielen werden nur für (explizite oder implizite) Ausnahmen generiert. Eine ausdrückliche Ausnahme ist die Verwendung des Schlüsselworts throw. Implizite Ausnahmen treten bei Laufzeitfehlern auf:

  • Array-Zugriff außerhalb der Grenzen
  • fehlgeschlagener Unteraufruf (aus irgendeinem Grund, der von der EVM gemeldet wurde, einschließlich ungültigem Sprungziel im Unteraufruf)
  • Ether an eine Bibliotheks-Fallback-Funktion gesendet
Ich würde hinzufügen: Ether an eine Funktion senden, die nicht als definiert istpayable

Array außerhalb der Grenzen

contract InvalidJump {
    uint[5] data;

    function invalidJump1() {
       uint i = 6000;
       data[i] = 1;
    }
}

Und die Nachricht ist von debug.traceTransaction(...):

error: "invalid jump destination (PUSH1) 2"


(Etwas verwandt) Stack Limit Reached 1024

Nicht das, was in der Frage gestellt wurde, aber trotzdem interessant.

contract InvalidJump2 {
    function invalidJump2(uint number) {
        invalidJump2(number - 1);
    }
}

Aufruf mit folgender Transaktion:

invalidJump.invalidJump2(1, eth.accounts[0], {
  from:web3.eth.accounts[0], 
  data: invalidJumpCompiled.InvalidJump.code,
  gas: 1000000
});

Und die Fehlermeldung:

I0607 18:04:49.978794 core/state_transition.go:258] VM call err: stack limit reached 1024 (1024)

Außerdem debug.traceTransaction(...)macht das den geth consoleBildschirm verrückt.