la función con msg.sender no devuelve la dirección

La función devuelve una dirección nula en cualquier caso.

pragma solidity ^0.4.9;

contract Test {

    address da;
    function getSender () constant returns (address){
        da=msg.sender;
        return da;
    }
}

Probado a través de myetherwallet y parity, la red no está sincronizada.

Probé su código y la función getSender() devuelve correctamente la dirección.
En su código, está almacenando msg.senderen la variable da, dicha función no puede ser constante porque está modificando el estado del contrato.
¿Por qué no solo return msg.sender;?
¿Necesito un ether en el contrato para realizar esta función?

Respuestas (4)

En una función de consulta, está intentando actualizar la variable de estado del contrato. Puede devolver msg.sender sin usar ninguna variable

pragma solidity ^0.4.9;

contract Test {
    address da;
    function getSender () constant returns (address){
        return msg.sender; // just return msg.sender
    }
}

O devuelve msg.sender sin actualizar la variable de estado "da", por lo que es realmente una función constante, o no lo hace constante, pero tendrá que obtener el valor de retorno de un evento si desea acceder a él.

Las funciones de vista/constante no pueden modificar las variables de estado de ninguna manera.

Puede establecer el msg.sender en da en el constructor y luego devolver da con el modificador Ver.

pragma solidity ^0.4.9;

contract Test {

    address da;

    function Test() public {
        da = msg.sender;
    }

    function getSender () public view returns (address){
        return da;
    }
}

Puede actualizar una variable de estado o puede hacer que la función sea de solo lectura (con constant, viewo pure), pero no puede hacer ambas cosas. He votado a favor de tres respuestas que lo dicen de manera diferente y ofrecen diferentes enfoques según lo que necesite hacer.

pragma solidity 0.4.9;

contract DA {

    address public da;

    function DA() public {
        da = msg.sender;
    }

    function setDa() public returns(bool success) {
        da = msg.sender;
        return true;
    }

    // getDa() is not really needed because da is made `public` near line 5, so function da() does the same.

    function getDa() public constant returns (address){
        return da;
    }

    function getMsgSender() public constant returns(address) {
        return msg.sender;
    }
}

Espero eso ayude.