Solidity generiert EVM-Bytecode, der zu einem ungültigen Sprungziel führt, wenn:
throw
wird genutztKann die obige Liste mit Beispielen vervollständigt werden?
Um das erste Element zu erklären, wird der throw
Solidity-Quellcode zu EVM-Bytecode kompiliert, der zu einem ungültigen Sprungziel führt. (Natürlich wird davon ausgegangen, dass throw
sich das nicht in totem Code befindet, der wegoptimiert werden könnte.) Was sind all die anderen Szenarien, die in die Liste gehören?
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:
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"
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 console
Bildschirm verrückt.
gefährlich.bohnen
payable