¿Cuál es la diferencia entre .call.value() y .call.value()()

contract Test {

    function Test(){
        msg.sender.call.value(0);
        msg.sender.call.value(0)();
    }

}

¿Cuál es la diferencia aquí entre la primera y la segunda llamada? Mi corazonada es que el primero en realidad no hace nada, sin embargo, este sí se compila.

Respuestas (2)

El primero no debería hacer nada porque la función de llamada no se invoca. Simplemente establezca el valor que desea enviar con callpero luego no lo invoque. Se explica aquí :

Cada llamada de función externa en Solidity se puede modificar de dos maneras:

  1. Puede agregar Ether junto con la llamada
  2. Puede limitar la cantidad de gas disponible para la llamada

De: https://solidity.readthedocs.io/en/v0.4.11/frequently-asked-questions.html#what-does-p-recipient-call-value-p-amount-p-data-do

¿Qué hace p.recipient.call.value(p.amount)(p.data)? Cada llamada de función externa en Solidity se puede modificar de dos maneras:

Puede agregar Ether junto con la llamada. Puede limitar la cantidad de gas disponible para la llamada. Esto se hace "llamando una función en la función":

f.gas(2).value(20)()llama a la función modificada fy, por lo tanto, envía 20 Wei y limita el gas a 2 (por lo que lo más probable es que esta llamada de función se quede sin gas y le devuelva sus 20 Wei).

En el ejemplo anterior, la función de bajo nivel callse usa para invocar otro contrato p.datacomo carga útil y p.amountWei se envía con esa llamada.