Вызов другой функции смарт-контрактов, которая выполняет событие

Я пытаюсь вызвать другую функцию контрактов. Когда я тестирую это в ремиксе и проверяю транзакцию, я не вижу, что событие выполняется. Ошибка тоже не отображается.

Я выполняю 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')
    }
}

Ответы (1)

Эта строка:

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').
  • Укажите версию компилятора.
  • Избавьтесь от возвращаемого типа on check, так как он будет вызываться транзакцией.
  • Явно пометить checkкак public.
  • Используйте keccak256вместо (устаревшее) sha3.
  • Отбросьте возвращаемый тип из callMe, так как он будет вызываться через callи все равно ничего не возвращает.
  • Отбросьте имя callMeпараметра , так как он не используется.
  • Явно пометить callMeкак public.
Спасибо за ответ. Я пробовал это, но все равно не повезло
Я отредактировал свой пост, чтобы включить рабочий код.
Спасибо. Я использую свой локальный testrpc и ожидаю увидеть событие в decoded outputразделе remix. Должен ли он отображаться там в этом сценарии?
Да, должно.
Извините, нет, это должно быть в разделе "журналы" в Remix. Я только что проверил с ganache-cli, и там тоже работает.
Если у вас все еще есть проблемы, возможно, вы можете поделиться точным кодом, который вы используете? (Код, которым вы поделились, не скомпилировался из-за отсутствия точки с запятой, поэтому это не мог быть именно тот код, который вы использовали.)
У меня есть то, что у вас есть. Позвольте мне взглянуть на это немного дальше. Я ожидаю увидеть событие в журнале, но нет - imgur.com/a/gD6Vh
Если я использую строковый адрес в качестве параметра, я получаю - imgur.com/a/13MSR
Мне это кажется правильным. Адреса должны быть заключены в кавычки в Remix. Я думаю, что что-то недавно изменилось, потому что я больше не вижу сообщения об ошибке, когда не могу использовать кавычки.