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 get
Funktion funktioniert wie beabsichtigt, aber die Idee ist, stattdessen Modifikatoren zu verwenden.
Ich verstehe nicht, warum getonlyByMaster1or2
0x0 zurückgegeben wird, obwohl die beiden Funktionen gleichwertig wären. Übersehe ich etwas?
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()
.
eur10