Adresse wird nicht korrekt in Zustandsvariable gespeichert?

Ich versuche, einen Vertrag zu schreiben, bei dem der Urheber des Vertrags eine Belohnung anbietet, die nur von einer anderen von ihr oder ihm angegebenen Adresse beansprucht werden kann. Dazu versuche ich, eine Zustandsvariable vom Typ „Adresse“ zu erstellen, die die Adresse der Person speichert, die berechtigt ist, die Belohnung zu beanspruchen, die ich den „Botschafter“ nenne.

Siehe den folgenden Code:

pragma solidity ^0.4.19;    
contract AmbassadorTask {
    address private owner; // Address of business offering rewards for a task 
    uint taskReward; // How much ether ambassadors get every time they complete a task
    address ambassador; // Represents person allowed to complete task and claim rewards

    //Constructor
    function AmbassadorTask (address _ambassador) public payable {
            require (msg.value > 0); // No point creating tasks with no rewards
            owner = msg.sender;  // Set creator to be the owner of this contract
            taskReward = msg.value;
            ambassador = _ambassador;
    }

    function getAmbassador() public view returns (address _ambassador) {
        return ambassador;
    }
}

Der Code wird in Remix korrekt kompiliert, aber wenn ich ihn zur Laufzeit mit der JavaScriptVM teste, ist die im Vertrag gespeicherte „Botschafter“-Adresse nicht dieselbe Adresse, die ich als Eingabe im Konstruktor übergebe.

Zum Beispiel übergebe ich 0x14723a09acff6d2a60dcdf7aa4aff308fddc160c als Eingabe, wenn ich den Konstruktor aufrufe. Wenn ich sofort getAmbassador() aufrufe, bekomme ich die folgende Ausgabe: 0xa4aff308fddc160c000000000000000000000000, anstelle des Wertes, den ich eingegeben habe, um den Vertrag zu erstellen. Mir ist auch aufgefallen, dass es nur die letzten 16 Hexadezimalziffern der Adresse sind, die ich übergeben habe, gefolgt von nachgestellten Nullen.

Im Gegensatz dazu habe ich nicht das gleiche Problem beim Speichern von msg.sender in der Eigentümerstatusvariablen, wenn ich den Konstruktor aufrufe.

Warum passiert das? Ich speichere die Adresswerte falsch? Ist dies ein Problem bei der Datenkonvertierung?

Vielen Dank im Voraus für Ihre Hilfe!

Danke für das Kontrollieren! Ich frage mich, ob es hilfreich sein könnte, die Adresse als Zeichenfolge zu übergeben und sie dann während des Konstruktors in eine Adresse umzuwandeln, nur um dies zu umgehen. Ich frage mich nur.

Antworten (1)

Stellen Sie sicher, dass Sie die Adresse in Anführungszeichen setzen, wenn Sie sie als Konstruktorparameter angeben. Remix ist sehr schlecht darin, Hexadezimal-Strings ohne Anführungszeichen zu analysieren.

Ich konnte das Verhalten, das Sie gesehen haben, nur reproduzieren, indem Sie eine hexadezimale Zeichenfolge ohne Anführungszeichen verwenden. Mit Anführungszeichen funktionierte es alle 10 Mal richtig, als ich es versuchte.

Jawohl!!! Das hat es getan. Vielen Dank. Ich kann nicht glauben, dass es nur an fehlenden Anführungszeichen lag. Vielen Dank für Ihre Hilfe!