Funktion mit msg.sender gibt keine Adresse zurück

Die Funktion gibt in jedem Fall eine Nulladresse zurück.

pragma solidity ^0.4.9;

contract Test {

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

Versucht durch Myetherwallet und Parität, Netzwerk ist nicht synchronisiert.

Ich habe Ihren Code getestet und die Funktion getSender() gibt die Adresse korrekt zurück.
In Ihrem Code, den Sie msg.senderin der Variable speichern da, kann eine solche Funktion nicht konstant sein, da Sie den Vertragsstatus ändern.
Warum nicht einfach return msg.sender;?
Benötige ich einen Ether im Vertrag, um diese Funktion auszuführen?

Antworten (4)

In einer Abfragefunktion versuchen Sie, die Vertragsstatusvariable zu aktualisieren. Sie können msg.sender zurückgeben, ohne Variablen zu verwenden

pragma solidity ^0.4.9;

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

Sie geben entweder msg.sender zurück, ohne die Zustandsvariable "da" zu aktualisieren, damit es wirklich eine konstante Funktion ist, oder Sie machen es nicht konstant, aber Sie müssen den Rückgabewert aus einem Ereignis abrufen, wenn Sie darauf zugreifen möchten.

Konstanten-/Ansichtsfunktionen können Zustandsvariablen in keiner Weise ändern.

Sie können den msg.sender im Konstruktor auf da setzen und dann einfach da mit dem Modifikator View zurückgeben.

pragma solidity ^0.4.9;

contract Test {

    address da;

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

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

Sie können eine Zustandsvariable aktualisieren oder die Funktion schreibgeschützt machen (mit constant, viewoder pure), aber Sie können nicht beides tun. Ich habe drei Antworten positiv bewertet, die es anders sagen und unterschiedliche Ansätze bieten, je nachdem, was Sie tun müssen.

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

Ich hoffe es hilft.