López Agustín
Adolfo Sebastián Jara Gavilanes
Jorge Guzman Suir
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).
López Agustín
Adolfo Sebastián Jara Gavilanes
Jorge Guzman Suir
Jader Moncayo
Leandro Vitale
Sebastian Perez
ProfesorGuillermo Leonardo Rossi
Sergio Bryan Madrid Nuñez
Cristian Marchese
DelegateCall:
Tenemos la posibildad de llamar a contratos externos desde nuestro contrato, hacer llamadas externas por medio de la funcion call, call va a permitir realizar un parametro que a traves de la firma que tiene, va a poder localizar una funcion que esta localizada en otro contrato y ejecutarla asi como si estuviera en nuestro contrato, esto se llama llamada externa, tambien podemos enviar saldo, mintear el gas, etc.
¿Que pasa cuando hacemos este tipo de llamdas? Todo el codigo que esta alojado en el codigo externo, se aloja en un contexto separado del nuestro, es decir, va a tener sus propias variables, su propia ejecucion que no va a estar ligada al nuestro, es lo esperable si hacemos una llamada externa, queremos que se ejecute en su propio contexto y que despues nos devuelva el resultado deseado.
Existe una llamada similar a call, en sentido de estructura, por ejemplo delegatecall no permite enviar transacciones, pero si permite llamar a funciones que esta en otro contrato, y la diferencia esta llamada que hacemos al otro contrato por medio de delegatecall trabajan en el contexto del contrato original, es decir si modificamos una variable o si llamamos a una funcion, vamos a estar haciendolo sobre el contrato original, asi que tenemos que muchisimo cuidado al usar delegatecall.
Muchas gracias por el resumen!!
Genial!. Muchas gracias por la informacion.
Delegatecall
Contexto de delegateCall Las llamadas externas con DelegateCall se ejecutan en el contexto del contrato llamado Si llamamos una función vamos a estar haciéndolo sobre el contrato original ¿Qué pasa cuando hacemos este tipo de llamadas? Todo el código del contrato externo se aloja en un contexto separado con propias variables y ejecución.
Las llamadas externas Call se ejecutan en el contexto del contrato receptor Remplazo de delegateCall es Call
Uso de delegateCall y Call
Creo que la pregunta del examen sobre esta clase, no se aclara en la clase..
Hola Leandro, puedes mencionar qué tema es ? (sin decir la pregunta puntualmente así no adelantamos). De paso, si tienes dudas en este tema con gusto puedo ayudar :)
hace referencia a una característica de delegatecall
Cuando estamos usando Proxies, ¿los contratos de Open Zeppelin internamente hacen uso de esta función? ¿Tendríamos que tener ciertas consideraciones al usar este patrón o arquitectura?
Sí, los proxies de openzeppelin hacen uso de esta función pero el delegate call que ellos usan es a bajo nivel, lo usan a nivel assembly. Igual creo que este video no es del todo claro, call y delegate call, ambas son funciones validas para usar pero su funcionamiento es diferente. Solo tienes que saber cuando usar una o la otra. y ambas teniendo cuidado con la lógica asociada ya que con una pueden atacarte al contrato que llama y con el otro al contrato que es llamado. Openzeppelin en su implementación estas cosas las tienen bien pensadas y por eso se mantienen seguros.