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).
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.balance
funciona en Solidity.
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.
pablo s
ética
11t
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)ética
A
y es posible que pueda llamarlob
comosuper.nameOfAccessor()
. Esto sería diferente deb
acceder al almacenamiento deA
directamente.