Показать событие с помощью nodejs

в моем смарт-контракте у меня есть функция, запускающая событие в конце своего кода.

    function sendTran(arguments) public {
    *code*  
    emit Event(argument 1,argument 3,argument 3,argument 4);       
}

В nodejs у меня есть такой API

router.post('/send', function (req, res) {
  contractInstance.methods.sendTran(arguments).send({
    *stuff*  
}).on('transactionHash', function(hash){
  console.log(hash);
}).on('error', console.error);
});

Как я могу изменить API, чтобы я мог видеть в res.send событие, сгенерированное функцией sendTran?

Большое спасибо!

Как насчет res.send = hash?
@goodvibration Ваш ответ не имеет смысла. Это перезапишет res.sendфункцию, и какое отношение хэш транзакции имеет к событию, к которому OP пытается получить доступ?

Ответы (1)

Журналы включаются в квитанцию ​​о транзакции , но вы можете получить квитанцию ​​о транзакции только после ее майнинга. В зависимости от многих факторов (перегруженность сети, цена на газ) майнинг транзакции может занять от нескольких секунд до нескольких часов.

Вот почему я бы не рекомендовал использовать для этого синхронный HTTP-вызов. У хорошего API должен быть тайм-аут, и в вашем случае вы не можете быть абсолютно уверены, что ваша транзакция будет добыта вовремя.

Однако, если вы все еще хотите это сделать, вы можете получать квитанцию ​​о транзакции каждую секунду, пока не получите ее:

waitForReceipt(hash, 1000).then(function (transactionReceipt) {
    console.log(transactionReceipt)
});


function waitForReceipt(hash, millisecondsInterval) {
    var retryCount = 0;
    var retryCountLimit = 100;

    var promise = new Promise((resolve, reject) => {
        var timer = setInterval(function () {

            web3.eth.getTransactionReceipt(hash, function(err, rec) {
                if(err) {
                    console.log(err)
                    clearInterval(interval);
                    reject(err)
                }

                if(rec != null) {
                    clearInterval(timer);
                    resolve(rec);
                    return;
                }

                retryCount++;
                if (retryCount >= retryCountLimit) {
                    clearInterval(timer);
                    reject("retry count exceeded");
                }
            });

        }, millisecondsInterval);
    });

    return promise;
}

Я бы рекомендовал использовать WebSocket для обработки асинхронного характера цепочки блоков между клиентом и сервером.

Могу ли я с помощью этого метода увидеть аргументы сгенерированного события? Например, если у меня есть событие Emit (msg.sender, сумма, текст); в смарт-контракте я хотел бы зарегистрировать после использования API три аргумента события "Событие"...
Квитанция о транзакции включает поле под названием «журналы» [ logs: Array - Array of log objects, which this transaction generated.], которые представляют собой события, инициированные этой транзакцией. Каждый журнал может быть проанализирован, вы получите имя события и каждый аргумент.