La función de llamada no es válida en el contrato

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);
    }
}

Primero, creo el NotifyContractcontrato, luego creo el Setcontrato y paso la NotifyContractdirección y otros userAddr_, pero la función callno es válida. NotifyContractno tienes el valor modificado? Solo 3 es válido. ¿Hay algo mal?

byte tokenAddr_es engañosa. Porque se supondrá que tokenAddr_es una dirección.
Lo siento, lo he corregido. Es extraño que la función de llamada no sea válida. ¿¿Hay algo mal??

Respuestas (1)

  1. call1nunca funcionará.
  2. Si el nombre de su contrato es Set, entonces la función constructora es function Set(). Olvidaste ponerlo en mayúscula. function set()Está Mal. Si comete este error address public tokenAddr;, siempre lo será 0x.
  3. bytees un alias de bytes1, por lo "notify(byte,address)"que no es la firma canónica. "notify(bytes1,address)"es.
Muchas gracias. 1. ¿Por qué call1 nunca funcionará? en realidad no funciona. 2.como dijiste, cambio byte a bytes1, funciona. ¿por qué?
call1nunca funcionará porque no es así como llamas a una función. Los primeros 4 bytes deben calcularse según call2y "notify"no son 4 bytes ni correctos. Y el cálculo de la firma call2tiene que usar la firma canónica. Si no lo hace, el sha3es diferente y la función no se reconoce.
Si esto respondió a su pregunta, también podría marcarlo como tal. Salud