Tengo algunas preguntas sobre Solidity CALL
y DELEGATECALL
. Ya he leído algunos hilos relacionados ( enlace ), pero no encontré respuestas a mis dudas.
1) ¿Hay alguna diferencia entre realizar CALL
una función en un contrato de Solidity llamando directamente a la función (p. ej funct(arg1)
.), o usando addressOfTheContract.call(bytes4(sha3("funct(uint256)")), _n)
?
2) ¿Hay alguna diferencia entre realizar una DELEGATECALL
función de biblioteca llamando directamente a la función (p. ej lib.funct(arg1)
.), o usando addressOfTheLibraryContract.delegatecall(bytes4(sha3("funct(uint256)")), _n)
? Supongamos que en ambos casos la biblioteca se importa con una import
declaración al inicio del contrato.
3) ¿Los dos CALL
y DELEGATECALL
generan mensajes con el mismo formato de una transacción ( nonce
, to
, value
, ...), excepto los campos gasPrice
y ?gasLimit
4) Finalmente, ¿ambas CALL
y DELEGATECALL
tienen lugar localmente en cada nodo?
Hay una diferencia si está llamando a una función dentro del contrato (una llamada "interna"). Las llamadas a funciones internas se realizan mediante saltos y no requieren un código de call
operación real. La forma larga es equivalente athis.funct(arg1)
No, esto debería ser equivalente.
No, CALL
y DElEGATECALL
son códigos de operación EVM como SSTORE
o MUL
. No se genera ninguna transacción, todo lo que sucede es que se ejecuta el código.
Toda la ejecución que ocurre en una transacción minada ocurre en cada nodo completo de la red. Si simula la transacción localmente, por ejemplo, con un web3 .call
(que no debe confundirse con la solidez .call
), entonces se ejecuta solo localmente
No estoy 100% seguro de las dos primeras respuestas, así que espere la confirmación de otros:
eth_call
para hacer una llamada a una vista/función pura, eso se ejecuta localmente solo en el nodo con el que está hablando. Un CALL
o DELEGATECALL
que es parte de la ejecución de la función se ejecuta en el mismo lugar.