Todos los casos en los que Solidity se compila en un destino de salto no válido

Solidity genera un código de bytes EVM que conduce a un destino de salto no válido cuando:

  • throwse usa
  • ... ?
  • ... ?

¿Se puede completar la lista anterior, con ejemplos?

Para explicar el primer elemento, throwen 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 throwno está en un código muerto que podría optimizarse). ¿Cuáles son todos los demás escenarios que pertenecen a la lista?

Respuestas (2)

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:

  • acceso a la matriz fuera de los límites
  • subllamada fallida (debido a cualquier motivo informado por el EVM, incluido un destino de salto no válido en la subllamada)
  • ether enviado a una función de reserva de la biblioteca
Agregaría: enviar ether a una función no definida comopayable

Matriz fuera de los límites

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"


(Algo relacionado) Límite de acumulación alcanzado 1024

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 consolepantalla se vuelve loca.