Llamar a otra función de contratos inteligentes que ejecuta un evento

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 checkla función al caller.solpasar la callee.soldirecció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')
    }
}

Respuestas (1)

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 requirepara 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 Calleey luego implementando Callere invocando checkcon 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:

  • Úselo "callMe(string)"para obtener el selector de función correcto.
  • Agregue un punto y coma al final de EventTest('testing').
  • Especifique una versión del compilador.
  • Deshágase del tipo de retorno en check, ya que será invocado por una transacción.
  • Marcar explícitamente checkcomo public.
  • Usar keccak256en lugar de (el obsoleto) sha3.
  • Descarte el tipo de devolución de callMe, ya que se invocará a través de cally no devolvió nada de todos modos.
  • Suelte el nombre del callMeparámetro de , ya que no se usa.
  • Marcar explícitamente callMecomo public.
Gracias por la respuesta. Intenté eso pero aún no tuve suerte.
Edité mi publicación para incluir el código de trabajo.
Gracias. Estoy usando mi testrpc local y espero ver el evento en la decoded outputsección de remix. ¿Debería mostrarse allí en este escenario?
Sí, debería.
Lo siento, no, debería estar en la sección "registros" de Remix. Acabo de probar con ganache-cli, y también funciona allí.
Si todavía tiene problemas, ¿quizás pueda compartir el código exacto que está usando? (El código que compartió no se compiló debido a que faltaba un punto y coma, por lo que no puede haber sido el código exacto que estaba usando).
yo tengo lo que tu tienes Déjame investigarlo un poco más. Espero ver el evento registrado pero no lo hago - imgur.com/a/gD6Vh
Si uso una dirección de cadena como parámetro, obtengo: imgur.com/a/13MSR
Eso me parece correcto. Las direcciones deben ser cadenas entrecomilladas en Remix. Creo que algo cambió recientemente, porque ya no veo un mensaje de error cuando no uso comillas.