Solidity CALL y DELEGATECALL: mensajes y formato de datos

Tengo algunas preguntas sobre Solidity CALLy DELEGATECALL. Ya he leído algunos hilos relacionados ( enlace ), pero no encontré respuestas a mis dudas.

1) ¿Hay alguna diferencia entre realizar CALLuna 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 DELEGATECALLfunció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 importdeclaración al inicio del contrato.

3) ¿Los dos CALLy DELEGATECALLgeneran mensajes con el mismo formato de una transacción ( nonce, to, value, ...), excepto los campos gasPricey ?gasLimit

4) Finalmente, ¿ambas CALLy DELEGATECALLtienen lugar localmente en cada nodo?

Respuestas (2)

  1. 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 calloperación real. La forma larga es equivalente athis.funct(arg1)

  2. No, esto debería ser equivalente.

  3. No, CALLy DElEGATECALLson códigos de operación EVM como SSTOREo MUL. No se genera ninguna transacción, todo lo que sucede es que se ejecuta el código.

  4. 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:

  1. No, estos deberían hacer lo mismo.
  2. No, estos deberían hacer lo mismo.
  3. No, las llamadas entre contratos no crean transacciones en absoluto.
  4. esto depende Se ejecutan donde se ejecuta el resto del código. Si realiza una transacción, el código se ejecuta en todos los nodos. Si usa eth_callpara hacer una llamada a una vista/función pura, eso se ejecuta localmente solo en el nodo con el que está hablando. Un CALLo DELEGATECALLque es parte de la ejecución de la función se ejecuta en el mismo lugar.