DelegateCall
Clase 7 de 15 • Curso de Introducción a Seguridad de Smart Contracts
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).