Я пытаюсь вызвать другую функцию контрактов. Когда я тестирую это в ремиксе и проверяю транзакцию, я не вижу, что событие выполняется. Ошибка тоже не отображается.
Я выполняю check
функцию при caller.sol
передаче callee.sol
адреса контракта, но событие никогда не запускается
caller.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')
}
}
Эта строка:
callbackAddress.call(bytes4(sha3("callMe")));
использует неправильную сигнатуру функции. Это должно быть так:
callbackAddress.call(bytes4(sha3("callMe(string)")));
Всегда проверяйте возвращаемое значение call()
. Я предполагаю, что здесь происходит сбой, поэтому проблема не в том, что событие не регистрируется; дело в том, что вызов терпит неудачу (поскольку нет подходящего селектора функций).
РЕДАКТИРОВАТЬ
Рабочий код, который я протестировал после отключения всех предупреждений компилятора и добавления , require
чтобы убедиться, что вызов выполнен успешно:
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');
}
}
Я протестировал в Remix с виртуальной машиной JavaScript, сначала развернув Callee
, а затем развернув Caller
и вызвав check
адрес развернутого файла Callee
. Событие было зарегистрировано, как и ожидалось.
Изменения, которые я сделал, приведены ниже. Только первые два необходимы для работы кода:
"callMe(string)"
, чтобы получить правильный селектор функций.EventTest('testing')
.check
, так как он будет вызываться транзакцией.check
как public
.keccak256
вместо (устаревшее) sha3
.callMe
, так как он будет вызываться через call
и все равно ничего не возвращает.callMe
параметра , так как он не используется.callMe
как public
.
Расшифровщик
пользователь19510
Расшифровщик
decoded output
разделе remix. Должен ли он отображаться там в этом сценарии?пользователь19510
пользователь19510
ganache-cli
, и там тоже работает.пользователь19510
Расшифровщик
Расшифровщик
пользователь19510