Tengo un usuario A que llama al contrato B que llama al contrato C que llama al contrato D. ¿
Cómo llamar a la biblioteca externa D desde el contrato C mientras se conserva msg.sender==B
? Por supuesto, no puedo usar tx.origin
ya que tx.origin
es A.
El usuario A creó la dirección de C y la dirección de D, pero no B.
DELEGATECALL
no es la solucion no?
Desde el contrato C puedes hacer un delegatecall
a D, esto preservará el remitente (B)
Pero no cambiará el almacenamiento, seguirá accediendo al almacenamiento del contrato C.
Esto solo funciona si el contrato D no necesita almacenamiento o se escribió para acceder al almacenamiento desde C (por ejemplo, si D es un contrato de biblioteca).
Todo depende de si eres el autor de todos estos contratos o no. Puedes lograr esto con combinaciones de DELEGATECALL
, mira esta respuesta. Pero siempre tenga cuidado, si no es el único a cargo de los aspectos críticos de los contratos (por ejemplo, cuando tienen funciones de proxy, por lo que alguien podría redirigir las llamadas a un código inesperado), no recomendaría confiar en delegar llamada. Otra solución sería msg.sender
como parámetro de función a otro contrato, y pasar esa dirección al siguiente, y así sucesivamente.
this
de B sería igual this
a C) con otros datos. Pero en mi caso, quiero que se verifique el código de solidez del contrato C en etherscan.io y la fuente cerrada de la biblioteca D (por lo que me gustaría evitar saber que D usa msg.sender a través del código C), lo que significa que todos los contratos se almacenan en cuenta de diferentes direcciones. ¿ Quiere depends if you're the author of all these contracts or not
decir que todos están almacenados en la misma dirección de Ethereum?
usuario2284570
this
) es diferente. Tenga en cuenta que la respuesta no estátx.origin
de todos modos. ¡ Nunca !Jaime
usuario2284570