En los contratos inteligentes de solidez, ¿cómo accede a las variables de estado internas declaradas en el constructor?

Estoy trabajando con un contrato de solidez que declara una variable de estado en el constructor de esta manera:

    constructor(
    address vault,
    address proxy
)
    public
    MarginAdmin()
{
    state = MarginState.State({
        VAULT: vault,
        PROXY: proxy
    });
}

Tengo entendido que esta variable de estado es interna y no se creará un getter. ¿Cómo accedo a esta variable de estado desde fuera del contrato como desde una dApp?

Respuestas (2)

Simplemente debe incluir esas variables fuera de la función constructora como una variable global para el contrato.

ownableEche un vistazo a un contrato bastante simple de entender y de uso muy común : https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/ownership/Ownable.sol

contract Ownable {
  address public owner;


  event OwnershipRenounced(address indexed previousOwner);
  event OwnershipTransferred(
    address indexed previousOwner,
    address indexed newOwner
  );


  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  constructor() public {
    owner = msg.sender;
}
...

Como puede ver, la address public ownervariable vive fuera de la función constructora y, en cambio, simplemente se establece (en lugar de declararse) dentro del constructor.

¿Funcionaría este patrón para su escenario, o hay alguna necesidad específica de inicializar la variable como parte de la función constructora?

Estoy trabajando para crear una dApp sobre un contrato inteligente implementado, por lo que no tengo la capacidad de editar el contrato.

Las variables de estado no se pueden declarar dentro de un constructor (u otra función). Deben declararse a nivel de contrato. El código que compartió parece hacer uso de una variable ya declarada.

Presumiblemente, verá algo como MarginState public state;fuera del constructor. Ahí es donde statese declara la variable de estado llamada.

Para obtenerlo desde fuera del contrato, simplemente llame al captador generado automáticamente state(). Tenga en cuenta que si nostate se declara como , entonces no podrá hacer esto.public

Consulte https://programtheblockchain.com/posts/2018/01/02/making-smart-contracts-with-public-variables/ para obtener más información sobre las variables de estado público.

Gracias, tiene razón en que se declaró en otro lugar fuera del constructor, pero no se declaró como público. ¿Cómo es mejor leer de variables que no son públicas?
De otro contrato, básicamente no puedes. Desde fuera de la cadena de bloques, puede usar getStorageAt. La publicación de blog a la que me vinculé brinda un ejemplo de eso, pero deberá averiguar en qué lugar del almacenamiento se encuentran esos datos. (Si comparte el contrato completo, puedo ayudar más).