¿Cómo la llamada de mensaje envía gas?

contract Sample{

    event Data(uint test) ; 

    function test2() {
        Data(msg.gas) ;
    }
}


contract Sample2{
    function try(address addr){
       Sample(addr).test2() ;
       addr.call(bytes4(keccak256("test2()"))) ;
    }
}

¿Cómo llama el método enviar gas? Si todo el gas restante se envió al objetivo, ¿cuándo uso callo solo Sample(address).test2()?

Respuestas (1)

El gas se envía con transacciones firmadas. Llega a una función, digamos Sample2(addressSample2).try().

Dado que no especificó una cantidad de gasolina con su call, toda la gasolina restante se envía a Sample(addressSample).test2(). Cuando finaliza, el control vuelve a Sample2(addressSample2).try()junto con el gas no gastado/remanente. No queda gas en Sample(addressSample).

Como Sample2(addressSample2).try()también se hace, el gas restante vuelve al remitente. No queda ningún excedente de gas en ninguno de los contratos, lo cual está bien, porque actualmente no pueden pagar su propio gas.

Sample(address).test2()emite un evento con el gas restante en ese momento , pero el procesamiento continuará como se describe anteriormente. Por lo tanto, se quemará algo de gas adicional antes de que se complete la transacción.

En caso de que no esté claro, hay OPCODES de nivel de ensamblaje que aún deben ejecutarse antes de que todo se complete como se resume anteriormente. Probablemente sea suficiente saber que todavía hay que atender el servicio de limpieza porque la función no ha terminado (técnicamente). Si está tan inclinado, puede pasar por alto los OPCODES en Remix para estudiar lo que hace cerca del final.

Espero eso ayude.