Zeigen Sie ein Ereignis mit nodejs an

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!

Wie wäre es mit res.send = hash?
@goodvibration Deine Antwort ergibt keinen Sinn. Das würde die Funktion überschreiben res.send, und was hat der Transaktions-Hash mit dem Ereignis zu tun, auf das OP versucht zuzugreifen?

Antworten (1)

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.

Kann ich mit dieser Methode die Argumente des ausgegebenen Ereignisses sehen? Zum Beispiel, wenn ich Event ausgeben habe (msg.sender, Betrag, Text); im Smart Contract möchte ich, nach der Nutzung der API, die drei Argumente des Events „Event“ loggen...
Der Transaktionsbeleg enthält ein Feld namens "Protokolle" [ 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.