¿Puede un contrato acceder al almacenamiento de otro contrato?

Tengo un contrato con numerosas estructuras complejas. ¿Es posible que un segundo contrato itere sobre estos datos directamente?

Realmente no puedo usar métodos públicos de acceso/obtención ya que no es posible usar estructuras externamente, por lo que tendría que aplanar la estructura de datos (probablemente también hacer copias costosas).

Respuestas (2)

Un contrato no puede acceder directamente al almacenamiento de otro contrato.

Dados los contratos C1 y C2, C1 solo puede acceder al almacenamiento de C2 invocando un método en C2 que devuelve datos del almacenamiento de C2.

Como está escribiendo C2, puede acceder a su almacenamiento desde C1 y puede progresar. Una pregunta más específica puede ayudar a proporcionar una respuesta más específica sobre el diseño de sus contratos (estructuras, aplanamiento, copias...).


Relacionado, hay 3 cosas a las que un contrato puede acceder desde otro contrato: saldo, código, tamaño del código .

Los mecanismos subyacentes para hacerlo son los siguientes códigos de operación EVM, del Libro amarillo :

BALANCE: Obtenga el saldo de la cuenta dada

EXTCODECOPY: Copie el código de una cuenta en la memoria.

EXTCODESIZE: Obtener el tamaño del código de una cuenta.

Según el comentario de Paul, address.balancefunciona en Solidity.

nit menor: Puede acceder al saldo de otro contrato. address.balance funciona AFAICT.
Upvoted, gracias por el recordatorio y actualizaré la respuesta ya que también hay EXTCODECOPY ...
@eth ¿Qué sucede si el segundo contrato es la continuación del primer contrato, es decir, ` contract A{ struct egStruct{ uint number; bool value; //.... } mapping (uint => egStruct) structMapping; //...code... } contract b is A { //...code }En este caso también, no es posible acceder a un mapeo (que no es público)? En realidad, mi pregunta específica sería: si en este caso quiero acceder a la estructura a través del mapeo del contrato A desde el contrato b, ¿puedo hacerlo? (Lo intenté y obtengo valores en blanco para todos)
@Rajat Escriba un elemento de acceso Ay es posible que pueda llamarlo bcomo super.nameOfAccessor(). Esto sería diferente de bacceder al almacenamiento de Adirectamente.

Técnicamente, todos los datos disponibles para cualquier contrato deben estar disponibles públicamente, ya que cualquiera puede ejecutar un nodo y reproducir toda la vigencia del contrato. Esto significa que sí, es estrictamente posible que un contrato acceda a los datos internos de otro, incluso si no hay una forma integrada de hacerlo.

La primera respuesta que viene a la mente es crear un servicio de Oracle con un método expuesto al que pueda llamar que acepte la identificación del contrato y los datos que desea, vuelva a ejecutar o lea la cadena de bloques para obtenerla y se la devuelva a la persona que llama.

No sé si alguien ha creado algo como esto todavía, pero si es de vital importancia para ti poder leer los datos de otro contrato, ciertamente podrías hacerlo.

TL; DR Sí, puede, pero requiere que cree un servicio de Oracle separado para que lo haga por usted, ya que no hay un método integrado que lo permita.