В документации и предлагаемых ссылках и этом вопросе упоминается, что события привязаны к методам и срабатывают при вызове метода (через транзакцию). Вот пример договора:
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:
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});
}
});
Из вашего примера кода события срабатывают правильно.
Вы можете использовать события на сервере, если вы запускаете NodeJs. Возможно, кто-то еще может скинуться с проблемами надежности.
Событие запускается, когда блок добывается. Итак, да, событие запускается после изменения состояния.
Примечание. Появляется новый шаблон — добавлять к событиям префикс Log. Так назови event LogDeposit(uint a);
.
Возвращаемый строковый объект:
{ "logIndex": 0, "индекс транзакции": 0, "transactionHash": "0xa1a1e96217d05ca3f305ea051104da6de62c0df479d680494cc3e4dc013a846d", "blockHash": "0x923ede06e8027f07d239980b3d1502397e81958882a06008676647ad62c18e9d", "номер_блока": 504, "адрес": "0x1c7dc63b49a32c4b6cbc9c1a0e816b574c00e2fa", "тип": "заминированный", "event": "Депозит", "аргументы": { "а": "1" } }
geth
они действительно срабатывают.
Ксавье Лепретр B9lab
Себи
Ксавье Лепретр B9lab
event
переменную. Однако, когда я попробовал ваш код с небольшим изменением для работы в Truffle, он сработал, как и ожидалось.Себи