Чтение результата функции, которая меняет состояние с помощью событий в Solidity

Я хотел бы получить результат функции, прослушивая ее испускаемое событие. Это две части кода моих контрактов

КОНТРАКТ 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
        }
    }
]

Поскольку я не могу получить возвращаемое значение функции, меняющей состояние, я использую события. Но... Каков наилучший способ получить отправленное событие после вызова функции?

Что получается при запуске кода web3?
квитанция.logs не определена
Я не самый сильный игрок с изменениями бета-версии 1.0, но я подозреваю, что концептуальная оплошность заключается в том, что существует два асинхронных процесса, а не один. Первый асинхронный запрос возвращает квитанцию. Вам нужно дождаться майнинга транзакции, а затем получить транзакцию (тоже асинхронную), и тогда вы увидите свои логи. Remix делает это очень удобным, вплоть до того, что его можно скрыть, поэтому его легко не заметить. Это был бы необходимый процесс в старом web3, и, вероятно, он остается таковым, если только они не объединили два шага в один.
Насколько я понял, обратных вызовов много. web3js.readthedocs.io/en/1.0/callbacks-promises-events.html . Согласно этой ссылке, «тогда» вызывается, когда транзакция добывается. Поэтому я считаю, что событие должно быть доступно.
Для события просмотра при вызове смарт-контракта; Я использую этот код, и он отлично работает ``` event.watch(function (err, response) { if(response.event == 'NewOwnerEvent') { self.setState({ tx_success: true, isLoading: false }) ; } }); ```

Ответы (3)

Когда вы отправляете транзакцию, вы получаете квитанцию ​​о транзакции.

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

Более высокие уровни в стеке запутывают эту проблему, но она есть всегда.

  1. Ремикс сделает это за вас. Он также использует повтор, чтобы вы могли видеть возвращаемые значения. Журналы и возвращаемые значения просто даны - две вещи, которые вы не найдете при создании собственного кода с помощью Web3.
  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

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

Я изменил контракт 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. Во всяком случае, теперь я могу взять возвращенное значение, это была моя первоначальная проблема.

Но я до сих пор не понимаю, почему иногда события попадали в логи, а иногда нет. В моем модульном тесте я успешно проверяю события внутри журналов.