В этом небольшом примере я пытаюсь поиграть с модификаторами, master1 создает контракт и передает адрес master2 в качестве параметра в конструкторе.
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);
}
}
функция get
работает как задумано, но идея состоит в том, чтобы вместо этого использовать модификаторы.
Я не понимаю, почему getonlyByMaster1or2
возвращает 0x0, хотя эти две функции эквивалентны. Я что-то упускаю ?
Попробуйте изменить
modifier onlyByMaster1or2 {
if (msg.sender != master1 || msg.sender != master2) throw;
_
}
к
modifier onlyByMaster1or2 {
if (msg.sender != master1 && msg.sender != master2) throw;
_
}
Часть _
модификатора будет запущена, если следующее выражение ложно:
(msg.sender != master1 && msg.sender != master2)
Это эквивалентно истинности следующего выражения:
(msg.sender == master1 || msg.sender == master2)
в чем логика get()
.
евро10