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 NotifyContract
contrato, luego creo el Set
contrato y paso la NotifyContract
dirección y otros userAddr_
, pero la función call
no es válida. NotifyContract
no tienes el valor modificado? Solo 3 es válido. ¿Hay algo mal?
call1
nunca funcionará.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
.byte
es un alias de bytes1
, por lo "notify(byte,address)"
que no es la firma canónica. "notify(bytes1,address)"
es.call1
nunca funcionará porque no es así como llamas a una función. Los primeros 4 bytes deben calcularse según call2
y "notify"
no son 4 bytes ni correctos. Y el cálculo de la firma call2
tiene que usar la firma canónica. Si no lo hace, el sha3
es diferente y la función no se reconoce.
Xavier Leprêtre B9lab
byte tokenAddr_
es engañosa. Porque se supondrá quetokenAddr_
es una dirección.jim verde