Problem mit Berechtigungsmodifikatoren

In diesem kleinen Beispiel versuche ich, mit Modifikatoren zu spielen, master1 erstellt den Vertrag und übergebe die Adresse von master2 als Parameter im Konstruktor.

contract testOnlyBy {
    address master1;
    address master2;

    modifier onlyByMaster1 { if (msg.sender != master1) throw; _ }
    modifier onlyByMaster2 { if (msg.sender != master2) throw; _ }
    modifier onlyByMaster1or2 { if (msg.sender != master1 || msg.sender != master2) throw; _ }

    // "0x6eec66e0133feb5e432584515880afad4be047f0"

    function testOnlyBy(address _master2) {
        master1 = msg.sender;
        master2 = _master2;
    }
    function get() external constant returns(address ret1, address ret2) {
        if (msg.sender == master1 || msg.sender == master2){
             return (master1, master2);
        }
    }
    function getonlyByMaster1() onlyByMaster1 external constant returns(address ret1, address ret2) {
        return (master1, master2);
    }
    function getonlyByMaster2() onlyByMaster2 external constant returns(address ret1, address ret2) {
         return (master1, master2);
    }

    function getonlyByMaster1or2() onlyByMaster1or2 external constant returns(address ret1, address ret2) {
         return (master1, master2);           
    }
}

Die getFunktion funktioniert wie beabsichtigt, aber die Idee ist, stattdessen Modifikatoren zu verwenden.

Ich verstehe nicht, warum getonlyByMaster1or20x0 zurückgegeben wird, obwohl die beiden Funktionen gleichwertig wären. Übersehe ich etwas?

Geben Sie hier die Bildbeschreibung ein

Antworten (1)

Versuchen Sie, sich zu ändern

modifier onlyByMaster1or2 { 
  if (msg.sender != master1 || msg.sender != master2) throw;
  _ 
}

zu

modifier onlyByMaster1or2 { 
  if (msg.sender != master1 && msg.sender != master2) throw;
  _ 
}

Der _Teil des Modifikators wird ausgeführt, wenn der folgende Ausdruck falsch ist:

(msg.sender != master1 && msg.sender != master2)

Dies ist gleichbedeutend damit, dass der folgende Ausdruck wahr ist:

(msg.sender == master1 || msg.sender == master2)

das ist die Logik in get().

omfg, Logik 101 .... danke, hat mir den Kopf verdreht