Я хотел бы получить результат функции, прослушивая ее испускаемое событие. Это две части кода моих контрактов
КОНТРАКТ 1:
function createTradeableContract() public stopInEmergency returns(address subcontractAddr) {
TradeableContract tc = new TradeableContract(msg.sender);
contracts.push(tc);
return tc;
}
КОНТРАКТ 2:
function TradeableContract (address ownerAddr) public {
owner = ownerAddr;
NewOwnerEvent(0x0,owner);
}
Я использую бета-версию web3.0 1.0. Я написал этот код. Я не могу понять, почему я не вижу событие в журналах.
self.contractCreator.methods.createTradeableContract().send({from: selectedAccount})
.once('receipt', function(receipt){
console.log("receipt");
console.log(receipt);
console.log("eventos...");
console.log(receipt.logs); //it is undefined
})
.on('error', function(error){
console.log("erro");
console.log(error);
})
.then( receipt =>
{
console.log(receipt);
console.log("events...");
console.log(receipt.logs); //it is undefined
})
.catch (error => console.warn(error));
Если я использую Remix, я вижу событие в консоли (ниже).
[
{
"from": "0x8722aff990eda4d2d11915705076af5823f5f14c",
"topic": "0x09f86d61eb5d6904c1fa8e5f071f171ec90eccc6e0a7b61d563a7d693db815f6",
"event": "NewOwnerEvent",
"args": {
"0": "0x0000000000000000000000000000000000000000",
"1": "0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c",
"old": "0x0000000000000000000000000000000000000000",
"current": "0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c",
"length": 2
}
}
]
Поскольку я не могу получить возвращаемое значение функции, меняющей состояние, я использую события. Но... Каков наилучший способ получить отправленное событие после вызова функции?
Когда вы отправляете транзакцию, вы получаете квитанцию о транзакции.
Следующий шаг — дождаться майнинга транзакции, затем проверить транзакцию, и там вы увидите логи.
Более высокие уровни в стеке запутывают эту проблему, но она есть всегда.
test
сделает это за вас. Когда вы return myContract.someFunction()
возвращаете обещание добытой транзакции. Затем вы можете продолжить. then...
Опять же, это имеет тенденцию немного запотевать ветровое стекло, потому что эти удобные функции делают то, что мы должны делать для себя в других обстоятельствах.Взгляните на эту библиотеку, которая возвращает обещание добытой транзакции. Таким образом, можно создать краткий код, который 1) отправляет транзакцию и ждет квитанцию, затем 2) ждет, пока транзакция будет добыта, и возвращает транзакцию. https://gist.github.com/xavierlepretre/88682e871f4ad07be4534ae560692ee6
Ваш журнал будет там.
Эта библиотека предшествует Web3 Beta 1.0. Возможно, добрая душа отзовется и расскажет, как сделать рефакторинг. Вывод: вы не должны ожидать журналы транзакций в квитанциях. Это не противоречие, но ремикс и трюфельный тест могут сделать так.
Надеюсь, поможет.
Вы можете обратиться к этому документу, чтобы узнать, как посмотреть событие смарт-контракта.
https://github.com/ethereum/wiki/wiki/JavaScript-API#contract-events
Я изменил контракт 1, чтобы создать там событие.
функция createTradeableContract() public stopInEmergency возвращает (адрес subcontractAddr) { TradeableContract tc = new TradeableContract (msg.sender); контракты.push(tc); NewTradeableWallet(адрес(tc)); вернуть тк;
}
Теперь я вижу событие в квитанции.
{transactionHash: "0xcc1976e7e355f7a51ed20f0dd34e05e026dd7d165aa4a3ade457bb6a1c3ac94a", transactionIndex: 0, blockHash: "0x51a2fc3486ac8a5f8f48cb901d51048ba6d742b355e16f8ea2a385f02e8852b7", blockNumber: 21, gasUsed: 731488, …}
blockHash: "0x51a2fc3486ac8a5f8f48cb901d51048ba6d742b355e16f8ea2a385f02e8852b7"
blockNumber: 21
contractAddress: null
cumulativeGasUsed: 731488
events:
0:
{logIndex: 0, transactionIndex: 0, transactionHash: "0xcc1976e7e355f7a51ed20f0dd34e05e026dd7d165aa4a3ade457bb6a1c3ac94a", blockHash: "0x51a2fc3486ac8a5f8f48cb901d51048ba6d742b355e16f8ea2a385f02e8852b7", blockNumber: 21, …}
NewTradeableWallet:
address: "0x4E72770760c011647D4873f60A3CF6cDeA896CD8"
blockHash: "0x51a2fc3486ac8a5f8f48cb901d51048ba6d742b355e16f8ea2a385f02e8852b7"
blockNumber:21
event: "NewTradeableWallet"
id: "log_6608b960"
logIndex: 1
................
Обратите внимание, что событие не пришло в квитанцию. logs. Во всяком случае, теперь я могу взять возвращенное значение, это была моя первоначальная проблема.
Но я до сих пор не понимаю, почему иногда события попадали в логи, а иногда нет. В моем модульном тесте я успешно проверяю события внутри журналов.
Шейн Фонтейн
Сюзанна Мараньян Морено
Роб Хитченс
Сюзанна Мараньян Морено
Ха ДЖАНГ