Solidity genera un código de bytes EVM que conduce a un destino de salto no válido cuando:
throw
se usa¿Se puede completar la lista anterior, con ejemplos?
Para explicar el primer elemento, throw
en el código fuente de Solidity, se compila en el código de bytes EVM que conduce a un destino de salto no válido. (Por supuesto, se supone que throw
no está en un código muerto que podría optimizarse). ¿Cuáles son todos los demás escenarios que pertenecen a la lista?
Los saltos a destinos de salto no válidos se generan solo para excepciones (explícitas o implícitas). Una excepción explícita es cuando usa la palabra clave throw
. Las excepciones implícitas ocurren por errores de tiempo de ejecución:
contract InvalidJump {
uint[5] data;
function invalidJump1() {
uint i = 6000;
data[i] = 1;
}
}
Y el mensaje es de debug.traceTransaction(...)
es:
error: "invalid jump destination (PUSH1) 2"
No es lo que se preguntó en la pregunta, pero es interesante de todos modos.
contract InvalidJump2 {
function invalidJump2(uint number) {
invalidJump2(number - 1);
}
}
Llamando con la siguiente transacción:
invalidJump.invalidJump2(1, eth.accounts[0], {
from:web3.eth.accounts[0],
data: invalidJumpCompiled.InvalidJump.code,
gas: 1000000
});
Y el mensaje de error:
I0607 18:04:49.978794 core/state_transition.go:258] VM call err: stack limit reached 1024 (1024)
Además , debug.traceTransaction(...)
la geth console
pantalla se vuelve loca.
frijoles peligrosos
payable