No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

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?

o inicia sesi贸n.

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?