contract NotifyContract { //address at 0x971A46e7C16D2bBEd2167460961D86Dc3715EE32
address public userAddr;
byte public types;
function notify(byte tokenByte,address userAddr_){
types=tokenByte;
userAddr=userAddr_;
}
}
//
contract Set {
bool public ret;
address public tokenAddr;
address public userAddr;
function Set(address tokenAddr_,address userAddr_){
tokenAddr=tokenAddr_;
userAddr=userAddr_;
}
function call1(byte bb){
ret=tokenAddr.call("notify",bb,userAddr); //1 not valid
}
function call2(byte bb){
tokenAddr.call(bytes4(sha3("notify(byte,address)")),bb,userAddr);//2 not valid
}
function call3(byte bb){
NotifyContract c=NotifyContract(tokenAddr);// valid
c.notify(bb,userAddr);
}
}
Сначала я создаю NotifyContract
контракт, затем я создаю Set
контракт и передаю NotifyContract
адрес и прочее userAddr_
, но функция call
недействительна. NotifyContract
не имеют измененного значения? только 3 подходит. Здесь что-то не так?
call1
никогда не будет работать.Set
, то функция конструктора function Set()
. Вы забыли написать это с большой буквы. function set()
неправильно. Если вы сделаете эту ошибку, то address public tokenAddr;
всегда будет 0x
.byte
является псевдонимом для bytes1
, поэтому "notify(byte,address)"
не является канонической подписью. "notify(bytes1,address)"
является.call1
никогда не будет работать, потому что это не то, как вы вызываете функцию. Первые 4 байта должны быть рассчитаны в соответствии с call2
и "notify"
не являются ни 4 байтами, ни правильными. И расчет подписи call2
должен использовать каноническую подпись. Если вы этого не сделаете, sha3
функция будет другой, и функция не будет распознана.
Ксавье Лепретр B9lab
byte tokenAddr_
вводит в заблуждение. Потому что предполагаетсяtokenAddr_
, что это адрес.Джим Грин