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 check
eine Funktion aus, indem ich caller.sol
die callee.sol
Vertragsadresse ü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')
}
}
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, require
um 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 Callee
und dann bereitgestellt Caller
und check
mit 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:
"callMe(string)"
, um den richtigen Funktionswähler zu erhalten.EventTest('testing')
.check
, da er von einer Transaktion aufgerufen wird.check
als markieren public
.keccak256
statt (dem veralteten) sha3
.callMe
, da er über aufgerufen wird call
und sowieso nichts zurückgegeben hat.callMe
Parameters von , da er nicht verwendet wird.callMe
als markieren public
.
Entschlüsseler
Benutzer19510
Entschlüsseler
decoded output
Abschnitt im Remix zu sehen. Soll es in diesem Szenario dort angezeigt werden?Benutzer19510
Benutzer19510
ganache-cli
, und dort funktioniert es auch.Benutzer19510
Entschlüsseler
Entschlüsseler
Benutzer19510