No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

No se trata de lo que quieres comprar, sino de quién quieres ser. Invierte en tu educación con el precio especial

Antes: $249

Currency
$209

Paga en 4 cuotas sin intereses

Paga en 4 cuotas sin intereses
Suscríbete

Termina en:

10 Días
20 Hrs
54 Min
7 Seg

DelegateCall

7/15
Recursos

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).

Aportes 3

Preguntas 1

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

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.

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

  • Call: límite de gas, trasferencias de valor, contexto separado del código
  • delegateCall: uso der librería, es mejor evitar para no caer en algunas de sus vulnerabilidades

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?