¿Cómo preservar msg.sender==B cuando el usuario A llama al contrato B que llama al contrato C que llama a la biblioteca de contratos D?

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.originya que tx.origines A.

El usuario A creó la dirección de C y la dirección de D, pero no B.

DELEGATECALLno es la solucion no?

Cada vez, la dirección ( this) es diferente. Tenga en cuenta que la respuesta no está tx.originde todos modos. ¡ Nunca  !
¿Por qué no pasar la dirección B como parámetro a C y hacer que C pase esto como parámetro a D?
@Jaime porque la interfaz ERC20 de C es un código fuente verificable en etherescan, mientras que mantendría la fuente cerrada de D. Cuantos menos parámetros pase a D, menos gente tendrá una idea de D.

Respuestas (2)

Desde el contrato C puedes hacer un delegatecalla 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.sendercomo parámetro de función a otro contrato, y pasar esa dirección al siguiente, y así sucesivamente.

Pero si entiendo correctamente, la respuesta a la que hace referencia parece indicar que delagatecall solo se puede usar para llamar a la misma dirección ( thisde B sería igual thisa 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 notdecir que todos están almacenados en la misma dirección de Ethereum?