Resumen

Un contrato inteligente no solo puede recibir transacciones de un usuario, también puede ser otro contrato inteligente el que realice el llamado. Veamos una vulnerabilidad que puede ser explotada si se hace mal uso de los llamados entre contratos.

Diferencias entre las funciones Call y DelegateCall

La función call es utilizada para hacer llamadas a otro contrato inteligente a través de su address y enviar ETH o configurar el uso del gas.

addressToSend.call{value: msg.value, gas: 10000}("");

Otra función similar es delegatecall, pero solo puede hacer llamados y no enviar ETH.

addressToSend.delegatecall("");

Además de que call sea payable y delegatecall no lo es, tienen otra importante diferencia que es el contexto en donde se ejecutan. Cuando utilizas call para llamar a otro contrato, el código que ejecutará pertenece a otro contexto. Es el comportamiento más lógico que uno quiere y puede esperar, ya que es otro contrato, posiblemente desarrollado por otra persona y no nos interesa lo que haga. Esto no es así con delegatecall.

delegatecall no posee contexto de ejecución propio. Al usar esta función, la lógica y los cambios de estado se realizan en el contrato principal que originó la llamada con call. En otras palabras, el Contrato A sede su estado, valores de variables y demás, a un Contrato B y este tendrá acceso total al primer contrato y su contexto.

No es recomendable la utilización de delegatecall salvo escasas excepciones como llamar a una librería externa o solo utilizarlo para funciones puras que no modifique el estado del contrato.


Contribución creada por: Kevin Fiorentino (Platzi Contributor).