Comprender una instrucción de llamada EVM con gas como 0x00

Estoy tratando de entender la siguiente instrucción de llamada EVM generada desde aquí: https://ethervm.io/decompile

 memory[temp3:temp3 + 0x00] = address(msg.sender).call.gas(0x00).value(var1)(memory[temp3:temp3 + memory[0x40:0x60] - temp3]);

Entonces, básicamente gas, se especifica la cantidad de gasolina que el remitente está dispuesto a pagar para enviar el dinero al "msg.sender", ¿verdad? Pero estoy bastante confundido con el gas(0x00). ¿El contrato no podría enviar nada, verdad?

Respuestas (1)

Básicamente, el gas se especifica como la cantidad de gas que el remitente está dispuesto a pagar para enviar el dinero al "msg.sender".

Esta afirmación no es correcta.

Para comprender lo que está sucediendo, debe tener una comprensión básica de cómo se ejecuta una llamada de bajo nivel (el papel amarillo o este papel ) son buenos puntos de partida.

Esencialmente, cuando se realiza una llamada (implícitamente, pero hay excepciones, como la llamada delegada), el remitente es el contrato inteligente que se está ejecutando. Da como entrada una copia de parte de su memoria y junto con el mensaje envía una cantidad de dinero. Además, el remitente tiene la facultad de especificar la cantidad de gas que el destinatario tiene a su disposición para una posible ejecución.

Finalmente, después de la invocación, dependiendo del estado de salida, se coloca una bandera en la parte superior de la pila.

RESPUESTA

En su caso, el contrato de ejecución es simplemente enviar var1Wei al msg.sender. El msg.sendertiene a su disposición 0 unidades de gas por lo que está impedido de realizar operaciones. Esto significa que incluso si el destinatario contiene una función de reserva, no se permiten ejecuciones.

REPRODUCIR CODIGO CON 0 gas

Un ejemplo simple que usa la instrucción de llamada (no recomendada de bajo nivel):

int var1 = 12;
msg.sender.call.gas(0).value(var1)();

Puede encontrar más detalles sobre la función de envío y transferencia (que brinda una cantidad limitada de gas que es segura contra el reingreso pero aún permite la ejecución del código) en la respuesta a esta pregunta .

Hola, gracias por tu respuesta. Sin embargo, todavía estoy un poco confundido. Así como usted mencionó, "Además, el remitente tiene la facultad de especificar la cantidad de gas que el destinatario tiene a su disposición para una posible ejecución". ¿No significa que la persona que llama proporcionará cierta cantidad de gas para que la persona que recibe la llamada ejecute su función de respaldo? Entonces, para este ejemplo, incluso si la función de devolución de llamada no se puede ejecutar, la transferencia de gas aún sería exitosa, ¿verdad?
Además, ¿cómo puedo escribir dicho código en Solidity para poner a cero el gas que utilizará el destinatario? Tenga en cuenta que esta instrucción se descompila de un código de contrato inteligente del mundo real. Gracias.
Al final del primer comentario, ¿quiere decir transferencia de "valor/dinero" y no transferencia de gas, es correcto?
¡Bien! Perdón por la confusion. Significa transferencia de "dinero".