Estoy tratando de llamar a otra función de contratos. Cuando pruebo esto en remix e inspecciono la transacción, no veo que se ejecute el evento. Tampoco se muestra ningún error.
Ejecuto check
la función al caller.sol
pasar la callee.sol
dirección del contrato pero el evento nunca se ejecuta
llamador.sol
contract Caller {
function check(address callbackAddress) returns (string) {
callbackAddress.call(bytes4(sha3("callMe")));
return 'something';
}
}
callee.sol
contract Callee {
event EventTest(string value1);
function callMe(string value) returns (string) {
EventTest('testing')
}
}
Esta línea:
callbackAddress.call(bytes4(sha3("callMe")));
utiliza la firma de función incorrecta. Debería ser esto:
callbackAddress.call(bytes4(sha3("callMe(string)")));
Siempre asegúrese de verificar el valor de retorno de call()
. Supongo que está fallando aquí, por lo que el problema no es que el evento no se registre; es que la llamada falla (porque no hay un selector de función coincidente).
EDITAR
Código de trabajo que probé después de silenciar todas las advertencias del compilador y agregar una require
para asegurarme de que la llamada tuviera éxito:
pragma solidity ^0.4.20;
contract Caller {
function check(address callbackAddress) public {
require(callbackAddress.call(bytes4(keccak256("callMe(string)"))));
}
}
contract Callee {
event EventTest(string value1);
function callMe(string) public {
EventTest('testing');
}
}
Probé en Remix con la VM de JavaScript implementando primero Callee
y luego implementando Caller
e invocando check
con la dirección del archivo Callee
. El evento se registró como se esperaba.
Los cambios que hice están a continuación. Solo los dos primeros son necesarios para que el código funcione:
"callMe(string)"
para obtener el selector de función correcto.EventTest('testing')
.check
, ya que será invocado por una transacción.check
como public
.keccak256
en lugar de (el obsoleto) sha3
.callMe
, ya que se invocará a través de call
y no devolvió nada de todos modos.callMe
parámetro de , ya que no se usa.callMe
como public
.
Descifrador
usuario19510
Descifrador
decoded output
sección de remix. ¿Debería mostrarse allí en este escenario?usuario19510
usuario19510
ganache-cli
, y también funciona allí.usuario19510
Descifrador
Descifrador
usuario19510