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?
Simplemente debe incluir esas variables fuera de la función constructora como una variable global para el contrato.
ownable
Eche 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 owner
variable 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?
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 state
se 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.
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).
J.McLaren