wie man eine Vertragsfunktion in einen anderen Vertrag aufruft

contract xyz {
    mapping(address => bool) Users;
    function add(address userAddress) {
            require(userAddress != 0x0 && !Users[userAddress]);             
            Users[userAddress] = true;    
    }
    function pass(address passAddress) returns (bool) {   
        return Users[passAddress];
    }
}

contract SaveData {
    address[] addrs;
    string[] hashSet;
    xyz asd = xyz();
    function Save(address PubAddress) {
        require(asd.pass(PubAddress)==true);
        addrs.push(PubAddress);    //saving public addresses

    }
//function to save hash
    function saveHash(string hashStr) {
        hashSet.push(hashStr);
    }
}

Ich bin neu bei Solidity, ich erstelle eine einfache Benutzerregistrierung und überprüfe und speichere sie mit einem anderen Vertrag. Vertrag xyz funktioniert einwandfrei, aber jetzt möchte ich ihn in SaveData Contract aufrufen und die Adresse mit der Pass-Funktion überprüfen, die nur dann die Adresse speichert, wenn die Adresse auf der weißen Liste steht.

vielen Dank im Voraus

@MichaelKohl, was ich brauche, ist, dass ich meinen xyz-Vertrag bereitgestellt habe und eine Adresse generiert habe. Jetzt muss ich dieselbe Adresse im Savedata-Vertrag senden und mit der Speicherfunktion speichern.
Das sieht gut aus, außer dass Sie niemals asd.add() aufrufen, um Ihre Adressen auf die Whitelist zu setzen. Was funktioniert Ihrer Meinung nach nicht? (Auch keine Notwendigkeit für "==true" in Ihrer Anforderung.)

Antworten (1)

Die Hauptsache ist, dass Sie eine Variable als Instanz Ihres Vertrags umwandeln und sie dann an der Adresse instanziieren, an der Sie sie erwarten.

Etwas wie

MyContract myContract; 
myContract = MyContract(contractAddress);

Ich konnte nicht anders und passte die Namen einiger Dinge an.

pragma solidity 0.4.21;

contract UserReg {

    mapping(address => bool) public isUser;

    function add(address userAddress) public {
        require(userAddress != 0x0 && !isUser[userAddress]);             
        isUser[userAddress] = true;    
    }

    function pass(address passAddress) public view returns(bool) {   
        return isUser[passAddress];
    }

    // Added this for safety check near 31

    function isUserReg() public pure returns(bool isIndeed) {
        return true;
    }
}

contract SaveData {

    address[] public addrs;

    UserReg userReg;

    function instantiateXyz(address userRegAddr) public returns(bool success) {
        userReg = UserReg(userRegAddr);     // instantiate asd instance of Zyz
        require(userReg.isUserReg());       // should return true, right?
        return true;
    }

    function saveAddress(address pubAddress) public returns(bool success) {
        require(userReg.pass(pubAddress)==true);
        addrs.push(pubAddress);    //saving public addresses
        return true;
    }

}

Ich hoffe es hilft.