Aufrufen einer anderen Smart-Contracts-Funktion, die ein Ereignis ausführt

Ich versuche, eine andere Vertragsfunktion aufzurufen. Wenn ich dies in Remix teste und die Transaktion inspiziere, sehe ich nicht, dass das Ereignis ausgeführt wird. Es wird auch kein Fehler angezeigt.

Ich führe checkeine Funktion aus, indem ich caller.soldie callee.solVertragsadresse übergebe, aber das Ereignis wird nie ausgeführt

Anrufer.sol

contract Caller {        
    function check(address callbackAddress) returns (string) {
           callbackAddress.call(bytes4(sha3("callMe")));
           return 'something';  
    }
}

angerufen.sol

contract Callee {  
    event EventTest(string value1);

    function callMe(string value) returns (string) {
            EventTest('testing')
    }
}

Antworten (1)

Diese Linie:

callbackAddress.call(bytes4(sha3("callMe")));

verwendet die falsche Funktionssignatur. Das sollte es sein:

callbackAddress.call(bytes4(sha3("callMe(string)")));

Überprüfen Sie immer den Rückgabewert von call(). Ich nehme an, dass es hier fehlschlägt, also ist das Problem nicht, dass das Ereignis nicht protokolliert wird; Der Aufruf schlägt fehl (weil es keinen passenden Funktionsselektor gibt).

BEARBEITEN

Arbeitscode, den ich getestet habe, nachdem ich alle Compiler-Warnungen stummgeschaltet und eine hinzugefügt hatte, requireum sicherzustellen, dass der Aufruf erfolgreich war:

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

Ich habe in Remix mit der JavaScript-VM getestet, indem ich zuerst bereitgestellt Calleeund dann bereitgestellt Callerund checkmit der Adresse der bereitgestellten aufgerufen habe Callee. Das Ereignis wurde wie erwartet protokolliert.

Änderungen, die ich vorgenommen habe, sind unten. Nur die ersten beiden sind notwendig, damit der Code funktioniert:

  • Verwenden Sie "callMe(string)", um den richtigen Funktionswähler zu erhalten.
  • Fügen Sie am Ende von ein Semikolon hinzu EventTest('testing').
  • Geben Sie eine Compilerversion an.
  • Entfernen Sie den Rückgabetyp on check, da er von einer Transaktion aufgerufen wird.
  • Ausdrücklich checkals markieren public.
  • Verwenden Sie keccak256statt (dem veralteten) sha3.
  • Löschen Sie den Rückgabetyp von callMe, da er über aufgerufen wird callund sowieso nichts zurückgegeben hat.
  • Löschen Sie den Namen des callMeParameters von , da er nicht verwendet wird.
  • Ausdrücklich callMeals markieren public.
Danke für die Antwort. Ich habe das versucht, aber immer noch kein Glück
Ich habe meinen Beitrag so bearbeitet, dass er den Arbeitscode enthält.
Danke. Ich verwende meinen lokalen TestrPC und erwarte, das Ereignis im decoded outputAbschnitt im Remix zu sehen. Soll es in diesem Szenario dort angezeigt werden?
Ja, das sollte es.
Tut mir leid, nein, es sollte sich im Abschnitt "Protokolle" in Remix befinden. Ich habe gerade mit getestet ganache-cli, und dort funktioniert es auch.
Wenn Sie immer noch Probleme haben, können Sie vielleicht den genauen Code teilen, den Sie verwenden? (Der von Ihnen freigegebene Code wurde aufgrund eines fehlenden Semikolons nicht kompiliert, daher kann es nicht genau der Code gewesen sein, den Sie verwendet haben.)
Ich habe, was du hast. Lassen Sie mich ein wenig weiter darauf eingehen. Ich erwarte, dass das Ereignis protokolliert wird, aber nicht - imgur.com/a/gD6Vh
Wenn ich eine Zeichenfolgenadresse als Parameter verwende, erhalte ich - imgur.com/a/13MSR
Das sieht für mich richtig aus. Adressen müssen in Remix Zeichenfolgen in Anführungszeichen sein. Ich denke, dass sich kürzlich etwas geändert hat, da ich keine Fehlermeldung mehr sehe, wenn ich keine Anführungszeichen verwende.