msg.sender es nulo en el constructor base

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;
   }
}

Respuestas (1)

Un poco de limpieza.

  1. Necesita Test2definirse antes Test1de heredar de él, por lo que se invierte el orden.
  2. Agregue publica las funciones para evitar la advertencia sobre la visibilidad predeterminada.
  3. Constructor en Test1no tiene nada más que hacer, por lo que se eliminó. Como hereda de Test2, el Test2constructor se ejecutará. En caso de que no quede claro, Test1tendrá una variable de estado llamada testValy 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.

ingrese la descripción de la imagen aquí

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.