в моем смарт-контракте у меня есть функция, запускающая событие в конце своего кода.
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?
Большое спасибо!
Журналы включаются в квитанцию о транзакции , но вы можете получить квитанцию о транзакции только после ее майнинга. В зависимости от многих факторов (перегруженность сети, цена на газ) майнинг транзакции может занять от нескольких секунд до нескольких часов.
Вот почему я бы не рекомендовал использовать для этого синхронный 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 для обработки асинхронного характера цепочки блоков между клиентом и сервером.
logs: Array - Array of log objects, which this transaction generated.
], которые представляют собой события, инициированные этой транзакцией. Каждый журнал может быть проанализирован, вы получите имя события и каждый аргумент.
хорошая вибрация
res.send = hash
?пользователь19510
res.send
функцию, и какое отношение хэш транзакции имеет к событию, к которому OP пытается получить доступ?