Cuando creo el objeto de clase secundaria e intento acceder al valor de msg.sender desde la clase principal, siempre aparece 0. ¿Alguien puede ayudarme con esto? A continuación se muestra el código de muestra:
contract Test1 is Test2 {
constructor() Test2() {}
}
contract Test2
{
address testVal;
constructor()
{testVal= msg.sender; }
function getMSGSender() view returns ( address) {
return testVal;
}
}
Un poco de limpieza.
Test2
definirse antes Test1
de heredar de él, por lo que se invierte el orden.public
a las funciones para evitar la advertencia sobre la visibilidad predeterminada.Test1
no tiene nada más que hacer, por lo que se eliminó. Como hereda de Test2
, el Test2
constructor se ejecutará. En caso de que no quede claro, Test1
tendrá una variable de estado llamada testVal
y la función getMSGSender()
y no hay necesidad de implementar Test2
.-
pragma solidity 0.4.24;
contract Test2
{
address testVal;
constructor() public {
testVal= msg.sender;
}
function getMSGSender() public view returns ( address) {
return testVal;
}
}
contract Test1 is Test2 {
}
Puede llamar Test1.getMSGSender()
y obtener el resultado esperado.
No mencionaste lo que estás usando para probar el contrato. Aquí está en Remix para mostrar que funciona sin preocuparse por las preocupaciones del lado del cliente.
Aparte, podría address public testVal;
y eso le daría un captador "gratuito" ( function testVal() public view returns(address)...
) que hace exactamente lo que hace su función. Lo dejé como está para ayudar a enfocarme en un problema a la vez.
Una versión más sucinta:
pragma solidity 0.4.24;
contract Test2
{
address public testVal;
constructor() public {
testVal= msg.sender;
}
}
contract Test1 is Test2 {}
Espero eso ayude.