In meinem Smart Contract habe ich eine Funktion, die ein Ereignis am Ende seines Codes auslöst.
function sendTran(arguments) public {
*code*
emit Event(argument 1,argument 3,argument 3,argument 4);
}
In nodejs habe ich so eine API
router.post('/send', function (req, res) {
contractInstance.methods.sendTran(arguments).send({
*stuff*
}).on('transactionHash', function(hash){
console.log(hash);
}).on('error', console.error);
});
Wie kann ich die API so ändern, dass ich in res.send das von der Funktion sendTran ausgegebene Ereignis sehen kann?
Vielen Dank!
Die Protokolle sind in der Transaktionsquittung enthalten, aber Sie können die Transaktionsquittung erst nach dem Mining abrufen. Abhängig von vielen Faktoren (Netzüberlastung, Gaspreis) kann es einige Sekunden oder einige Stunden dauern, bis eine Transaktion abgebaut wird.
Aus diesem Grund würde ich nicht empfehlen, dafür einen synchronen HTTP-Aufruf zu verwenden. Eine gute API sollte ein Timeout haben und in Ihrem Fall können Sie nicht absolut sicher sein, dass Ihre Transaktion rechtzeitig abgebaut wird.
Wenn Sie dies jedoch dennoch tun möchten, können Sie den Transaktionsbeleg jede Sekunde ziehen, bis Sie ihn erhalten:
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;
}
Ich würde eher empfehlen, WebSocket zu verwenden, um die asynchrone Natur der Blockchain zwischen einem Client und einem Server zu handhaben.
logs: Array - Array of log objects, which this transaction generated.
], das die Ereignisse darstellt, die durch diese Transaktion ausgelöst werden. Jedes Protokoll kann analysiert werden, Sie erhalten den Ereignisnamen und jedes Argument.
gute Stimmung
res.send = hash
?Benutzer19510
res.send
, und was hat der Transaktions-Hash mit dem Ereignis zu tun, auf das OP versucht zuzugreifen?