Можно ли использовать события для реализации серверной функциональности?

В документации и предлагаемых ссылках и этом вопросе упоминается, что события привязаны к методам и срабатывают при вызове метода (через транзакцию). Вот пример договора:

contract ClientReceipt {
    event Deposit(
        address indexed _from,
        bytes32 indexed _id,
        uint _value
    );

    function deposit(bytes32 _id) {
        // Any call to this function (even deeply nested) can
        // be detected from the JavaScript API by filtering
        // for `Deposit` to be called.
        Deposit(msg.sender, _id, msg.value);
    }
}

в котором событие запускается каждый раз, когда вызывается метод Deposit() . Я попытался изменить типы аргументов и написал следующий упрощенный контракт:

contract ClientReceipt {
    event Deposit(
        uint256 a
    );

    function deposit(uint256 a) {
        // Any call to this function (even deeply nested) can
        // be detected from the JavaScript API by filtering
        // for `Deposit` to be called.
        Deposit(a);
    }
}

но я получаю сообщение об ошибке:

TypeError: Cannot read property 'event' of undefined

при развертывании и вызове метода (в browser-solidity ).

  • Почему событие не срабатывает должным образом?
  • Можно ли использовать прослушиватель в качестве сервера из Javascript каждый раз, когда метод вызывается из скрипта?
  • Когда событие срабатывает в функции, которая изменяет состояние функции, срабатывает ли оно после того, как состояние было изменено (соответствующая ему транзакция была добыта)?

Редактировать:

Слушатель событий Javascript:

var abi = /* abi as generated by the compiler */;
var ClientReceipt = web3.eth.contract(abi);
var clientReceipt = ClientReceipt.at(0x123 /* address */);

var event = clientReceipt.Deposit(function(error, result) {
    if (!error)
        console.log(result);
    else {
        // Based on the result call another method of the contract
        clientReceipt.callMethod({gas: 4700000});
    }
});
Можете ли вы добавить часть кода Javascript в свой пример кода?
Добавил. Проблема в том, что событие не срабатывает должным образом.
Странно то, что вы перезаписываете eventпеременную. Однако, когда я попробовал ваш код с небольшим изменением для работы в Truffle, он сработал, как и ожидалось.
Извините, я скопировал оба примера в фрагменты кода. Он работает так, как ожидалось, хотя результат, возвращаемый слушателями, плохо документирован.

Ответы (1)

Из вашего примера кода события срабатывают правильно.

Вы можете использовать события на сервере, если вы запускаете NodeJs. Возможно, кто-то еще может скинуться с проблемами надежности.

Событие запускается, когда блок добывается. Итак, да, событие запускается после изменения состояния.

Примечание. Появляется новый шаблон — добавлять к событиям префикс Log. Так назови event LogDeposit(uint a);.

Возвращаемый строковый объект:

{
    "logIndex": 0,
    "индекс транзакции": 0,
    "transactionHash": "0xa1a1e96217d05ca3f305ea051104da6de62c0df479d680494cc3e4dc013a846d",
    "blockHash": "0x923ede06e8027f07d239980b3d1502397e81958882a06008676647ad62c18e9d",
    "номер_блока": 504,
    "адрес": "0x1c7dc63b49a32c4b6cbc9c1a0e816b574c00e2fa",
    "тип": "заминированный",
    "event": "Депозит",
    "аргументы": {
        "а": "1"
    }
}
Они сделали; Я использовал надежность браузера, когда получил эти ошибки, но в частной тестовой сети gethони действительно срабатывают.