Функция вызова недействительна в договоре

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 подходит. Здесь что-то не так?

byte tokenAddr_вводит в заблуждение. Потому что предполагается tokenAddr_, что это адрес.
извините, я поправил. Странно, что функция вызова недействительна. Что-то не так??

Ответы (1)

  1. call1никогда не будет работать.
  2. Если имя вашего контракта Set, то функция конструктора function Set(). Вы забыли написать это с большой буквы. function set()неправильно. Если вы сделаете эту ошибку, то address public tokenAddr;всегда будет 0x.
  3. byteявляется псевдонимом для bytes1, поэтому "notify(byte,address)"не является канонической подписью. "notify(bytes1,address)"является.
большое спасибо. 1. Почему call1 никогда не будет работать? это на самом деле не работает. 2. как вы сказали, я меняю байт на байты1, это работает. Зачем?
call1никогда не будет работать, потому что это не то, как вы вызываете функцию. Первые 4 байта должны быть рассчитаны в соответствии с call2и "notify"не являются ни 4 байтами, ни правильными. И расчет подписи call2должен использовать каноническую подпись. Если вы этого не сделаете, sha3функция будет другой, и функция не будет распознана.
Если это ответ на ваш вопрос, вы могли бы также пометить его как таковой. Ваше здоровье