Взаимодействие между двумя интеллектуальными контрактами - функция «вызов» завершается с ошибкой. Зачем?

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

Я пытаюсь создать шаблон:
i- «Caller» получает вызов функции proxyRequest

ii- Caller использует параметр _target и вызывает функцию registerRequest по указанному адресу.
iii- «Событие, зарегистрированное пользователем» в «CallMe» должно срабатывать.

Но проблема в том, что функция «вызов» в «Caller» всегда возвращает false. Любые указатели будут оценены.

Если я использую Web3 и создаю транзакцию, которая вызывает функцию «registrationRequest» непосредственно в «CallMe», тогда она отлично работает.

contract Caller
{
    event SendingTransaction(address indexed _requestor, uint8 indexed action);     

    address public minter;
    bytes public email;      // hash of the email address

    modifier onlyOwner {
    if (msg.sender != minter)
        throw;
       _;
    }

    function() {
        throw;
    }

    function Caller(bytes _email) {

        // constructor
        minter= msg.sender;
        email= _email;
    }

    function proxyRequest(address _target, string _payload) onlyOwner public {

        SendingTransaction(_target, 1);
        // Event fires OK when I subscribe to it via Web3 code.

        if (!_target.call("registrationRequest",_target, _payload))
        {
            SendingTransaction(_target, 2);
            // Event fires OK when I subscribe to it via Web3 code.
        }
        else
        {
            SendingTransaction(_target, 3);
            // Event NEVER fires
        }


    }

}

Второй контракт.

pragma solidity ^0.4.7;

contract CallMe
{
    event UserRegistered(address indexed _from, string _attr);

    address public minter;     // keep track of the entity that created the contract

    modifier onlyOwner {
        if (msg.sender != minter)
            throw;
        _;
    }

    function CallMe() {
        minter = msg.sender;
    }

    function() { 
        throw;
    }

    function registrationRequest(address _toAdd, string _code) {

        // this event fires ok if I invoke it via web3
        // this event DOES NOT fire ok if function invoked by 'Caller'
        UserRegistered(_toAdd, _code);
    }


    function getMinter() constant returns (address) {
        return minter;
    }
}
5 голосов | спросил user2466631 10 Jpm1000000pmTue, 10 Jan 2017 14:57:25 +030017 2017, 14:57:25

1 ответ


4

В call из другого контракта вам необходимо предоставить хэш-файл sha3 подписи функции (см. документы о надежности и это Отличный ответ ):

_target.call(bytes4(sha3("registrationRequest(address,string)")), _target, _payload);

Другой вариант - явно преобразовать address в CallMe:

CallMe cm = CallMe(_target);
cm.registrationRequest(_target, _payload);

Обратите внимание на разницу: _target.call(..) возвращает false, если вызов не был успешным, а cm.registrationRequest(..) выдает исключение.


Здесь - это сценарий для запуска теста с node.js и testrpc. Вы можете видеть, что UserRegistered запущен и SendingTransaction(_target, 3) также срабатывает.

$ node test.js 
callme 0xf29c07da3e712ccda8fac94a9af499774bdbeeaa
caller 0x56157bb7ee83e749b5368f4c47ffc406fc653e5a
SendingTransaction { _requestor: '0xf29c07da3e712ccda8fac94a9af499774bdbeeaa',
  action: { [String: '1'] s: 1, e: 0, c: [ 1 ] } }
SendingTransaction { _requestor: '0xf29c07da3e712ccda8fac94a9af499774bdbeeaa',
  action: { [String: '3'] s: 1, e: 0, c: [ 3 ] } }
UserRegistered { _from: '0xf29c07da3e712ccda8fac94a9af499774bdbeeaa',
  _attr: '' }

Но есть проблема с аргументом _attr, который не отображается в UserRegistered. Это связано с ограничением Solidity при передаче аргументов переменного размера.

ответил max taldykin 11 Jam1000000amWed, 11 Jan 2017 07:14:34 +030017 2017, 07:14:34

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132