функция с msg.sender не возвращает адрес

Функция возвращает нулевой адрес в любом случае.

pragma solidity ^0.4.9;

contract Test {

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

Пробовал через myetherwallet и паритет, сеть не синхронизируется.

Я проверил ваш код, и функция getSender() правильно возвращает адрес.
В вашем коде, который вы сохраняете msg.senderв переменной da, такая функция не может быть постоянной, потому что вы изменяете состояние контракта.
Почему не просто return msg.sender;?
Нужен ли эфир на контракте для выполнения этой функции?

Ответы (4)

В функции запроса вы пытаетесь обновить переменную состояния контракта. Вы можете вернуть msg.sender без использования каких-либо переменных

pragma solidity ^0.4.9;

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

Вы либо возвращаете msg.sender без обновления переменной состояния "da", так что это действительно постоянная функция, либо вы не делаете ее постоянной, но вам придется получить возвращаемое значение из события, если вы хотите получить к нему доступ.

Функции константы/представления не могут каким-либо образом изменять переменные состояния.

Вы можете установить msg.sender в da в конструкторе, а затем просто вернуть da с модификатором View.

pragma solidity ^0.4.9;

contract Test {

    address da;

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

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

Вы можете обновить переменную состояния или сделать функцию доступной только для чтения (с помощью constant, viewили pure), но вы не можете сделать и то, и другое. Я проголосовал за три ответа, которые говорят по-разному и предлагают разные подходы в зависимости от того, что вам нужно.

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

Надеюсь, поможет.