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.
El primero no debería hacer nada porque la función de llamada no se invoca. Simplemente establezca el valor que desea enviar con call
pero luego no lo invoque. Se explica aquí :
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
¿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 modificadaf
y, 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
call
se usa para invocar otro contratop.data
como carga útil yp.amount
Wei se envía con esa llamada.